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

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


当前回答

如果使用bash,则不需要使用sed、basename、rename、expr等外部命令。

for file in *.html
do
  mv "$file" "${file%.html}.txt"
done

其他回答

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

这正是你想要的。

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

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

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

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

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

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

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

很好很简单!

find . -iname *.html  -exec mv {} "$(basename {} .html).text"  \;

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


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

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

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