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

我希望递归地遍历一个目录,并将所有扩展名为 .t1的文件的扩展名更改为 .t2。这样做的 bash 命令是什么?

72959 次浏览

用途:

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/' '{}' +

我会在 bash 中这样做:

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

编辑: my mistake : it's not recursive, here is my way for recursive changing filename :

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

或者您可以简单地安装 mmv命令并执行以下操作:

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

这里的 #1是第一个通球部分,即 *.t1中的 *

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

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

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

高温

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

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

所有建议的解决方案都不适用于新安装的 Debian14。 这在任何 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

我懒散地复制粘贴了其中一个解决方案,但是没有成功,但是我已经安装了 fd-find,所以我使用了:

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

在执行命令(使用 --exec)时,从 fd的 manpage 中可以看到:

          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