如何使用 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 的“查找”更改类型文件的扩展名? [复制]