【问题标题】:Rename multiple files with bash for loop, mv, and sed使用 bash for loop、mv 和 sed 重命名多个文件
【发布时间】:2014-06-08 23:46:21
【问题描述】:

我的目标是将格式为“img_MM-DD-YY_XX.jpg”的文件文件夹重命名为格式“newyears_YYYY-MM-DD_XXX.jpg”,方法是遍历每个文件名并使用 sed 执行基于字符的替换职位。不幸的是,我似乎无法让基于位置的交换工作。

例如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

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

【问题讨论】:

  • 使用awk 代替sed 可能会更好。
  • 你应该使用 zsh - zmv 'img_(??)-(??)-(??)_(??).jpg' 'newyears_20$3-$2-$1_0$4.jpg'

标签: bash sed rename


【解决方案1】:
$ 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/'

【讨论】:

    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 2011-08-06
      • 2013-06-12
      • 1970-01-01
      • 2021-05-26
      • 2020-10-08
      • 2010-11-19
      • 2012-05-01
      • 2012-12-07
      • 1970-01-01
      相关资源
      最近更新 更多