我想将目录中的文件重命名为顺序数字。根据文件的创建日期。
例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。
我想将目录中的文件重命名为顺序数字。根据文件的创建日期。
例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。
当前回答
一句话的美:
ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done
你可以用。png,。jpg等来改变。ext。
其他回答
尝试使用loop, let和printf填充:
a=1
for i in *.jpg; do
new=$(printf "%04d.jpg" "$a") #04 pad to length of 4
mv -i -- "$i" "$new"
let a=a+1
done
使用-i标志可以防止自动覆盖现有文件,而使用——可以防止mv将带破折号的文件名解释为选项。
我喜欢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查看如何执行)。
按时间排序,限制为jpg,前导零和一个基底名(以防你可能想要一个):
ls -t *.jpg | cat -n | \
while read n f; do mv "$f" "$(printf thumb_%04d.jpg $n)"; done
(都在一行上,不带\)
下面是另一个使用"rename"命令的解决方案:
find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'
再次使用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