当前位置: 首页>>技术教程>>正文


基于模式,批处理文件在终端重命名

, , ,

问题描述

我需要重命名以下内容:

file_001_loremipsum.png
file_002_dolor.png
file_003_sit.png
file_004_amet.png
file_105_randomness.png

upl_loremipsum.png
upl_dolor.png
upl_sit.png
upl_amet.png
upl_randomness.png

如何通过一行简单的终端命令实现这一目标?

最佳解决方案

以上示例的解决方案,使用rename

rename -v -n 's/file_\d{1,3}/upl/' file_*.png

用法:

rename [options] [Perl regex search/replace expression] [files]

来自man rename

   -v, --verbose
           Verbose: print names of files successfully renamed.
   -n, --no-act
           No Action: show what files would have been renamed.

重命名可以将正则表达式作为参数。

我们要看的是单引号'之间的内容。您可以将正则表达式分隔为/

式:s/(1)/(2)/,其中(1) =搜索模式,(2) =替换模式。

那么,familiarize youself with regex,并享受基于模式的批处理文件重命名!

次佳解决方案

这可以通过bash参数扩展的一点点魔力来完成!

for f in file_[0-9]*_*; do mv $f upl_${f#file_[0-9]*_}; done

file_[0-9]*_*; – 第一个模式用于通过’file_anynumber_’ ${f#file_[0-9]*_}开头的所有文件 – 第二个模式file_[0-9]*_用于参数扩展,它告诉bash从字符串的请求中删除’file_anynumber_’。

有关Parameter expansion的更多信息:

man bash

第三种解决方案

如果文件位于几个目录中,请在查找之后使用重命名:

find -iname file_*.png -type f -exec rename -n 's/file_[0-9]{3}(.*\.png)/upl$1/' {} \;

重命名后的-n是测试,删除它继续! – )

像这样,你关联查找和重命名权力。

就个人而言,我用它将源头.h重命名为.hpp

find -iname *.h -type f -exec rename 's/(.*\.)h/$1hpp/' {} \;

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/2211.html,未经允许,请勿转载。