繁体   English   中英

使用bash重命名多个文件以进行循环,MV和sed

[英]Rename multiple files with bash for loop, mv, and sed

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

例如s/.\\{4\\}[0-9][0-9]/.\\{10\\}[0-9][0-9]/尝试将MM替换为YY

这是我的尝试(现在忽略_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

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

$ 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/'

这用awk很简单

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM