【问题标题】:Renaming files with Bash, removing prefix and suffix使用 Bash 重命名文件,删除前缀和后缀
【发布时间】:2012-08-15 09:28:41
【问题描述】:

我想用 bash 重命名一堆文件,转换这个文件模式:

prefix - name - suffix.txt

进入这个:

name.txt

为此,我编写了以下脚本:

find . -name "*.txt" | while read f
do
  mv "${f}" "${f/prefix - /}"
done

find . -name "*.txt" | while read f
do
  mv "${f}" "${f/ - suffix/}"
done

它有效,但我想使用单个循环执行重命名。有可能吗?

【问题讨论】:

  • 如果你安装了rename,试试这个:stackoverflow.com/questions/11990893/…
  • 我是Mac,我没有默认安装rename
  • 我正在使用 OSX,并且我已重命名为我可用。你确定它不存在吗?
  • @beth 是的,在我的 OSX 中仍然不可用。它一定是在更高版本上添加的(我使用的是 10.8.5),或者您可能在某个时候安装了它。

标签: bash shell file-rename


【解决方案1】:

如果您有权访问GNU sed,则可以使用一些正则表达式来执行以下操作:

for i in *.txt; do mv "$i" "$(echo $i | sed -r 's/([^-]*)\s-\s(.*)\s-\s([^-]*)\.txt/\2.txt/')"; done

【讨论】:

    【解决方案2】:

    另一种有趣的方法,使用正则表达式:

    regex='prefix - (.*) - suffix.txt'
    for f in *.txt; do
        [[ $f =~ $regex ]] && mv "$f" "${BASH_REMATCH[1]}.txt"
    done
    

    其实这里使用简单的模式'*.txt'有两个问题:

    1. 太宽泛了;您可能需要将正则表达式应用于许多不匹配的文件。
    2. 如果当前目录中有很多个文件,命令行可能会溢出。

    使用find 会使过程复杂化,但更正确:

    find . -maxdepth 1 -regex 'prefix - .* - suffix.txt' -print0 | \
      while read -d '' -r; do
       [[ $REPLY =~ $regex ]] && mv "$REPLY" "${BASH_REMATCH[1]}.txt"
      done
    

    【讨论】:

    • 我喜欢这个答案。只是一个评论:要使最后一部分起作用,它必须写为"${BASH_REMATCH[1]}.txt"。请修复它,我会接受这个答案
    【解决方案3】:

    你可以用这个:

    find . -name "*.txt" -print0 | awk -v RS="\0" -v ORS="\0" '{print $0;sub(/^prefix - /,""); sub(/ - suffix.txt$/,".txt"); print $0; }' | xargs -0 -n 2 mv
    

    可以更清楚地写成:

    find . -name "*.txt" -print0 |
    awk -v RS="\0" -v ORS="\0" '{
      print $0;
      sub(/^prefix - /,""); 
      sub(/ - suffix.txt$/,".txt"); 
      print $0;
    }' |
    xargs -0 -n 2 mv
    

    【讨论】:

      【解决方案4】:

      如果您安装了emacs。您可以使用dired 功能。

      bash:

      # open your dir with emacs
      emacs /path/to/your/dir
      

      emacs:

      • *%Enter\.txt$Enter 标记所有@ 987654327@ 文件。
      • %rEnter.*- \(.*\) -.*Enter@ 987654329@输入重命名。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-07-08
        • 2010-09-17
        • 2011-10-23
        • 2015-11-19
        • 2016-04-28
        • 1970-01-01
        • 2020-10-16
        相关资源
        最近更新 更多