如何重命名一堆文件的扩展名?

问题描述 投票:426回答:19

在一个目录中,我有一堆*.html文件。我想将它们全部重命名为*.txt

我怎样才能做到这一点?我使用bash shell。

bash rename file-rename
19个回答
344
投票

要获得更好的解决方案(仅使用bash功能,而不是外部调用),请参阅one of the other answers


以下内容可以并且不需要系统具有rename程序(尽管您最常在系统上使用此程序):

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

编辑:正如评论中所指出的,如果没有适当的引用(现在在上面添加),这对于包含空格的文件名不起作用。当你纯粹在自己的文件上工作时,你知道文件名中没有空格,这将有效但是无论何时你写下可以在以后重复使用的东西,都不要跳过正确的引用。


5
投票

这个问题明确提到了Bash,但如果你碰巧有ZSH可用,那很简单:

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

如果你得到zsh: command not found: zmv然后只需运行:

autoload -U zmv

然后再试一次。

感谢这个original article关于zmv的提示。


5
投票

这是我发现适用于OSX和Linux的最简单的解决方案,它也适用于git!

find . -name "*.js" -exec bash -c 'mv "$1" "${1%.js}".tsx' - '{}' \;

和git:

find . -name "*.js" -exec bash -c 'git mv "$1" "${1%.js}".tsx' - '{}' \;


4
投票

command mmv似乎在大量文件上非常有效地完成了这项任务(一秒钟内成千上万)。例如,要将所有.xml文件重命名为.html文件,请使用以下命令:

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

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

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


3
投票

试试这个

rename .html .txt *.html 

用法:

rename [find] [replace_with] [criteria]

3
投票

派对有点晚了。你可以用xargs做到这一点:

ls *.html | xargs -I {} sh -c 'mv $1 `basename $1 .html`.txt' - {}

或者,如果您的所有文件都在某个文件夹中

ls folder/*.html | xargs -I {} sh -c 'mv $1 folder/`basename $1 .html`.txt' - {}

2
投票

如果您更喜欢PERL,那么有一个简短的PERL脚本(由PERL的创建者Larry Wall编写)将完全符合您的要求:tips.webdesign10.com/files/rename.pl.txt。对于您的示例,以下应该可以解决问题

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

= )

(感谢@loretoparisi获取更新后的网址)


1
投票

不幸的是,做便携并不是微不足道的。你可能需要一些expr魔法。

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

一旦你开心它就能做你想做的事情,就去除回声。

编辑:对于这个特殊情况,basename可能更具可读性,尽管expr一般来说更灵活。


1
投票

这是一次修改多个扩展的好方法:

for fname in *.{mp4,avi}
do
   mv -v "$fname" "${fname%.???}.mkv"
done

注意:小心扩展大小要一样(???)


1
投票

好又简单!

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

0
投票

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

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

像魅力一样工作。


613
投票

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

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

0
投票

一行,没有循环:ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}

cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
cbongiorno@ip-172-31-26-242:~/pgsql$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
cbongiorno@ip-172-31-26-242:~/pgsql$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt
cbongiorno@ip-172-31-26-242:~/pgsql$ 

179
投票
rename 's/\.html$/\.txt/' *.html

完全符合你的要求。


88
投票

这对我来说在OSX上从.txt到.txt_bak

find . -name '*.txt' -exec sh -c 'mv "$0" "${0%.txt}.txt_bak"' {} \;

87
投票

你想使用rename

rename -S .html .txt *.html

这完全符合您的要求 - 它会将所有与.html匹配的文件的扩展名从.txt更改为*.html

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


33
投票

在Mac上......

  1. 如果你没有,请安装renamebrew install rename
  2. rename -S .html .txt *.html

15
投票

对于Ubuntu用户:

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

7
投票

以下是重命名命令的示例:

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

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

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

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

-v是可选的,但是包含它是个好主意,因为它是您将对重命名命令所做的更改的唯一记录,如下面的示例输出所示:

$ 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

5
投票

在其他人的网站抓取之后,我最终在一个广泛的子目录树中找到了数千个缺少.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}  \; 

分解(hammertime!):

-iname * .txt - 意味着只考虑已经以.txt结尾的文件

mv -iv“{}。{txt,html}” - 当find以{}作为文件名传递时,$ {filename%。*}提取其基本名称而没有任何扩展名,以形成mv的参数。 bash使用{txt,html}将其重写为两个参数,因此最终命令运行为:mv -iv "filename.txt" "filename.html"

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

© www.soinside.com 2019 - 2024. All rights reserved.