我如何从终端对图像进行排序?

我如何从终端对图像进行排序?

我有很多带有时间戳的图像:

cloudcam-20130825T115716Z.jpg

在同一个文件夹中,我想创建一个以日期(20130825)命名的文件夹,并将所有图像移动到该文件夹​​中。

是否有捷径可寻?

答案1

您可以使用 for 循环......

  • 首先进行测试运行,以确保它列出了您需要的所有内容

    for i in cloudcam-20130825*; do echo $i; done
    
  • 移动图像

    for i in cloudcam-20130825; do mv $i 20130825; done
    

答案2

告诉我这是否有效(未经测试;)):

for f in `ls cloudcam-????????.jpg`; do
    name=`echo "$f"|sed 's/ -.*//'`
    datedir=`echo "$name"|cut -c 10-17`
    dir="DestinationDirectory/$datedir/$name"
    mkdir -p "$datedir"
    mv "$f" "$datedir"
done

.. 它应该复制所有以 cloudcam- 开头的 jpg,为文件名的第 10 到 17 位创建一个目录,创建目录并移动文件。因此,如果您有其他日期的图像,它会将这些图像放在另一个目录中。

保存并使用 chmod 775 使脚本可执行。

请首先在文件副本上尝试一下。

答案3

你可以使用简单的 shell glob 移动所有匹配的文件

$ mkdir 20130825
$ mv cloudcam-20130825*.jpg 20130825

只要文件数量不超过 1000 个,这种方法就可以奏效(在这种情况下,可能需要使用find -exec mv ... +或 来“批量”移动xargs

如果你有一堆不同的日期,并且你想动态解析文件名并根据需要创建目录,你可以这样做

for f in cloudcam-*.jpg; do d="${f:9:8}"; [[ ! -d "$d" ]] && mkdir "$d"; mv -t "$d" "$f"; done

这假设文件名与原始帖子中显示的完全一样,即日期戳yyyymmdd从字符#9开始 - 如果不是这种情况,那么可以进行更复杂的解析,例如使用 bash 构造${f#front}${f%%back}删除前导和尾随子字符串。

相关内容