【问题标题】:File renaming using regex使用正则表达式重命名文件
【发布时间】:2017-08-10 04:36:00
【问题描述】:

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

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 不是最好的选择。

【问题讨论】:

  • 你想在文件名中有空格吗?
  • @Inianyes 我想要一个空间

标签: macos sed grep xargs


【解决方案1】:

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

shopt -s nullglob
rename -n 's/.*_(....)(..)(..)_([0-9]+.*)/$1-$2-$3 $4/' *.jpg *.jpeg *.png

如果一切正常,请删除选项-n

【讨论】:

  • 看来需要安装Perl的rename
【解决方案2】:

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

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

【讨论】:

  • @AstroSharp:将命令中的yourFolder 替换为您拥有的文件夹,即基本上来自包含图像文件的基本文件夹。
  • 还有其他文件与指定的文件结构不匹配。那些应该单独留下。
  • 文件夹名称中有一堆_。它破坏了代码。
  • @AstroSharp:你可以尝试cd 进入文件夹并运行!检查我的更新!
  • 谢谢。试过了,但注意到文件夹中有其他文件破坏了它
【解决方案3】:

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

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

或者:

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

【讨论】:

    【解决方案4】:

    我假设您对 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
    

    【讨论】:

    • 运行第一个命令。有四个文件,如 IMG_*(等等):find: IMG_20160714_165051.jpg: unknown primary or operator
    • 似乎您在 find 命令中缺少连字符?在管道到 sed 命令之前,请确保您的 find 工作正常。您将波浪号 (~) 更改为您开始搜索的目录?
    • find ~ -type f -maxdepth 1 -name IMG*.jpg 使用此命令。你认为哪个连字符?
    • @AstroSharp 我正在使用 unix 查找,如果您不使用,则只需使用原始问题中的命令:“find *.jpg *.jpeg *.png”并通过管道传输到我的 sed 正则表达式。
    【解决方案5】:

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

    for file in *; do
      [[ $file =~ ^IMG_([0-9]{4})([0-9]{2})([0-9]{2})_(.+\.(jpg|jpeg|png))$ ]] || continue
      mv "$file" "${BASH_REMATCH[1]}-${BASH_REMATCH[2]}-${BASH_REMATCH[3]} ${BASH_REMATCH[4]}"
    done
    

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 2018-08-22
      • 2011-04-28
      • 1970-01-01
      • 2016-08-22
      • 2020-08-13
      • 2020-10-19
      • 2013-08-31
      相关资源
      最近更新 更多