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

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


当前回答

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

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

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

其他回答

再次使用Pero的解决方案,只做了很少的修改,因为find将遍历目录树中的项目存储在目录条目中的顺序。在同一台机器上,这将(大部分)在不同的运行中保持一致,如果没有删除,则基本上是“文件/目录创建顺序”。

然而,在某些情况下,您需要获得某种逻辑顺序,例如按名称,这在本例中使用。

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

为了在所有情况下都能工作,在名称中有空格的文件中加上“\”

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

对我来说,这些答案的组合非常完美:

ls -v | gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | bash

ls -v帮助以正确的1 10 9:1 9 10的顺序排序,避免文件名扩展的问题jpg jpg jpeg gawk 'BEGIN{a=1}{printf "mv %s %04d.jpg\n", $0, a++}'以4个字符和前导零重新编号。通过避免mv,我不会意外地试图覆盖已经存在的任何东西,因为意外地有相同的数字。 bash执行

注意@xhienne所说的,将未知内容输送到bash是一种安全风险。但这不是我的情况,因为我使用我的扫描照片。

这个脚本将在Mac OS bash上按创建日期对文件进行排序。我用它来重命名视频。只需更改扩展名和名称的第一部分。

ls -trU *.mp4| awk 'BEGIN{ a=0 }{ printf "mv %s lecture_%03d.mp4\n", $0, a++ }' | bash

按时间排序,限制为jpg,前导零和一个基底名(以防你可能想要一个):

ls -t *.jpg | cat -n |                                           \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done

(都在一行上,不带\)