如何使用 bash 脚本更改多个文件的扩展名?

Posted

技术标签:

【中文标题】如何使用 bash 脚本更改多个文件的扩展名?【英文标题】:how to change the extension of multiple files using bash script? 【发布时间】:2013-03-27 14:51:28 【问题描述】:

我对 linux 的使用非常陌生,也许这是我第一次使用,所以我希望能提供一些详细的帮助。 我的服务器 (Linux) 上的多个目录中有 500 多个文件我想使用 bash 脚本将它们的扩展名更改为 .xml 我使用了很多代码,但其中没有一个可以使用我使用的一些代码:

for file in *.txt
do
mv $file $file/.txt/.xml
done 

for file in *.*
do
mv $file $file/.*/.xml
done

我不知道第二个是不是有效代码我试图更改txt扩展名,因为提示说没有这样的文件'.txt'

希望对你有所帮助,谢谢

【问题讨论】:

【参考方案1】:

说明

    对于递归,您需要 Bash >=4 并启用 **(即 globstar); 首先,我使用parameter expansion 删除字符串.txt,它必须锚定在文件名的末尾(%): #anchors the pattern(纯字或全局)到开头, % 将其锚定到末尾。 然后我追加新的扩展名.xml 文件名要格外小心,您应该always quote parameters expansion

代码

这应该在Bash 中执行(请注意,我只使用echo旧/新文件名,要实际重命名文件,请使用mv 而不是echo):

shopt -s globstar # enable ** globstar/recursivity
for i in **/*.txt; do
    [[ -d "$i" ]] && continue; # skip directories
    echo "$i" "$i/%.txt.xml";
done

【讨论】:

实际上它只是改变了 bash 文件的扩展名。我在这里迷路了,因为扩展名为 .sh 的 bash 文件不是 txt。其他文件不变 1.你有子目录吗? 2. 什么样的文件扩展名应该只替换.txt或其他? 我想更改一个目录(有子目录)中所有文件的扩展名,但大多数都是.txt 它不起作用,它只是回显一次 */.txt */.xml,如果我删除回显,不幸的是它什么也不做 @dfoverdx 谢谢,我会更新的。仅供参考,分号在脚本中不是强制性的,仅当您将其设为单行时。【参考方案2】:

如果是一两个子目录,可以使用重命名命令:

rename .txt .xml *.txt

这会将执行命令的目录中的所有 .txt 文件重命名为 .xml 文件。

【讨论】:

不要推荐rename,因为“rename(1) 可能是三个或四个不同程序之一——或者您的系统上可能没有它。使用 mv 的循环或查找表达式更安全。” 有关更多详细信息,请参阅:“如何将所有 *.foo 文件重命名为 *.bar,或将空格转换为下划线,或将大写文件名转换为小写?” mywiki.wooledge.org/BashFAQ/030【参考方案3】:

如果所有文件都在同一个目录中,则可以使用单个命令完成。比如你想把所有的jpg文件都转成png,到相关的目录位置然后使用命令

重命名 .jpg .png *

【讨论】:

糟糕的例子...使用重命名只是使用新扩展名重命名文件。它绝对不会“转换”任何东西。重命名后,您仍然会有 jpeg 格式的文件,但使用 png 扩展名错误地命名【参考方案4】:

我想将“file.txt”重命名为“file.jpg.txt”,用rename easy peezy:

重命名 's/.txt$/.jpg.txt/' *.txt

man rename 会告诉你你需要知道的一切。

一定要爱上 Linux,有一个工具可以满足一切 :-)

【讨论】:

【参考方案5】:

为目录路径传递命令行参数

#!/bin/sh
cd $1
names_1=`ls`
for file in $names_1
do
mv $file $file.jpg
done

【讨论】:

请不要解析ls的输出,因为包含空格的文件名已损坏...

以上是关于如何使用 bash 脚本更改多个文件的扩展名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Bash 的“查找”更改类型文件的扩展名? [复制]

错误 - 在Windows 7中使用“Git Bash Here”时,“文件扩展名.vbs没有脚本引擎”

如何在 bash 脚本中检查文件名的扩展名?

使用 shell 脚本更改文件的扩展名

Bash 脚本 - 如何设置创建新文件的组?

如何在bash中检索文件名或扩展名[重复]