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


Answers:


207

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

find . -name "*.t1" -exec rename 's/\.t1$/.t2/' '{}' +

要不然:

find . -name '*.t1' -exec rename .t1 .t2 {} +

如果重命名不可用,请使用:

find . -name "*.t1" -exec bash -c 'mv "$1" "${1%.t1}".t2' - '{}' +

20
find . -name '*.t1' -exec rename .t1 .t2 {} +
亚伦·布伦库什

2
(我的版本rename不允许sed样式替换表达式。必须喜欢Linux。我以前必须安装Windows的TotalCommander才能执行类似的操作。)
Aaron Blenkush 2015年

6
如果有人想知道"${1%.t1}".t2部分的功能,就像我一样:它使用bash字符串操作执行以下操作:1 /获取第一个位置参数,$1.t1从其结尾截断字符串文字(百分号%运算符)。2 /将.t2字符串文字附加到结果中。
扎克

2
重命名在OSX中对我不起作用,但是bash版本很棒b / c我刚刚在mv前面添加了'git',现在git很高兴:-D
bdombro

3
喜欢的用户find . -type f -name '*.t1'以避免文件夹
Golak塞兰奇

8

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

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

7

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

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

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

或者用纯bash的东西,一个简单的方法是:

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

(即:for可以列出文件没有外部命令的帮助如lsfind

高温超导


7
我假设OP对“递归”的使用也指的是在目录的子目录中重命名文件。
chepner 2014年

抱歉,#1是什么意思?
inafalcao

1
它是第一个水珠部分即**.t1
ZMO

递归:$ mmv -n ';*.t1' '#1#2.t2'。删除-n标志以执行
okliv

5

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

8
不要解析ls,并在同一页上查看find语法错误的原因。另外,请确保引用变量
恢复莫妮卡,请2014年

2
谢谢,我不知道。
jrjc 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.