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

Ama*_*ony 70 linux bash shell sh

我想递归的目录遍历和更改特定扩展名的所有文件的扩展名,说.t1.t2.执行此操作的bash命令是什么?

anu*_*ava 164

如果您有可用的重命名,请使用:

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' \;
Run Code Online (Sandbox Code Playgroud)

如果无法重命名,请使用:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \;
Run Code Online (Sandbox Code Playgroud)

  • `找到.-name'*.t1'-exec重命名.t1 .t2 {} +` (17认同)
  • 如果像“find”这样需要一次重命名,分隔符参数应该是“;”而不是“+”。-name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' \;`。否则,使用“+”一次只会重命名一个文件。[参考](https://www.baeldung.com/linux/find-exec-command) (15认同)
  • 如果有人想知道"$ {1%.t1}".t2`部分是做什么的,就像我做的那样:它使用bash字符串操作来执行以下操作:1 /取第一个位置参数`$ 1`并截断`.t1`字符串文字从它的结尾(百分号'%`运算符).2 /将`.t2`字符串文字附加到结果中. (5认同)
  • 更喜欢用户 `find 。-type f -name '*.t1'` 以避免文件夹 (5认同)
  • (我的`rename`版本不允许使用sed样式替换表达式.我喜欢Linux.我以前必须安装TotalCommander for Windows来做这样的事情.) (2认同)
  • 重命名在OSX中对我不起作用,但bash版本很棒b/c我刚刚在mv前添加'git',现在git很高兴:-D (2认同)
  • @AaronBlenkush 在 Windows 中,我将使用 PowerShell 来执行此操作:`gci -r *.t1 | foreach { $_ -replace ".t1", ".t2" }` 这些命令将打印重命名的文件名。 (2认同)
  • 在 MacOS 上,它仅重命名第一个匹配的文件 (2认同)

jrj*_*rjc 9

我会在 bash 中这样做:

for i in $(ls *.t1); 
do
    mv "$i" "${i%.t1}.t2" 
done
Run Code Online (Sandbox Code Playgroud)

编辑:我的错误:它不是递归的,这是我递归更改文件名的方法:

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

  • [不要解析 ls](http://mywiki.wooledge.org/ParsingLs),并查看同一页面以了解为什么您的 `find` 语法不好。另外,请确保您 [引用您的变量](http://mywiki.wooledge.org/BashGuide/Practices#Quoting) (8认同)

che*_*ner 8

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

shopt -s globstar
for f in **/*.t1; do
    mv "$f" "${f%.t1}.t2"
done 
Run Code Online (Sandbox Code Playgroud)


zmo*_*zmo 6

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

mmv '*.t1' '#1.t2'
Run Code Online (Sandbox Code Playgroud)

#1是第一个glob部分,即*in *.t1.

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

for f in *.t1; do
    mv "$f" "${i%.t1}.t2"
done
Run Code Online (Sandbox Code Playgroud)

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

HTH

  • 我假设OP使用"递归"也指重命名目录子目录中的文件. (7认同)

Pau*_*yer 5

在全新安装的 debian 14 上,上述解决方案均不适合我。这应该适用于任何 Posix/MacOS

find ./ -depth -name "*.t1" -exec sh -c 'mv "$1" "${1%.t1}.t2"' _ {} \;
Run Code Online (Sandbox Code Playgroud)

所有学分:https : //askubuntu.com/questions/35922/how-do-i-change-extension-of-multiple-files-recursively-from-the-command-line

  • 谢谢你。所选答案中的重命名内容在 Ubuntu 20 上不起作用 (2认同)