我想递归遍历目录并更改某个扩展名的所有文件的扩展名,例如.t1
到.t2
。执行此操作的bash命令是什么?
答案 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
可以在没有外部命令帮助的情况下列出文件,例如ls
或find
)
HTH
答案 3 :(得分:5)
在全新安装的 debian 14 上,上述解决方案均不适合我。 这应该适用于任何 Posix/MacOS
find ./ -depth -name "*.t1" -exec sh -c 'mv "$1" "${1%.t1}.t2"' _ {} \;
答案 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