我想将目录中的文件重命名为顺序数字。根据文件的创建日期。
例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。
我想将目录中的文件重命名为顺序数字。根据文件的创建日期。
例如,sadf.jpg到0001.jpg, wrjr3.jpg到0002.jpg等等,前导零的数量取决于文件的总数(如果不需要,不需要额外的零)。
当前回答
以下是对我有效的方法。 我已经使用重命名命令,这样如果任何文件包含空间的名称,那么mv命令不会混淆空间和实际文件。
Here i replaced spaces , ' ' in a file name with '_' for all jpg files
#! /bin/bash rename 'y/ /_/' *jpg #replacing spaces with _ let x=0; for i in *.jpg;do let x=(x+1) mv $i $x.jpg done
其他回答
在OSX上使用Pero的解决方案需要一些修改。我使用:
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
注意:反斜杠是用来换行的
2015年7月20日编辑: 合并@ klastopher的反馈来引用mv命令的“%s\”参数,以支持带空格的文件名。
一句话的美:
ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done
你可以用。png,。jpg等来改变。ext。
我花了3-4个小时来开发这个解决方案: https://www.cloudsavvyit.com/8254/how-to-bulk-rename-files-to-numeric-file-names-in-linux/
if [ ! -r _e -a ! -r _c ]; then echo 'pdf' > _e; echo 1 > _c ;find . -name "*.$(cat _e)" -print0 | xargs -0 -t -I{} bash -c 'mv -n "{}" $(cat _c).$(cat _e);echo $[ $(cat _c) + 1 ] > _c'; rm -f _e _c; fi
这适用于任何类型的文件名(空格,特殊字符),通过find和xargs使用正确的\0转义,如果你喜欢,你可以通过将echo 1增加到任何其他数字来设置开始文件命名偏移量。
在开始时设置扩展名(此处以pdf为例)。它也不会覆盖任何现有文件。
我喜欢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查看如何执行)。
此处的重命名命令包括-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.