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

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


当前回答

我用。bashrc写了这段代码

alias find-ext='read -p "Path (dot for current): " p_path; read -p "Ext (unpunctured): " p_ext1; find $p_path -type f -name "*."$p_ext1'
alias rename-ext='read -p "Path (dot for current): " p_path; read -p "Ext (unpunctured): " p_ext1; read -p "Change by ext. (unpunctured): " p_ext2; echo -en "\nFound files:\n"; find $p_path -type f -name "*.$p_ext1"; find $p_path -type f -name "*.$p_ext1" -exec sh -c '\''mv "$1" "${1%.'\''$p_ext1'\''}.'\''$p_ext2'\''" '\'' _ {} \;; echo -en "\nChanged Files:\n"; find $p_path -type f -name "*.$p_ext2";'

在"/home/<user>/example-files"这样的文件夹中:

/home/<用户> /示例文件: 中 file2.txt file3.pdf file4.csv

命令的行为是这样的:

~$ find-text
Path (dot for current): example-files/
Ext (unpunctured): txt

example-files/file1.txt
example-files/file2.txt


~$ rename-text
Path (dot for current): ./example-files
Ext (unpunctured): txt
Change by ext. (unpunctured): mp3

Found files:
./example-files/file1.txt
./example-files/file1.txt

Changed Files:
./example-files/file1.mp3
./example-files/file1.mp3
~$

其他回答

使用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

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

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

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

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

在别人的网站抓取之后,我发现成千上万的文件都没有。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"

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

对于Ubuntu用户:

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

试试这个

rename .html .txt *.html 

用法:

rename [find] [replace_with] [criteria]