使用映射文件批处理文件重命名

使用映射文件批处理文件重命名

我有大量图像文件,例如:

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?!

相关内容