使用正则表达式重命名文件

时间:2017-03-18 17:25:13

标签: macos sed grep xargs

我在一个文件夹中有一堆文件。其中一些格式为:

IMG_YYYYMMDD_junk.ext

我想将这些文件重命名为

YYYY-MM-DD junk.ext

示例: IMG_20170214_3939233.jpg 变为 2017-02-14 3939233.jpg

到目前为止,我成功地过滤了我需要的文件:

找到* .jpg * .jpeg * .png | egrep'^ IMG_ [0-9] {1,8}'

我知道我需要使用sed但是我没有在我的正则表达式中指定和引用匹配组以进行进一步的文件名转换。我知道我可能不得不在管道中使用xarg,但到目前为止我还没有成功转换每个文件名只是为了打印出来。

也许,sed不是这里最好的选择。

5 个答案:

答案 0 :(得分:2)

使用Perl的独立重命名命令和bash的选项nullglob

rdbuf()

如果一切正常,请删除选项shopt -s nullglob rename -n 's/.*_(....)(..)(..)_([0-9]+.*)/$1-$2-$3 $4/' *.jpg *.jpeg *.png

答案 1 :(得分:1)

bash中带有 NO 外部工具的逻辑!

您可以从包含这些图像的文件夹中运行以下脚本。

#!/bin/bash

for file in *.{jpg,jpeg,png}; do      
    IFS="_" read -ra fileNameList <<<"$file"

    year="${fileNameList[1]:0:4}"
    month="${fileNameList[1]:4:2}"
    day="${fileNameList[1]:6:2}"

    targetFileName="${year}-${month}-${day} ${fileNameList[2]}"

    # Remove this line and uncomment the line with 'mv' if things look OK
    echo "$file" "$targetFileName"
    #mv -v "$file" "$targetFileName"
done

这个想法是在_上拆分文件名并将它们存储在数组中。然后解析数字中的各个数字,并从组合元素中形成最终名称。

答案 2 :(得分:1)

使用GNU Parallel,它看起来像这样:

find *.jpg *.jpeg *.png |
  parallel mv {} '{= s/IMG_(....)(..)(..)_/$1-$2-$3 / =}'

或者:

parallel mv {} '{= s/IMG_(....)(..)(..)_/$1-$2-$3 / =}' ::: *.jpg *.jpeg *.png

答案 3 :(得分:0)

我认为您对find命令并不感兴趣,但确定了sed正则表达式:

find ~ -type f -maxdepth 1 -name IMG*.jpg | sed -e 's/\(IMG_\)\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)_/\2-\3-\4 /g'

你的例子:

echo "IMG_20170214_3939233.jpg" | sed -e 's/\(IMG_\)\([0-9]\{4\}\)\([0-9]\{2\}\)\([0-9]\{2\}\)_/\2-\3-\4 /g'

输出:

2017-02-14 3939233.jpg

答案 4 :(得分:0)

主要是使用其正则表达式匹配运算符bash的{​​{1}}解决方案,该运算符支持可通过内置=~数组变量访问的捕获组:

"${BASH_REMATCH[@]}"