我希望递归遍历目录并更改特定扩展名的所有文件,例如将.t1
更改为.t2
。那么用于完成此操作的Bash命令是什么?
答:Bash命令如下:
find /path/to/directory -type f -name '*.t1' -exec rename 's/\.t1$/\.t2/' {} +
使用:
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 rename .t1 .t2 {} +
- Aaron Blenkushrename
不允许使用 sed 风格的替换表达式。Linux 真是太棒了。以前我还得在 Windows 上安装 TotalCommander 才能做这样的事情。 - Aaron Blenkush"${1%.t1}".t2
这个部分是做什么的,这里有解释:它使用 bash 字符串操作来执行以下操作:1/ 从第一个位置参数 $1
中截取字符串字面量 .t1
(百分号 %
操作符)。2/ 将 .t2
字符串字面量附加到结果上。 - Zackfind . -type f -name '*.t1'
,以避免操作文件夹。 - Golak Sarangi;
而不是+
,例如:find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \;
。否则,使用+
只能一次重命名一个文件。参考链接 - S.aad在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
ls
(http://mywiki.wooledge.org/ParsingLs),同一页面上可以看到为什么你的 find
语法不好。另外,请确保引用您的变量。 - Reinstate Monica Pleasemmv
命令,并执行以下操作:mmv '*.t1' '#1.t2'
这里的#1
是第一个Glob部分,即*.t1
中的*
。
如果使用纯Bash语法,一种简单的方法如下:
for f in *.t1; do
mv "$f" "${f%.t1}.t2"
done
for
可以列出文件,不需要外部命令的帮助,例如 ls
或 find
)*.t1
中的 *
。 - zmo我懒得复制粘贴这些解决方案中的一个,但我已经安装了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
rename
命令,可以编写一个shell脚本来重命名单个文件(在简单情况下很容易实现),然后使用find
命令将此脚本应用于所有具有问题扩展名的文件。 - user1934428