Linux:删除多个文件的文件扩展名
我有很多扩展名为.txt的文件。 如何删除Linux中的多个文件的.txt扩展名?
我find
rename .old .new *.old
用.old
扩展名replace.new
另外我想为子文件夹中的文件做这个。
rename
是有点危险,因为根据其手册页:
重命名将通过replace第一次出现的重命名指定的文件…
它会愉快地做错误的事情,像c.txt.parser.y
文件名。
这是一个使用find
和bash
的解决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