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

ds97pgxw  于 2023-05-06  发布在  Linux
关注(0)|答案(6)|浏览(130)

我想递归地遍历一个目录,并将所有具有特定扩展名的文件的扩展名更改为.t1,比如.t2。执行此操作的bash命令是什么?

dwbf0jvd

dwbf0jvd1#

用途:

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

sqyvllje2#

没有一个建议的解决方案对我在新安装的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

omjgkv6w

omjgkv6w3#

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

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

w7t8yxp54#

我在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
nlejzf6q

nlejzf6q5#

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

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

这里,#1是第一团部分,即*.t1中的*
或者在纯bash的东西中,一个简单的方法是:

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

(i.e.:for可以在没有外部命令(如lsfind)的帮助下列出文件
高温加热

cnh2zyt3

cnh2zyt36#

我对其中一个解决方案的懒惰复制粘贴不起作用,但我已经安装了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

相关问题