在一个目录中,我有一些*.html文件。我想把它们都重命名为*.txt

我该怎么做呢?我使用bash shell。


当前回答

类似于之前的建议,我是这样做的:

find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;

我首先用

find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;

其他回答

命令mmv似乎对大量文件(每秒数万个)非常有效地完成这项任务。例如,要将所有.xml文件重命名为.html文件,使用以下命令:

mmv ";*.xml" "#1#2.html"

的;将匹配路径,*将匹配文件名,这些在替换名称中被称为#1和#2。

基于exec或管道的答案要么太慢,要么在大量文件上失败。

你想要使用rename:

rename -S <old_extension> <new_extension> <files>

rename -S .html .txt *.html

这正是你想要的-它将所有匹配*.html的文件的扩展名从.html更改为.txt。

注意:Greg Hewgill正确地指出这不是bash内置的;是一个单独的Linux命令。如果你只是需要Linux上的一些东西,这应该可以工作;如果你需要一些更跨平台的东西,那就看看其他的答案。

如果你更喜欢PERL,这里有一个简短的PERL脚本(最初由PERL的创造者Larry Wall编写),它将完全满足你的需求: tips.webdesign10.com/files/rename.pl.txt。

对于你的例子,下面的方法应该可以奏效:

rename.pl 's/html/txt/' *.html

这个问题明确提到了Bash,但如果你恰好有可用的ZSH,它是相当简单的:

zmv '(*).*' '$1.txt'

如果你得到zsh:命令没有找到:zmv,然后简单地运行:

autoload -U zmv

然后再试一次。

感谢这篇关于zmv的原创文章。

不幸的是,可移植并不是一件简单的事情。你可能需要一点魔法。

for file in *.html; do echo mv -- "$file" "$(expr "$file" : '\(.*\)\.html').txt"; done

一旦你满意了,就把回声移开,它会按你想的做。

Edit: basename对于这种特殊情况可能可读性更好一些,尽管expr通常更灵活。