3

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

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

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

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

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

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

4

4 回答 4

6

试试rename命令:

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

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

于 2012-08-16T15:53:11.497 回答
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命令看起来正确,请删除。

于 2012-08-16T16:01:28.907 回答
2

我知道你没有标记它,zsh但你确实说shell. 无论如何,这里是如何使用zmv函数来做到这一点zsh

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

-n当您对输出感到满意时删除。

-v使zmv冗长。-w隐式地使每个通配符组成一组。

于 2012-08-16T16:20:25.873 回答
1

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

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

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

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

于 2012-08-16T16:16:06.713 回答