我制作了一系列延时图像,并按顺序命名{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
答案1
你可以使用rename
真正的 Perl 表达式
$ 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
这样文件就带有一个自纪元以来的时间。 find 用于排序,poor 用于读取。
这里唯一的问题是你需要匹配整个文件名(这样你才能$&
在替换中统计——也就是整个匹配)。如果名称非常复杂,这可能会有点累人。
我们可以在此基础上构建更加传统的日期格式:
$ 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
答案2
还有一些基于 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
答案3
这是我重新编写的,以便我真正了解发生了什么。谢谢。
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