我想将目录中的文件重命名为顺序数字。根据文件的创建日期。

例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。


当前回答

在OSX上使用Pero的解决方案需要一些修改。我使用:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

注意:反斜杠是用来换行的

2015年7月20日编辑: 合并@ klastopher的反馈来引用mv命令的“%s\”参数,以支持带空格的文件名。

其他回答

此处的重命名命令包括-n,用于预览重命名。要实际执行重命名,请删除-n

如果你的重命名不支持-N,你可以这样做:

ls -1 --color=never -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'

此处的重命名命令包括-n,用于预览重命名。要实际执行重命名,请删除-n

要从给定的数字开始,你可以使用下面的代码(看起来有点难看),只需将123替换为你想要的数字:

ls -1 --color=never  -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'

这将按创建时间列出文件(首先列出最新文件,在ls中添加-r以反向排序),然后将此文件列表发送给重命名。Rename使用regex中的perl代码来格式化和增加计数器。

但是,如果您正在处理带有EXIF信息的JPEG图像,我建议您使用exiftool

这来自exiftool文档中的“重命名示例”

   exiftool '-FileName<CreateDate' -d %Y%m%d_%H%M%S%%-c.%%e dir

   Rename all images in "dir" according to the "CreateDate" date and time, adding a copy number with leading '-' if the file already exists ("%-c"), and
   preserving the original file extension (%e).  Note the extra '%' necessary to escape the filename codes (%c and %e) in the date format string.
ls -1tr | rename -vn 's/.*/our $i;if(!$i){$i=1;} sprintf("%04d.jpg", $i++)/e'

重命名-vn -删除n为关闭测试模式

{$i=1;} -控制起始编号

"%04d.jpg" -控制计数零04并设置输出扩展名。jpg

一个非常简单的bash一行代码,它保留了原来的扩展名,增加了前导零,并且也适用于OSX:

num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done

简化版http://ubuntuforums.org/showthread.php?t=1355021

在OSX上使用Pero的解决方案需要一些修改。我使用:

find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash

注意:反斜杠是用来换行的

2015年7月20日编辑: 合并@ klastopher的反馈来引用mv命令的“%s\”参数,以支持带空格的文件名。

我喜欢gauteh的解决方案,因为它简单,但它有一个重要的缺点。当在数千个文件上运行时,您可能会得到“参数列表太长”的消息(更多关于此的信息),其次,脚本可能会变得非常慢。在我的例子中,在大约36.000个文件上运行它,脚本移动了大约。每秒一件!我不太确定为什么会发生这种情况,但我从同事那里得到的规则是“找到的才是朋友”。

find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command

为了计算项目和构建命令,使用了gawk。不过,请注意主要的区别。默认情况下,find搜索当前目录及其子目录中的文件,因此,如果需要,请确保仅限制在当前目录上搜索(使用man find查看如何执行)。