我如何批量移动一个预先的年份到一个文件名的末尾?

我有一个文件列表(成千上万)像这样:

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

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

我需要改变他们看起来像这样:

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

我怎么能用bashshell,terminal等快速的做到这一点?

未经测试。

 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

尝试rename命令:

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

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

我宁愿添加这个作为评论,但我还没有被允许。

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

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

也许这些解决方案之一可以适应你的需要。

我知道你没有用zsh标记它,但你确实说了shell 。 无论如何,这里是如何使用zshzmv函数来完成的:

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

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

-v使zmv详细。 -w隐式地构成一组通配符。