【问题标题】:How can I batch move a prepended year to the end of a file name?如何将前面的年份批量移动到文件名的末尾?
【发布时间】:2012-08-13 00:32:42
【问题描述】:

我有一个文件列表(上千个),如下所示:

/path/2010 - filename.txt
/path/2011 - another file name.txt

始终遵循这种模式:#### - string.txt

我需要将它们更改为如下所示:

/path/filename (2010).txt
/path/another file name (2011).txt

如何使用 bash、shell、终端等快速完成此操作?

【问题讨论】:

    标签: regex bash shell unix rename


    【解决方案1】:

    试试rename 命令:

    rename -n 's/(.*) - (.*)(\.txt)/$2 ($1)$3/' *.txt
    

    -n(--no-act) 选项用于预览。
    删除 -n 以执行替换。

    【讨论】:

    • 射击,我的 Mac 没有重命名 (-bash: rename: command not found)。我可以用mv 做到这一点吗?
    • 如果*.txt 扩展为一个命令行的文件过多,find /path -name '*.txt' -print0 | xargs -0 rename -n ...
    • rename 是一个很小的 ​​perl 脚本。我认为你可以在 MAC 中安装它。
    • 喜欢重命名,尤其是-n部分
    【解决方案2】:

    未经测试。

    find /path -name '???? - *.txt' -print0 | while read -d ''; do
        [[ $REPLY =~ (.*)/(....)\ -\ (.*)\.txt$ ]] || continue
    
        path=${BASH_REMATCH[1]}
        year=${BASH_REMATCH[2]}
        str=${BASH_REMATCH[3]}
        echo mv "$REPLY" "$path/$str ($year).txt"
    done
    

    一旦生成的mv 命令看起来正确,就删除echo

    【讨论】:

    • 如何添加斜杠来转义路径和文件名中的空格?
    • (.*) 应该贪婪地匹配所有内容,直到最后的斜线、空格和所有内容。 '\ ' 正在转义文件名中的空格。我认为空格不应该有任何其他问题。
    • Doh,未转义的空格只出现在 echo 中。 Mv 工作得很好。谢谢。给你“答案”,因为它在没有另一个库的情况下工作。再次感谢。
    【解决方案3】:

    我更愿意将此添加为评论,但我还不允许这样做。

    我问了一个类似的问题,并在这里收到了许多有用的答案:

    https://unix.stackexchange.com/questions/37355/recursively-rename-subdirectories-that-match-a-regex

    也许其中一种解决方案可以根据您的需要进行调整。

    【讨论】:

      【解决方案4】:

      我知道你没有用zsh 标记它,但你确实说shell。无论如何,这是使用zsh 中的zmv 函数的方法:

      autoload zmv                      # It's not loaded by default
      zmv -nvw '* - *.*' '$2 ($1).$3'
      

      如果您对输出感到满意,请删除 -n

      -v 使zmv 变得冗长。 -w 隐含地将每个通配符组成一组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-11-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-07
        相关资源
        最近更新 更多