我有一个包含 1500 个文件的文件夹,我想通过终端或 shell 脚本自动重命名它们,如下所示:“prefix_number.extension”。
例子:cin_1.jpg,cin_2.png ...
答案1
尝试:
count=0; for f in *; do [ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"; done
或者,如果您希望将命令分布在多行中:
count=0
for f in *
do
[ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"
done
怎么运行的
count=0
这会将变量初始化
count
为零。for f in *; do
这将开始循环当前目录中的所有文件。
[ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"
[ -f "$f" ]
测试该文件是否$f
是常规文件(而不是目录)。如果
$f
是常规文件,则mv
运行 move ( ) 命令。-i
指示mv
不要在未经询问的情况下覆盖任何现有文件。"cin_$((++count)).${f##*.}"
是新文件的名称。cin_
是前缀。 返回递增后$((++count))
的值。是文件的扩展名。count
${f##*.}
$f
done
这标志着循环的结束。
例子
考虑包含以下三个文件的目录:
$ ls
alpha.jpg beta.png gamma.txt
让我们运行命令:
$ count=0; for f in *; do [ -f "$f" ] && mv -i "$f" "cin_$((++count)).${f##*.}"; done
运行我们的命令后,目录中的文件现在为:
$ ls
cin_1.jpg cin_2.png cin_3.txt
答案2
一句话rename
:
rename -n 's/.+\./our $i; sprintf("cin_%d.", 1+$i++)/e' *
这将匹配名称中带有点的每个文件(如果有多个,则匹配最后一个),并重命名该部分,直到点后面cin_
跟着一个递增的数字和一个点。使用标志,-n
它只会打印它将执行的操作,删除它以执行重命名。
示例运行
$ ls
a.jpg b.jpg d.png e.png
$ rename -n 's/.+\./our $i; sprintf("cin_%d.", 1+$i++)/e' *
rename(a.jpg, cin_1.jpg)
rename(b.jpg, cin_2.jpg)
rename(d.png, cin_3.png)
rename(e.png, cin_4.png)
$ rename 's/.+\./our $i; sprintf("cin_%d.", 1+$i++)/e' *
$ ls
cin_1.jpg cin_2.jpg cin_3.png cin_4.png