编写一个简单的脚本,自动重命名一些文件。作为示例,我们希望将文件* 001.jpg重命名为用户定义的字符串+ 001.jpg(例如:MyVacation20110725_001.jpg)此脚本的用法是使数码相机照片具有一定意义的文件名。
我需要为此编写一个shell脚本。有人可以建议如何开始吗?
答案 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;