如何将文件的创建日期批量添加到文件名?

我已经生成了一系列延时图像,并按顺序将它们命名为{0000..9999}.jpg

这对于浏览整个集合并不是很好,因为当从给出的文件名中获取给定图像时更难判断。 我想重命名它们,以便它们的名称包含它们的创建日期,例如:

 0000.jpg → 20140815-142800-0000.jpg 0001.jpg → 20140815-142800-0001.jpg 0002.jpg → 20140815-142800-0002.jpg 

保留原始文件名元素非常重要,确切的日期格式并不重要,只要它的文件名安全且易于理解。 我上面的示例以有助于按日期排序的方式将其插入前面。

如果您需要文件的测试工具,以下将创建10个文件,其中创建时间递增:

 for i in {00..02}; do touch --date "2014-08-15 $i:$i:$i" 00$i.jpg; done 

您可以使用真实的Perl表达式rename

 $ rename 's/(\d+\.jpg)/use File::stat; sprintf("%s-%s", stat($&)->mtime, $1)/e' * -v 0000.jpg renamed as 1408057200-0000.jpg 0001.jpg renamed as 1408060861-0001.jpg 0002.jpg renamed as 1408064522-0002.jpg 

这使得文件具有自时间以来的时间。 寻找排序,穷人阅读。

这里唯一的问题是你需要匹配整个文件名(这样你就可以在替换中统计$& aka整个匹配)。 对于非常复杂的名字,这可能会让人感到厌烦。

我们可以在此基础上构建更常规的日期格式:

 $ rename 's/(\d+\.jpg)/use File::stat; use POSIX; sprintf("%s-%s", strftime("%Y%m%d-%H%M%S", localtime(stat($&)->mtime)), $1)/e' * -vn 0000.jpg renamed as 20140815-000000-0000.jpg 0001.jpg renamed as 20140815-010101-0001.jpg 0002.jpg renamed as 20140815-020202-0002.jpg 

基于bash的简单文件名(如示例):

 $ for f in *; do mv "$f" "$(date -d@$(stat --printf='%Y' "$f") +%Y%m%d%H%M%S)-$f"; done $ ls -l total 0 -rw-rw-r-- 1 oli oli 0 Aug 15 00:00 20140815000000-0000.jpg -rw-rw-r-- 1 oli oli 0 Aug 15 01:01 20140815010101-0001.jpg -rw-rw-r-- 1 oli oli 0 Aug 15 02:02 20140815020202-0002.jpg 

这是我改造的东西,所以我可以真正理解发生了什么。 谢谢。

 for file in *.log; do created=$(stat -f "%m" $file) dateHat=$(date -r $created "+%F" ) sizeBytes=$(stat -f "%z" $file) mv $file $dateHat"_size_"$sizeBytes"_"$file done