使用bash for loop,mv和sed重命名多个文件

时间:2014-04-23 22:16:29

标签: bash sed rename

我的目标是通过迭代每个文件名并使用sed根据字符执行替换,将“img_MM-DD-YY_XX.jpg”形式的文件文件夹重命名为“newyears_YYYY-MM-DD_XXX.jpg”形式位置。不幸的是,我似乎无法让基于位置的互换工作。

e.g。 s/.\{4\}[0-9][0-9]/.\{10\}[0-9][0-9]/尝试用YY替换MM

这是我的尝试(暂时忽略了_XX部分):

for filename in images/*
do
newname=$(echo $filename | sed 's/.\{4\}[0-9][0-9]/.\{10\}[0-9][0-9]/;
            s/.\{7\}[0-9][0-9]/.\{4\}[0-9][0-9]/;
            s/.\{10\}[0-9][0-9]/.\{7\}[0-9][0-9]/;
            s/img_/newyears_20/')
mv $filename $newname
done

我有什么想法可以解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

$ echo 'img_11-22-14_XX.jpg' | sed -r 's/[^_]*_([0-9]{2})-([0-9]{2})-([0-9]{2})/newyears_20\3-\1-\2/'
newyears_2014-11-22_XX.jpg

以上查找包括第一个下划线后跟6位数日期的任何内容。它用newyears_替换初始部分,并将日期从mm-dd-yy重新格式化为20yy-mm-dd。

两位数的mm,dd或yy值与([0-9]{2})匹配。括号表示sed应捕获该值以供以后使用。替换的输出端是_20\3-\1-\2。这将恢复下划线并在年度前面添加20。这一年是第三个被捕获的值,因此它被表示为\3。同样,月份是第一个捕获的值,因此它表示为\1,而第二天则表示为\2

为了消除一些黑色斜杠,我使用-r选项来调用扩展的正则表达式。如果您使用的是Mac或其他非GNU系统,请使用sed -E代替sed -r。否则,请使用:

sed  's/[^_]*_\([0-9]\{2\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/newyears_20\3-\1-\2/'

答案 1 :(得分:0)

这与awk

很简单
echo "img_MM-DD-YY_XX.jpg"  | awk -F"[_-]" '{print "newyears_20"$4"-"$2"-"$3"_0"$5}'
newyears_20YY-MM-DD_0XX.jpg