如何批量移动前一年到文件名的末尾?

时间:2012-08-16 15:44:56

标签: regex bash shell unix rename

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

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

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

我需要将它们更改为:

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

如何使用bash,shell,terminal等快速完成此操作?

4 个答案:

答案 0 :(得分:5)

尝试rename命令:

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

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

答案 1 :(得分:3)

未测试。

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

生成的echo命令看起来正确后,删除mv

答案 2 :(得分:2)

我知道您没有使用zsh对其进行标记,但您确实说过shell。无论如何,这里是如何使用zmv中的zsh函数执行此操作:

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

当您对输出感到满意时,请移除-n

-v使zmv详细。 -w隐式地为每个通配符创建一组。

答案 3 :(得分:1)

我更愿意将其添加为评论,但我还没有被允许。

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

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

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