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

时间:2009-08-03 21:42:10

标签: bash rename file-rename

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

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

27 个答案:

答案 0 :(得分:614)

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

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

答案 1 :(得分:342)

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


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

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

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

答案 2 :(得分:179)

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

完全符合您的要求。

答案 3 :(得分:87)

您想使用rename

rename -S .html .txt *.html

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

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

答案 4 :(得分:87)

这适用于OSX上的.txt到.txt_bak

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

答案 5 :(得分:33)

在Mac上......

  1. 如果您还没有安装renamebrew install rename
  2. rename -S .html .txt *.html

答案 6 :(得分:15)

对于Ubuntu用户:

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

答案 7 :(得分: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

答案 8 :(得分: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}"    - 当查找传递{}作为文件名时,$ {filename%。*}会提取其基本名称而不带任何扩展名,以形成 mv 的参数。 bash 将{txt,html}重写为两个参数,以便最终命令运行为:mv -iv "filename.txt" "filename.html"

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

答案 9 :(得分:5)

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

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

如果你得到zsh: command not found: zmv,那么只需运行:

autoload -U zmv

然后再试一次。

感谢此original article提供关于zmv的提示。

答案 10 :(得分: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' - '{}' \;

答案 11 :(得分:4)

command mmv似乎可以在大量文件(数秒钟内)上非常有效地完成此任务。例如,要将所有.xml个文件重命名为.html个文件,请使用:

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

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

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

答案 12 :(得分:3)

试试这个

rename .html .txt *.html 

用法:

rename [find] [replace_with] [criteria]

答案 13 :(得分: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' - {}

答案 14 :(得分:2)

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

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

=)

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

答案 15 :(得分:1)

不幸的是,做便携并不是一件容易的事。你可能需要一些expr魔法。

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

一旦你满意,它就会删除回声。

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

答案 16 :(得分:1)

好简单!

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

答案 17 :(得分:1)

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

public static void main(String[] args) {
    try {
        Resources rs = new Resources();
        MyThread5 m1 = new MyThread5(rs, "Producer");
        MyThread5 m2 = new MyThread5(rs, "Consumer");
        m1.start();
        m2.start();

        m1.join();
        m2.join();
    } catch (InterruptedException ex) {
        Logger.getLogger(ProducerConsumerExample.class.getName()).log(Level.SEVERE, null, ex);
    }

}

注意:请注意扩展名的大小要相同(???)

答案 18 :(得分:0)

以下是我用来将.edge个文件重命名为.blade.php

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

像魅力一样。

答案 19 :(得分: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$ 

答案 20 :(得分:0)

您还可以在Bash中创建一个函数,将其添加到Report.samples之类的东西中,然后在任何需要的地方使用它。

.bashrc

用法:

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

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

答案 21 :(得分:0)

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

1)使用以下代码在当前目录下创建外壳脚本rename.sh

#!/bin/bash

for file in $(find . -name "*$1"); do
    mv "$file" "${file%$1}$2"
done

2)由./rename.sh .old .new运行 例如。 ./rename.sh .html .txt

干杯

答案 22 :(得分:0)

与之前的建议类似,这是我的做法:

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

我首先通过验证

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

答案 23 :(得分:0)

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

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

答案 24 :(得分:0)

我在我的 .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//example-files”文件夹中:

  • /home//example-files:
    • file1.txt
    • 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
~$

答案 25 :(得分:0)

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

重命名当前文件夹中的所有文件扩展名:

            <plugin>
                <groupId>com.lazerycode.jmeter</groupId>
                <artifactId>jmeter-maven-plugin</artifactId>
                <version>3.4.0</version>
                <executions>
                    <execution>
                        <id>configuration</id>
                        <goals>
                            <goal>configure</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>jmeter-tests</id>
                        <goals>
                            <goal>jmeter</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <jMeterProcessJVMSettings>
                        <arguments>
                            <argument>-Djavax.net.ssl.keyStore=${keyStore.file}</argument>
                            <argument>-Djavax.net.ssl.keyStorePassword=${keyStore.pass}<argument>
                        </arguments>
                    </jMeterProcessJVMSettings>
                        <testFilesIncluded>
                            <jMeterTestFile>${jmeter.project}</jMeterTestFile>
                        </testFilesIncluded>
                </configuration>
            </plugin>

更多用法示例here

答案 26 :(得分:0)

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

rename.ul -o -v [oldFileExtension] [newFileExtension] [搜索要应用的文件的表达式]

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

选项:

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

-v:详细

-n:试运行