我想递归地遍历目录并更改特定扩展名的所有文件的扩展名,例如将
.t1
更改为 .t2
。执行此操作的 bash 命令是什么?
用途:
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' - '{}' \;
在全新安装的 debian 11 上,所有建议的解决方案都不适用于我。 这应该适用于任何 Posix/MacOS
find ./ -depth -name "*.t1" -exec sh -c 'mv "$1" "${1%.t1}.t2"' _ {} \;
如果您的
bash
版本支持 globstar
选项(版本 4 或更高版本):
shopt -s globstar
for f in **/*.t1; do
mv "$f" "${f%.t1}.t2"
done
我会在 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
mmv
命令并执行以下操作:
mmv '*.t1' '#1.t2'
这里
#1
是第一个 glob 部分,即 *
中的 *.t1
.
或者在纯粹的 bash 中,一个简单的方法是:
for f in *.t1; do
mv "$f" "${f%.t1}.t2"
done
(即:
for
可以在不借助外部命令(例如ls
或find
)的情况下列出文件)
HTH
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