Gnu*_*utt 205 bash rename batch-rename
我想将目录中的文件重命名为序列号.基于文件的创建日期.
例如,sadf.jpg
to 0001.jpg
,wrjr3.jpg
to 0002.jpg
等等,前导零的数量取决于文件的总量(如果不需要则不需要额外的零).
gau*_*teh 289
尝试使用循环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
Run Code Online (Sandbox Code Playgroud)
使用该-i
标志可防止自动覆盖现有文件.
小智 222
美丽在一条线上
ls -v | cat -n | while read n f; do mv -n "$f" "$n.ext"; done
Run Code Online (Sandbox Code Playgroud)
用所需的.png,.jpg或其他方式更改.ext.
Per*_*ero 60
我喜欢gauteh的简洁解决方案,但它有一个重要的缺点.在数千个文件上运行时,您可以获得"参数列表太长"消息(更多内容),其次,脚本可能会变得非常慢.就我而言,在大约36.000个文件上运行它,脚本移动了大约.每秒一件!我不确定为什么会这样,但我从同事那里得到的规则是" find
是你的朋友".
find -name '*.jpg' | # find jpegs
gawk 'BEGIN{ a=1 }{ printf "mv %s %04d.jpg\n", $0, a++ }' | # build mv command
bash # run that command
Run Code Online (Sandbox Code Playgroud)
为了计算项目和构建命令,使用了gawk.但请注意主要区别.默认情况下,find
搜索当前目录及其子目录中的文件,因此请确保仅在必要时限制对当前目录的搜索(用于man find
查看方式).
bei*_*ei2 28
在OSX上使用Pero的解决方案需要进行一些修改.我用了:
find . -name '*.jpg' \
| awk 'BEGIN{ a=0 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' \
| bash
Run Code Online (Sandbox Code Playgroud)
注意:反斜杠用于续行
编辑2015年7月20日:
纳入@klaustopher的反馈来引用命令的\"%s\"
参数mv
以支持带空格的文件名.
Rom*_*rov 26
使用"重命名"命令
rename -N 0001 -X 's/.*/$N/' *.jpg
Run Code Online (Sandbox Code Playgroud)
要么
rename -N 0001 's/.*/$N.jpg/' *.jpg
Run Code Online (Sandbox Code Playgroud)
Roy*_*rot 26
一个非常简单的bash one liner,它保留了原始扩展,添加了前导零,并且还在OSX中工作:
num=0; for i in *; do mv "$i" "$(printf '%04d' $num).${i#*.}"; ((num++)); done
Run Code Online (Sandbox Code Playgroud)
http://ubuntuforums.org/showthread.php?t=1355021的简化版本
Abd*_*ira 11
要在所有情况下工作,请为名称中包含空格的文件添加\"
find . -name '*.jpg' | gawk 'BEGIN{ a=1 }{ printf "mv \"%s\" %04d.jpg\n", $0, a++ }' | bash
Run Code Online (Sandbox Code Playgroud)
如果您rename
不支持-N
,可以执行以下操作:
ls -1 -c | xargs rename -n 's/.*/our $i; sprintf("%04d.jpg", $i++)/e'
Run Code Online (Sandbox Code Playgroud)
编辑要从给定的数字开始,您可以使用下面的(看起来有些丑陋)代码,只需将123替换为您想要的数字:
ls -1 -c | xargs rename -n 's/.*/our $i; if(!$i) { $i=123; } sprintf("%04d.jpg", $i++)/e'
Run Code Online (Sandbox Code Playgroud)
这将按创建时间顺序列出文件(最新的第一个,添加-r
到ls以反向排序),然后发送此文件列表以重命名.重命名使用正则表达式中的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.
Run Code Online (Sandbox Code Playgroud)
小智 7
find . | grep 'avi' | nl -nrz -w3 -v1 | while read n f; do mv "$f" "$n.avi"; done
Run Code Online (Sandbox Code Playgroud)
find .
将显示文件夹和子文件夹中的所有文件。
grep 'avi'
将过滤所有带有 avi 扩展名的文件。
nl -nrz -w3 -v1
将显示以 001 002 等开头的序列号,后跟文件名。
while read n f; do mv "$f" "$n.avi"; done
会将文件名更改为序列号。
在OSX上,从Homebrew安装重命名脚本:
brew install rename
Run Code Online (Sandbox Code Playgroud)
然后你可以轻松地做到非常荒谬:
rename -e 's/.*/$N.jpg/' *.jpg
Run Code Online (Sandbox Code Playgroud)
或者添加一个漂亮的前缀:
rename -e 's/.*/photo-$N.jpg/' *.jpg
Run Code Online (Sandbox Code Playgroud)