在Bash中递归更改文件扩展名

时间:2014-02-24 10:45:36

标签: linux bash shell sh

我想递归遍历目录并更改某个扩展名的所有文件的扩展名,例如.t1.t2。执行此操作的bash命令是什么?

6 个答案:

答案 0 :(得分:142)

如果您有重命名,请使用:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' \;

如果无法重命名,请使用:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \;

答案 1 :(得分:8)

如果您的bash版本支持globstar选项(版本4或更高版本):

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 

答案 2 :(得分:5)

或者您只需安装mmv命令即可​​:

mmv '*.t1' '#1.t2'

此处#1是第一个全局部分,即*中的*.t1

或者在纯粹的bash中,一个简单的方法是:

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done

(即:for可以在没有外部命令帮助的情况下列出文件,例如lsfind

HTH

答案 3 :(得分:5)

在全新安装的 debian 14 上,上述解决方案均不适合我。 这应该适用于任何 Posix/MacOS

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

所有功劳归于: https://askubuntu.com/questions/35922/how-do-i-change-extension-of-multiple-files-recursively-from-the-command-line

答案 4 :(得分:2)

我会在bash中这样做:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done

编辑: 我的错误:它不是递归的,这是递归更改文件名的方法:

for i in $(find `pwd` -name "*.t1"); 
do 
    mv "$i" "${i%.t1}.t2"
done

答案 5 :(得分:0)

我对这些解决方案之一的懒惰复制粘贴不起作用,但我已经安装了 fd-find,所以我使用了它:

fd --extension t1 --exec mv {} {.}.t2

来自 fd 的联机帮助页,执行命令时(使用 --exec):

          The following placeholders are substituted by a
          path derived from the current search result:

          {}     path
          {/}    basename
          {//}   parent directory
          {.}    path without file extension
          {/.}   basename without file extension