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

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


当前回答

要给一个文件夹中的6000个文件重新编号,您可以使用ACDsee程序的“重命名”选项。

要定义前缀,请使用以下格式:####"*"

然后设置起始号码,按重命名,程序将重命名所有6000个文件的顺序数字。

其他回答

此处的重命名命令包括-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.
a=1

for i in *.jpg; do
 mv -- "$i" "$a.jpg"
 a=`expr $a + 1`
done

再次使用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 

让我们假设我们在一个目录中有这些文件,按照创建的顺序列出,第一个是最古老的:

a.jpg
b.JPG
c.jpeg
d.tar.gz
e

然后ls -1cr输出上面的列表。然后你可以使用rename:

ls -1cr | xargs rename -n 's/^[^\.]*(\..*)?$/our $i; sprintf("%03d$1", $i++)/e'

的输出

rename(a.jpg, 000.jpg)
rename(b.JPG, 001.JPG)
rename(c.jpeg, 002.jpeg)
rename(d.tar.gz, 003.tar.gz)
Use of uninitialized value $1 in concatenation (.) or string at (eval 4) line 1.
rename(e, 004)

对于没有扩展名的文件,会显示警告“使用未初始化的值[…]”;你可以忽略它。

从rename命令中删除-n以实际应用重命名。

这个答案的灵感来自于Luke在2014年4月的回答。它忽略了Gnutt的要求,即根据文件总数设置前导零的数量。

下面是另一个使用"rename"命令的解决方案:

find -name 'access.log.*.gz' | sort -Vr | rename 's/(\d+)/$1+1/ge'