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

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

我find

rename .old .new *.old 

.old扩展名replace.new

另外我想为子文件夹中的文件做这个。

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

重命名将通过replace第一次出现的重命名指定的文件…

它会愉快地做错误的事情,像c.txt.parser.y文件名。

这是一个使用findbash的解决scheme:

 find -type f -name '*.txt' | while read f; do mv "$f" "${f%.txt}"; done 

请记住,如果文件名包含一个换行符(罕见,但不是不可能),这将打破。

如果你有GNU的发现,这是一个更坚实的解决scheme:

 find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv "$f" "${f%.txt}"; done 

我使用这个:

 find ./ -name "*.old" -exec sh -c 'mv $0 `basename "$0" .old`.new' '{}' \; 

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

 rename 's/\.txt$//' *.txt 

这可以结合查找,以便也做子文件夹。

你可以显式传入一个空string作为参数。

rename .old '' *.old

并与子文件夹, find . -type d -exec rename .old '' {}/*.old \; find . -type d -exec rename .old '' {}/*.old \;{}是用find\; find的条目的替代品\; 终止-exec之后给定的命令的参数列表。

对于子文件夹:

 for i in `find myfolder -type d`; do rename .old .new $i/*.old done 

万一它有帮助,这是我怎么用zsh:

 for f in ./**/*.old; do mv "${f}" "${f%.old}" done 

zsh中的${x%pattern}结构消除了$x结尾处最短的pattern发生。 在这里它被抽象为一个函数:

 function chgext () { local srcext=".old" local dstext="" local dir="." [[ "$#" -ge 1 ]] && srcext="$1" [[ "$#" -gt 2 ]] && dstext="$2" dir="$3" || dir="${2:-.}" local bname='' for f in "${dir}"/**/*"${srcext}"; do bname="${f%${srcext}}" echo "${bname}{${srcext} → ${dstext}}" mv "${f}" "${bname}${dstext}" done } 

用法:

 chgext chgext src chgext src dir chgext src dst dir Where `src` is the extension to find (default: ".old") `dst` is the extension to replace with (default: "") `dir` is the directory to act on (default: ".") 

在鱼,你可以做

 for file in *.old touch (basename "$file" .old).new end