我有一个装满图像的目录:

image0001.png
image0002.png
image0003.png
...


我想用一个内衬将它们重命名为(例如)。

0001.png
0002.png
0003.png
...


我该怎么做?

评论

这是最常见的Unix命令行常见问题之一,在该站点上我还找不到它,因此我们应该制作此社区Wiki吗?

我不明白为什么。这是一个具有可验证答案的特定问题。

如果您运行的是X,那么thunar的bulk-rename gui工具不会比thunar -B * .png容易得多。

#1 楼

如果您使用的是Bash或其他POSIX兼容的外壳程序:

for f in *.png; do
    mv -- "$f" "${f#image}"
done


评论


这是Mendel Coopers Advanced Bash脚本编写指南tldp.org/LDP/abs/html中显示的参数替换方法之一。

– W_Whalley
2010年8月25日下午14:15

@W_Whalley我强烈建议您避免使用该指南,而应使用Wooledge Bash指南。

–通配符
16年11月27日在17:55

@Wildcard:您为何建议避免使用ABS指南?

–克里斯蒂安·塞弗林(Christian Severin)
17-10-11在11:27

@ChristianSeverin提倡不良行为和彻底破坏代码。检查我的个人资料页面上的链接。

–通配符
17-10-11在16:20

如果您不知道如何使该示例适应不同的文件模式,则可能需要查看上述指南的“参数扩展”部分。

– lex82
18/12/28在21:50

#2 楼

在Debian及其衍生产品上,Perl的rename类似于sed的工作方式如下:

  rename -v 's/image//' *.png


还有来自renameutil-linux的工作原理是这样的:

  rename image '' *.png


评论


您真的应该解释这是一个可能必须安装的perl程序,并且它使用正则表达式作为参数。

–user601
2010年8月24日,0:30

啊,我没有意识到。当我识别出标准答案时,我会给予认可:)

–互联网人
10年8月24日,0:33

该重命名程序来自Perl示例发行版。 Debian和Ubuntu将其作为/ usr / bin / rename发行。其他Unix变体可能不提供它,或者可能提供完全不同的/ usr / bin / rename。

–吉尔斯'所以-不再是邪恶的'
2010年8月24日在7:17

某些版本的重命名采用“从”到“替换”模式:重命名[选项] <表达式> <替换> <文件> ...

–融化
15年12月29日在18:42



如果您使用的是基于Debian的系统,则使用sudo apt-get install named重命名,然后可以使用重命名命令。 sed用于文件名。

–ctrl-alt-delor
16年12月31日在17:20

#3 楼

zmv

zsh shell具有强大的批处理重命名命令,称为zmv

首先,您需要按以下方式启用zmv命令(这可以在~/.zshrc中使用)。

autoload zmv


基本语法是zmv PATTERN REPLACEMENT。该模式是一个shell glob表达式。模式的某些部分可以用括号括起来。替换文本可以包含等,以引用模式中的第N个括号组。例如:

zmv 'image(*.png)' ''


您还可以要求zsh自动定义等以匹配模式中的通配符:

zmv -w 'image*.png' '.png'


评论


sweeeeeeeeeeeeeeeeeetet。我应该学习zsh的另一个原因。

–ixtmixilix
2011年10月11日下午13:16

@ixtmixilix学到什么?刚开始使用它,并可能添加prezto(github.com/sorin-ionescu/prezto)以获得一些额外的功能。

–格里
2012年8月15日在8:09

确实很酷,正如zmv的工作人员所指出的,可以通过在以下名称中添加别名mmv ='noglob zmv -W'来进一步简化:mmv * .c.orig orig / *。c

– Bretsko
17年8月29日在16:10



启用zmv prezto要求取消注释〜/ .zpreztorc中的行,请执行以下操作#设置要加载的Zsh函数(man zshcontrib)。给zstyle':prezto:load'zfunction'zargs''zmv'

–user26947
19年4月1日在21:51

对于那些(像我一样)很少需要重命名文件的人,您无需在〜/ .zshrc中放入自动加载zmv:您也可以在需要zmv时运行它。

–尼克
20-09-18在8:08

#4 楼

我通常在此用例中使用简单易用的mmv(手册页)实用程序:

$ mmv "image*.png" "#1.png"


将执行您的任务。

#1目标模式将替换为与源模式中的通配符匹配的任何内容。这也适用于多个通配符,并且可以用于例如更改文件名各部分的顺序。您还可以轻松地执行更复杂的操作,例如将小写字母转换为大写字母。

请确保通过引用来保护模式免受shell攻击。

评论


感谢您指出此实用程序。我在Debian,Ubuntu和Cygwin存储库中找到它。我在手册页上遇到了麻烦,但是发现了一些网页以及这个堆栈溢出问题,可以帮助您解释如何使用它。 stackoverflow.com/questions/417916/how-to-do-a-mass-rename

– W_Whalley
2010年8月25日在16:12

谢谢,我在答案中添加了更多信息以使其更加清晰。

– Marcel Stimberg
10年8月25日在19:28

无法足够投票!它是如此简单和友好。可用于自制的OSX。

– Greg Dubicki
17年3月17日在9:33

#5 楼

POSIX sh for loop

使用sed重命名

for i in image*jpg
do 
  mv -v "$i" "$(echo "$i" | sed -e 's/^\.\/image//' - )"
done


#6 楼

qmv
qmv中的命令renameutils将打开一个编辑器,显示一个带有两个列的文件名列表,并用制表符分隔。每行显示一个文件名,两列相同。右列代表文件的新名称。
要进行更改,请在右侧编辑名称。在此示例中,:%s/...或可视块模式非常有用。
编辑器中的文件名
$ qmv *.png

在编辑器中:
image0001.png           image0001.png
image0002.png           image0002.png
image0003.png           image0003.png         
~                                             
~                                             
~                                             
~                                             
"/tmp/user/1000/qmvxWyVMs" 3L, 93C

在右栏中编辑名称:
(使用可视块模式从所有行中删除image前缀)
image0001.png           0001.png
image0002.png           0002.png
image0003.png           0003.png         
~                                             
~                                             
~                                             
~                                             
:wq

重命名日志:
image0001.png -> 0001.png
image0002.png -> 0002.png
image0003.png -> 0003.png


(例如Ubuntu:apt-get install renameutils

#7 楼

我喜欢Perl,所以:

perl -nlE '$old=$_; s/image//; qx(mv $old $_)'


还可以将相同的模式用于其他任务,例如将文件复制到另一个目录:

perl -nlE '$old=$_; s(image)(/path/to/new/dir/); qx(mv $old $_)'


评论


或者(更安全!):重命名($ old,$ _)

– reinierpost
2014年8月7日在11:57

#8 楼

递归

轻松递归选择image * png文件,并且假定不需要处理文件名中的换行符

find . -name "image*.png" | while read f; do mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; done


安全,可以处理空格,换行,反斜杠和其他任何内容:

find . -name "image*.png" | while IFS= read -r f; do 
   mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"; 
done


#9 楼

使用外壳支撑扩展:

for N in {0001..1000}; do mv "{image,}$N.png"; done


#10 楼

POSIX sh使用while循环

find命令读取名称。

find . -maxdepth 1 -type f -name 'image*png' | while IFS= read -r f; do
  mv -v "$f" "$(echo "$f" | sed -e 's/^\.\/image//' - )"
done


从文件读取名称

while IFS= read -r f; do mv -v "$f" "$(echo "$f"|sed -e 's/^\.\/image//' - )"; done < flist


#11 楼

尝试使用brename(https://github.com/shenwei356/brename),这是一个实用的跨平台命令行工具,可通过正则表达式(支持Windows,Linux和OS X)安全地批量重命名文件/目录。

@ patrickDurusau说:


Linux有多种批处理文件重命名选项,但是我没有看到brename的任何不足之处。


功能:



跨平台。支持Windows,Mac OS X和Linux。

安全。通过检查潜在的冲突和错误。

文件过滤。支持通过正则表达式包含和排除文件。
无需运行find ./ -name "*.html" -exec CMD之类的命令。

通过键值文件重命名具有相应值的子匹配。

重命名通过

递归重命名文件和目录。

支持空运行。

彩色输出。

命令:

$ brename -f .png -p image
[INFO] checking: [ ok ] 'image0001.png' -> '0001.png'
[INFO] checking: [ ok ] 'image0002.png' -> '0002.png'
[INFO] checking: [ ok ] 'image0003.png' -> '0003.png'
[INFO] 3 path(s) to be renamed
[INFO] renamed: 'image0001.png' -> '0001.png'
[INFO] renamed: 'image0002.png' -> '0002.png'
[INFO] renamed: 'image0003.png' -> '0003.png'
[INFO] 3 path(s) renamed


#12 楼

对于Windows和linux,此Perl脚本可以执行;在这种情况下:

$ rnm -l 's/^image//' '*.png'


该脚本可以在目录下递归运行,甚至可以对所有目录进行计数:

$ rnm -r 's/^/$counter./' '/\.png$/'


在Windows和Linux中,UTF-8字符也都得到正确处理。

#13 楼

您可以使用此工具:rnm(网页)

对于您的情况,命令为:

rnm -rs '/^image//' *.png


您可以找到更多示例/此处的文档。

#14 楼

ls * png |同时读-r f;做f2 =“`echo $ f | sed -e's / image //'`”; mv $ f $ f2;完成

评论


某事不正确:“ MV:'image0001.png'之后缺少目标文件操作数”

–互联网人
2010年8月24日,0:06

您的代码有很多问题。解析ls的输出只会带来麻烦。 read应该读为-r。所有变量替换都应在双引号内。

–吉尔斯'所以-不再是邪恶的'
2010年8月24日,0:20

您可以更有效地编写* png中的f;做f2 =“ $(echo” $ f“ | sed -e's / image //')”; mv“ $ f”“ $ f2”;完成。解析ls既不是必需的,也不是一个好主意。

– kojiro
2014年2月10日下午4:24