【问题标题】:how to change the extension of multiple files using bash script?如何使用 bash 脚本更改多个文件的扩展名?
【发布时间】: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'

希望对你有所帮助,谢谢

【问题讨论】:

    标签: bash batch-rename


    【解决方案1】:

    说明

    1. 对于递归,您需要 Bash >=4 并启用 **(即 globstar);
    2. 首先,我使用parameter expansion 删除字符串.txt,它必须锚定在文件名的末尾(%):
    3. #anchors the pattern(纯字或全局)到开头,
    4. % 将其锚定到末尾。
    5. 然后我追加新的扩展名.xml
    6. 文件名要格外小心,您应该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的输出,因为包含空格的文件名已损坏...
      猜你喜欢
      • 2016-06-29
      • 1970-01-01
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2021-06-17
      • 1970-01-01
      • 2023-04-01
      相关资源
      最近更新 更多