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

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


当前回答

使用rename命令的示例如下:

rename -n ’s/\.htm$/\.html/’ *.htm

-n表示它是测试运行,不会实际更改任何文件。它将向您显示删除-n后将重命名的文件列表。在上面的例子中,它将当前目录中的所有文件从扩展名为.htm的文件转换为.html。

如果上面测试运行的输出看起来没问题,那么你可以运行最终版本:

rename -v ’s/\.htm$/\.html/’ *.htm

-v是可选的,但是包含它是个好主意,因为它是你通过rename命令所做的更改的唯一记录,如下面的示例输出所示:

$ rename -v 's/\.htm$/\.html/' *.htm
3.htm renamed as 3.html
4.htm renamed as 4.html
5.htm renamed as 5.html

中间的棘手部分是使用正则表达式的Perl替换,如下所示:

rename -v ’s/\.htm$/\.html/’ *.htm

其他回答

有关更好的解决方案(只有bash功能,而不是外部调用),请参阅其他答案之一。


下面的操作会做,但不需要系统有重命名程序(尽管你经常在系统上有这个程序):

for file in *.html; do
    mv "$file" "$(basename "$file" .html).txt"
done

编辑:正如评论中指出的那样,这对于没有适当引用的空格的文件名(现在添加到上面)不起作用。当你只在你自己的文件中工作时,你知道文件名中没有空格,这是可以工作的,但是当你写一些可能在以后被重用的东西时,不要跳过适当的引用。

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

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

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

这正是你想要的。

这是我用来重命名。edge文件为。blade.php

for file in *.edge; do     mv "$file" "$(basename "$file" .edge).blade.php"; done

很有魅力。

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

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

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

autoload -U zmv

然后再试一次。

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