我有许多扩展名为.txt的文件。如何删除Linux中多个文件的.txt扩展名?
我发现
rename .old .new *.old
替代.old扩展到.new中
我还想为子文件夹中的文件执行此操作。
rename有点危险,因为根据其手册页:
rename will rename the specified files by replacing the first occurrence of...
它很乐意对像c.txt.parser.y这样的文件名做错误的事情。
这里有一个使用find和bash的解决方案:
find -type f -name '*.txt' | while read f; do mv"$f""${f%.txt}"; done
请记住,如果文件名包含换行符(很少,但并非不可能),这将中断。
如果您找到了GNU,这是一个更可靠的解决方案:
find -type f -name '*.txt' -print0 | while read -d $'\0' f; do mv"$f""${f%.txt}"; done
对于rename的util-linux-ng版本是正确的,但是perl脚本版本可以执行rename 's/.txt$//' *.txt版本。
对我来说,重命名"s/.txt$/"*.txt无效
对于要运行的位置,缺少当前的"."。也许这是我的查找OSX变体,或者我的路径设置不正确
@BGS:大多数(全部?)Linux发行版使用gnu find,默认为。当没有指定参数时
是的,如果您在Mac上,请不要忘记目录说明符。如find . -type f -name '*.txt' | while read f; do mv"$f""${f%.txt}"; done。
为什么第二个比第一个更坚固?
我用这个:
find ./ -name"*.old" -exec sh -c 'mv $0 `basename"$0" .old`.new' '{}' \;
谢谢,我不知道这种语法,它也适用于MacOSX(它缺少本机rename)。
这在Windows Git Bash下非常有效,谢谢!
如果目标位于子文件夹中,您应该添加dirname:find./-name"*.old"-exec sh-c"mv$0 dirname"$0"/basename"$0" .old。new''';
这对我有用,谢谢!
Rename的Perl版本可以删除如下扩展:
rename 's/\.txt$//' *.txt
这可以与"查找"结合使用,以便同时执行子文件夹。
可以显式地将空字符串作为参数传递。
rename .old '' *.old
以及子文件夹,find . -type d -exec rename .old '' {}/*.old \;。{}代替了find中的条目,\;终止了在-exec之后发出的命令的arglist。
如果有帮助,下面介绍我如何使用zsh:
for f in ./**/*.old; do
mv"${f}""${f%.old}"
done
zsh中的${x%pattern}构造消除了pattern在$x末尾出现的最短时间。这里它抽象为一个函数:
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
用于子文件夹:
for i in `find myfolder -type d`; do
rename .old .new $i/*.old
done
如果文件夹名中有空间,这可能会导致问题。
在bash linux中执行
for i in *;do mv ${i} ${i/%.pdf/} ;done