linux文件多个扩展名,关于bash:linux:删除多个文件的文件扩展名

我有许多扩展名为.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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值