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

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

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

393360 次浏览

你想要使用rename:

rename -S <old_extension> <new_extension> <files>


rename -S .html .txt *.html

这正是你想要的-它将所有匹配*.html的文件的扩展名从.html更改为.txt

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

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

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

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

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

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

这正是你想要的。

要获得更好的解决方案(只有bash功能,而不是外部调用),请参阅另一个答案


下面的代码可以且不需要系统有rename程序(尽管在系统中最常见的是这个程序):

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

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

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

for file in *.html
do
mv "$file" "${file%.html}.txt"
done
如果你更喜欢PERL,这里有一个简短的PERL脚本(最初由Larry Wall编写,PERL的创造者),它将完全完成你想要的: # EYZ0。< / p >

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

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

试试这个

rename .html .txt *.html

用法:

rename [find] [replace_with] [criteria]

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

分解(锤击时间!):

< br > < p > - iname * . txt -表示只考虑已经以.txt

结尾的文件

mv -iv "{}.{txt,html}" -当找到传递一个{}作为文件名,${filename%。*}提取它的基名,不带任何扩展名来形成参数mvbash接受{txt,html}将其重写为两个参数,因此最后的命令运行为

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

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

这为我工作在OSX从.txt到.txt_bak

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

对于Ubuntu用户:

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

有点晚了。你可以用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' - {}

在Mac上……

  1. 如果你还没有安装重命名: brew install rename
  2. # EYZ0

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

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

如果你得到zsh: command not found: zmv,然后简单地运行:

autoload -U zmv

然后再试一次。

感谢这个原文关于zmv的提示。

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

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

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

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

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

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

很有魅力。

这是我发现的在OSX和Linux上工作的最灵活的解决方案,它也可以很好地与git一起工作!

# EYZ0

对于git:

# EYZ0

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

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

注意:注意在扩展的大小是相同的(??)

好了,简单!

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

一行,没有循环:

ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}

例子:

$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.json  ac8453e2-0d82-4d43-b80e-205edb754700.json
$ ls -1 | xargs -L 1 -I {} bash -c 'mv $1 "${1%.*}.txt"' _ {}
$ ls
60acbc4d-3a75-4090-85ad-b7d027df8145.txt  ac8453e2-0d82-4d43-b80e-205edb754700.txt

你也可以在Bash中创建一个函数,将它添加到.bashrc或其他地方,然后在任何你想要的地方使用它。

change-ext() {
for file in *.$1; do mv "$file" "$(basename "$file" .$1).$2"; done
}

用法:

change-ext css scss

函数中的源代码:https://stackoverflow.com/a/1224786/6732111

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

  1. 在当前目录下创建shell脚本rename.sh,代码如下:

    #!/bin/bash
    
    
    for file in $(find . -name "*$1"); do
    mv "$file" "${file%$1}$2"
    done
    
  2. Run it by ./rename.sh .old .new.

    Eg. ./rename.sh .html .txt

类似于之前的建议,我是这样做的:

find . -name '*OldText*' -exec sh -c 'mv "$0" "${0/OldText/NewText}"' {} \;

我首先用

find . -name '*OldText*' -exec sh -c 'echo mv "$0" "${0/OldText/NewText}"' {} \;

这里有一个解决方案,使用AWK。确保文件存在于工作目录中。否则,cd到html文件所在的目录,然后执行以下命令:

for i in $(ls | grep .html); do j=$(echo $i | grep -oh "^\w*." | awk '{print $1"txt"}'); mv $i $j; done

我用。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 / & lt; user> /示例文件:
    • 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
~$

您可以使用用于批量重命名文件的工具,例如重命名

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

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

更多使用示例在这里

最简单的方法是使用rename.ul,它存在于大多数Linux发行版中

重命名。ul -o -v [oldFileExtension] [newFileExtension][搜索要应用的文件的表达式]

rename.ul -o -v .oldext .newext *.oldext

选项:

-o:不覆盖预先存在的. newnext

- v:详细

-n:演练

在Linux或window git bash或window的wsl中,尝试以下命令,只需一行代码就可以更改当前目录或子目录甚至其子目录中的每个文件的扩展名

find . -depth -name "*.html" -exec sh -c 'mv "$1" "${1%.html}.txt"' _ {} \;