我有大量图像文件,例如:
a.png, b.png, c.png, etc
如果我有一个文件,其中包含文件名到数字的映射,如下所示(忽略格式,它可以是任何内容):
a=>1
b=>2
c=>3
...
有没有简单的方法可以使用映射文件批量重命名所有文件:
1.png, 2.png, 3.png, etc
我正在寻找 unix/linux 命令。我知道我可以编写一个非常简单的脚本,但只是好奇是否还有其他技术。
谢谢
答案1
没有一个命令一切;这就是拥有可编写脚本的 shell 的意义所在。
while read -r old new; do
mv "$old.png" "$new.png"
done < map.txt
答案2
如果没有 sed,您可以在 bash 中进行如下替换:
for line in $(< patterns) ; do echo "Pattern: " $line " char: " ${line/=>*/} " nr: " ${line/*=>/}; done
(“模式”将是 a=>1 等的文件),这会导致:
for line in $(< patterns) ; do
c=${line/=>*/}
n=${line/*=>/}
mv $c.png $n.png
done
bash 的联机帮助页在“字符串替换”下列出了这个选项和其他有趣的选项。
也许 perlsrename
也是一个有趣的选择。它允许使用模式进行大规模重命名,例如
rename 's/^a/1/' a*png
在 ubuntu 上,它附带了 perl 软件包,afaik。
答案3
这是 perl 的一种方式:
cat mapfile | perl -e 'my$h={eval join(",",<>)};while (($k,$v)=each%$h){`mv $k.png $v.png`}'
第二次尝试:
perl -nle '(@a=map{s/^\s+//;s/\s+$//;s/'/\\'/g;$_}split/\s*=>\s*/,$_,2)and`mv \'$a[0].png\' \'$a[1].png\'`'
适用于:
Someone's $tupid file name => renamed by "simple" script?!