我所拥有的文件(几千条)这样的列表:
/path/2010 - filename.txt
/path/2011 - another file name.txt
始终遵循这个模式: #### - string.txt
我需要改变他们看起来像这样:
/path/filename (2010).txt
/path/another file name (2011).txt
我如何使用bash,外壳,终端等迅速做到这一点?
我所拥有的文件(几千条)这样的列表:
/path/2010 - filename.txt
/path/2011 - another file name.txt
始终遵循这个模式: #### - string.txt
我需要改变他们看起来像这样:
/path/filename (2010).txt
/path/another file name (2011).txt
我如何使用bash,外壳,终端等迅速做到这一点?
未经测试。
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
命令看的权利。
尝试rename
命令:
rename -n 's/(.*) - (.*)(\.txt)/$2 ($1)$3/' *.txt
-n
(--no-ACT)选项进行预览。
除去-n
来执行替换。
我知道你没有带标记它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
也许这些解决方案中的一个可以调整,以适应您的需求。