通过使用shell脚本替换文件名中的特定模式来重命名多个文件

时间:2011-07-27 06:38:51

标签: shell

  

编写一个简单的脚本,自动重命名一些文件。作为示例,我们希望将文件* 001.jpg重命名为用户定义的字符串+ 001.jpg(例如:MyVacation20110725_001.jpg)此脚本的用法是使数码相机照片具有一定意义的文件名。

我需要为此编写一个shell脚本。有人可以建议如何开始吗?

8 个答案:

答案 0 :(得分:180)

帮助您开始行动的一个例子。

for f in *.jpg; do mv "$f" "$(echo "$f" | sed s/IMG/VACATION/)"; done

在此示例中,我假设您的所有图像文件都以“IMG”开头,并且您希望将“IMG”替换为“VACATION”。

shell会自动将*.jpg评估为所有匹配的文件。

mv的第二个参数(文件的新名称)是sed命令的输出,它将“IMG”替换为“VACATION”。

如果您的文件名包含多个连续空格,请特别注意"$f"符号。你需要双引号来保留这些空格。

答案 1 :(得分:145)

您可以使用重命名实用程序按模式重命名多个文件。例如,以下命令将字符串MyVacation2011_添加到具有jpg扩展名的所有文件。

rename 's/^/MyVacation2011_/g' *.jpg

rename <pattern> <replacement> <file-list>

答案 2 :(得分:25)

for file in *.jpg ; do mv $file ${file//IMG/myVacation} ; done

再次假设您的所有图像文件都包含字符串“IMG”,并且您想要将“IMG”替换为“myVacation”。

使用bash,您可以使用parameter expansion直接转换字符串。

示例:如果文件是IMG_327.jpg,则mv命令将像执行mv IMG_327.jpg myVacation_327.jpg一样执行。对于匹配*.jpg的目录中的每个文件,都将执行此操作。

IMG_001.jpg - &gt; myVacation_001.jpg
IMG_002.jpg - &gt; myVacation_002.jpg
IMG_1023.jpg - &gt; myVacation_1023.jpg
诸如此类...

答案 3 :(得分:16)

这个例子,我假设您的所有图像文件都以“IMG”开头,并且您希望将“IMG”替换为“VACATION”

解决方案:首先确定所有jpg文件,然后替换关键字

find . -name '*jpg' -exec bash -c 'echo mv $0 ${0/IMG/VACATION}' {} \; 

答案 4 :(得分:2)

另一种选择是:

for i in *001.jpg
do
  echo "mv $i yourstring${i#*001.jpg}"
done
正确地删除echo

#的参数替换将仅保留最后一部分,因此您可以更改其名称。

答案 5 :(得分:1)

你可以试试这个:

for file in *.jpg;
do
  mv $file $somestring_${file:((-7))}
done

您可以在man bash中看到“参数扩展”以更好地理解上述内容。

答案 6 :(得分:1)

find . -type f | 
sed -n "s/\(.*\)factory\.py$/& \1service\.py/p" | 
xargs -p -n 2 mv

例如,将重命名cwd中名称以“factory.py”结尾的所有文件替换为以“service.py”结尾的名称

说明:

1)在sed cmd中,-n标志将在应用s ///命令后抑制回显输入的正常行为,并且s ///上的p选项将强制写入输出(如果替换)是。因为sub只会在匹配时生成,所以sed只会输出以“factory.py”结尾的文件

2)在s ///替换字符串中,我们使用“&amp;”将整个匹配字符串(后跟空格字符)插入到替换字符串中。因此,我们的RE与整个文件名匹配至关重要。在space char之后,我们使用“\ 1service.py”来插入我们在“factory.py”之前吞咽的字符串,然后是“service.py”,替换它。因此,对于更复杂的转换,您必须将args更改为s ///(仍然匹配整个文件名)

示例输出:

foo_factory.py foo_service.py
bar_factory.py bar_service.py

3)我们使用xargs和-n 2一次消耗sed 2分隔字符串的输出,将它们传递给mv(我还将-p选项放在那里,以便在运行时感觉安全)。瞧。

答案 7 :(得分:0)

无法对Susam Pal的答案发表评论,但如果你正在处理空格,我会用引号括起来:

for f in *.jpg; do mv "$f" "`echo $f | sed s/\ /\-/g`"; done;