我有一个文件列表(数千个),如下所示:
/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等快速完成此操作?
答案 0 :(得分:5)
答案 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
也许其中一种解决方案可以根据您的需求进行调整。