Regex 如何将预先指定的年份批量移动到文件名的末尾?
我有一个文件列表(数千个),如下所示:Regex 如何将预先指定的年份批量移动到文件名的末尾?,regex,bash,shell,unix,rename,Regex,Bash,Shell,Unix,Rename,我有一个文件列表(数千个),如下所示: /path/2010 - filename.txt /path/2011 - another file name.txt /path/filename (2010).txt /path/another file name (2011).txt 始终遵循此模式:####-string.txt 我需要把它们改成这样: /path/2010 - filename.txt /path/2011 - another file name.txt /path/fi
/path/2010 - filename.txt
/path/2011 - another file name.txt
/path/filename (2010).txt
/path/another file name (2011).txt
始终遵循此模式:####-string.txt
我需要把它们改成这样:
/path/2010 - filename.txt
/path/2011 - another file name.txt
/path/filename (2010).txt
/path/another file name (2011).txt
如何使用bash、shell、terminal等快速执行此操作?Try命令:
-n
(-no-act)选项用于预览。删除
-n
以执行替换。未测试
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
。我更愿意将其作为注释添加,但目前还不允许添加
我问了一个类似的问题,并在这里得到了许多有用的答案:
也许其中一种解决方案可以根据您的需要进行调整。我知道您没有用
zsh
标记它,但您确实说了shell
。总之,下面介绍了如何使用zsh
中的zmv
函数:
autoload zmv # It's not loaded by default
zmv -nvw '* - *.*' '$2 ($1).$3'
如果您对输出满意,请删除-n
-v
使zmv
冗长-w
隐式生成一组通配符。拍摄,我的Mac没有重命名(-bash:rename:command not found
)。我可以用mv
来实现这一点吗?如果*.txt
为一个命令行扩展了太多文件,find/path-name'*.txt'-print0 | xargs-0 rename-n…
rename
是一个很小的perl脚本。我想你可以在MAC中安装它。Love rename,特别是-n
部分我如何添加斜杠来转义路径和文件名中的空格?(*)应该贪婪地匹配所有内容,直到最后的斜杠、空格和全部。“\”转义文件名中的空格是否正确。我认为空间不应该有任何其他的问题。哦,没有景观的空间只出现在echo中。Mv工作得很好。谢谢给你“答案”,因为它在没有其他库的情况下工作。再次感谢。