我有很多带有时间戳的图像:
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}
删除前导和尾随子字符串。