image0001.png
image0002.png
image0003.png
...
我想用一个内衬将它们重命名为(例如)。
0001.png
0002.png
0003.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
还有来自
rename
的util-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 楼
zmvzsh 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 楼
qmvqmv
中的命令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
评论
这是最常见的Unix命令行常见问题之一,在该站点上我还找不到它,因此我们应该制作此社区Wiki吗?我不明白为什么。这是一个具有可验证答案的特定问题。
如果您运行的是X,那么thunar的bulk-rename gui工具不会比thunar -B * .png容易得多。