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

问题描述 投票:0回答:6

我想递归地遍历目录并更改特定扩展名的所有文件的扩展名,例如将

.t1
更改为
.t2
。执行此操作的 bash 命令是什么?

regex linux bash shell sh
6个回答
247
投票

用途:

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

如果您有

rename
可用,则使用其中的一个

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

对于单个文件,请使用

+
分隔符;对于一次重命名所有文件,请使用
;
分隔符。 例子: 对于单个文件

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

对于 find 命令范围内的所有文件:

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

57
投票

在全新安装的 debian 11 上,所有建议的解决方案都不适用于我。 这应该适用于任何 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


17
投票

如果您的

bash
版本支持
globstar
选项(版本 4 或更高版本):

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

11
投票

我会在 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
投票

或者您可以简单地安装

mmv
命令并执行以下操作:

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

这里

#1
是第一个 glob 部分,即
*
中的
*.t1
.

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

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

(即:

for
可以在不借助外部命令(例如
ls
find
)的情况下列出文件)

HTH


1
投票

我对这些解决方案之一的懒惰复制粘贴不起作用,但我已经安装了

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
© www.soinside.com 2019 - 2024. All rights reserved.