我有一个文件列表(数千个),如下所示:
/path/2010 - filename.txt
/path/2011 - another file name.txt
始终遵循这种模式:#### - string.txt
我需要将它们更改为如下所示:
/path/filename (2010).txt
/path/another file name (2011).txt
如何使用 bash、shell、终端等快速完成此操作?
未经测试。
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
命令看起来正确,请删除。
我知道你没有标记它,zsh
但你确实说shell
. 无论如何,这里是如何使用zmv
函数来做到这一点zsh
:
autoload zmv # It's not loaded by default
zmv -nvw '* - *.*' '$2 ($1).$3'
-n
当您对输出感到满意时删除。
-v
使zmv
冗长。-w
隐式地使每个通配符组成一组。
我更愿意将此添加为评论,但我还不允许这样做。
我问了一个类似的问题,并在这里收到了许多有用的答案:
https://unix.stackexchange.com/questions/37355/recursively-rename-subdirectories-that-match-a-regex
也许其中一种解决方案可以根据您的需要进行调整。