我正在尝试批量重命名 shell 中的一堆文件,尽管互联网上有大量有关它的材料,但我似乎无法找到适合我的具体情况的解决方案。
我有一堆文件(看起来是)“timestamp-id”:
abc_128390.png
abc_138493.png
abc_159084.png
...
我想换一个柜台:
abc_001.png
abc_002.png
abc_003.png
...
我(很多)天真的方法是这样的:
mv abc_*.png abc_{001..123}.png
另外,我无法找到一种方法让它与for
循环一起工作。
不幸的是,FWIWrename
在此特定系统上不可用。
任何建议将不胜感激!
答案1
我想不出以更聪明的方式处理递增计数器的解决方案,但这应该可行:
i=0
for fi in abc_??????.png; do
mv "$fi" abc_$i.png
i=$((i+1))
done
它应该可以安全使用,abc_*.png
因为它在第一个执行之前就已展开mv
,但非常具体可能会很有用,因为您只需要末尾带有六个字符时间戳的文件。
答案2
使用rename
实用程序作为 Perl 包的一部分,您可以执行以下操作:
rename -n 'our $i; s/_.*/sprintf("_%03d.png", $i++)/e' *.png
注意:-n
用于试运行,将其删除以重命名应用到文件。
答案3
和zsh
:
typeset -A count
incr='++count[$1/$2]'
(zmv -n '([^0-9]##)<->(*)(#qn)' '$1${(l:3::0:)$((incr))}$2')
高兴的时候去掉-n
。
incr
(注意使用变量的额外步骤避免ACE漏洞)
例子:
$ ls
a1b.png abc_128390.png abc_159084.png x12y.png
a2b.png abc_138493.png a.png x2y.png
$ typeset -A count
$ incr='++count[$1/$2]'
$ (zmv -n '([^0-9]##)<->(*)(#qn)' '$1${(l:3::0:)$((incr))}$2')
mv -- a1b.png a001b.png
mv -- a2b.png a002b.png
mv -- abc_128390.png abc_001.png
mv -- abc_138493.png abc_002.png
mv -- abc_159084.png abc_003.png
mv -- x2y.png x001y.png
mv -- x12y.png x002y.png
答案4
您可以使用 cut 来剪切文件名的一部分,例如,如果您想重命名文件,例如
"1 first.jpg"
"2 second.jpg"
...
到
"10 first.jpg"
"20 second.jpg"
...
您可以使用
for i in *jpg; do
mv -iv "$i" "$(echo "$i"|cut -d\ -f1)0 $(echo "$i"|cut -d\ -f2-99)";
done