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

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


当前回答

在Mac上……

如果你没有安装rename: brew Install rename 重命名-S .html .txt *.html

其他回答

在Mac上……

如果你没有安装rename: brew Install rename 重命名-S .html .txt *.html

在别人的网站抓取之后,我发现成千上万的文件都没有。html扩展名,在一大堆子目录中。

要一次性重命名它们,除了已经有.html扩展名的文件(大多数文件根本没有扩展名),这对我来说很管用:

cd wwwroot
find . -xtype f \! -iname *.html   -exec mv -iv "{}"  "{}.html"  \;  # batch rename files to append .html suffix IF MISSING

在OP的情况下,我可能会稍微修改一下,只重命名*.txt文件,如下所示:

find . -xtype f  -iname *.txt   -exec filename="{}"  mv -iv ${filename%.*}.{txt,html}  \; 

分解(锤击时间!):

- iname * . txt -表示只考虑已经以.txt结尾的文件

Mv -iv "{}.{txt,html}" -当find传递一个{}作为文件名时,${filename%。*}提取它的basename,没有任何扩展,以形成mv的参数。Bash将{txt,html}重写为两个参数,因此最后的命令运行为:mv -iv "filename.txt" "filename.html"

修复需要:处理文件名中的空格

重命名当前目录和子目录下所有文件的扩展名,不需要任何其他包(仅使用shell脚本):

在当前目录下创建shell脚本rename.sh,代码如下: #!/bin/bash 在$(查找。- name“* 1美元”);做 Mv "$file" "${file%$1}$2" 完成 通过./rename.sh .old .new运行它。 例如:./rename.sh .html .txt

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

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

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

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

你可以使用一个专为批量重命名文件而设计的工具,例如renamer。

重命名当前文件夹下的所有文件扩展名。

$ renamer --find ".html" --replace ".txt" --dry-run * 

这里有更多的用法示例。