Linux:删除多个文件的文件扩展名

rp1*_*101 44 linux bash rename

我有很多扩展名为.txt的文件.如何在linux中删除多个文件的.txt扩展名?

我找到

rename .old .new *.old
Run Code Online (Sandbox Code Playgroud)

替代.old延伸到.new

此外,我想对子文件夹中的文件执行此操作.

thk*_*ala 70

rename 有点危险,因为根据其手册页:

重命名将通过替换第一次出现的... 重命名指定的文件

它会很高兴用文件名来做错误的事情c.txt.parser.y.

这是一个使用find和的解决方案bash:

find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done
Run Code Online (Sandbox Code Playgroud)

请记住,如果文件名包含换行符,这将会中断(很少见,但并非不可能).

如果您有GNU查找,这是一个更可靠的解决方案:

find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done
Run Code Online (Sandbox Code Playgroud)

  • 是的,如果你在Mac上,不要忘记目录说明符.例如`找到.-type f -name'*.txt'| 读取f; 做mv"$ f""$ {f%.txt}"; done` (4认同)
  • @bgs:大多数(全部?)Linux发行版使用GNU find,默认为.没有指定参数时 (3认同)

小智 20

我用这个:

find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \;
Run Code Online (Sandbox Code Playgroud)


And*_*w S 13

Perl版本的重命名可以删除扩展名,如下所示:

rename 's/\.txt$//' *.txt
Run Code Online (Sandbox Code Playgroud)

这可以与find结合使用,以便也可以执行子文件夹.


rob*_*ert 11

您可以显式传入一个空字符串作为参数.

rename .old '' *.old

并与子文件夹,find . -type d -exec rename .old '' {}/*.old \;. {}是找到的条目的替代find,并\;终止后面给出的命令的arglist -exec.