如何使用Bash脚本递归地从文件中删除特定扩展名

9
我正在寻找一个bash脚本,可以递归地查找具有.bx扩展名的文件,并删除此扩展名。文件名没有特定的格式(一些是带有“.”前缀的隐藏文件,一些名称中有空格等),并且并非所有文件都具有此扩展名。
我不确定如何查找每个具有.bx扩展名的文件(在我的当前工作目录及其子目录中)并将其删除。谢谢帮助!

忘了提一下,这是在OS X上运行的。tylerl的解决方案非常好。 - nick
7个回答

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

3
"${NAME}" "${NAME%.bx}" 更好。文件名可能包含空格! - Benoit
这太完美了,谢谢。在查找周围后,我相信您也可以使用正则表达式在查找中完成,即find . -type f -regex '.*.bx$' | while read i; do mv "$i" "${i%%.bx}"; done - nick

2

Bash 4+

shopt -s globstar
shopt -s nullglob
shopt -s dotglob

for file in **/*.bx
do
  mv "$file" "${file%.bx}"
done

2
find -name "*.bx" -print0 | xargs -0 rename 's/\.bx//'

对我不起作用(没有效果)。在Linux(centos 5.5)上发行的 rename 版本不支持正则表达式。请参阅 Raghuram 的答案获取可行解决方案。 - tylerl
似乎取决于版本 - man rename 给出的是“perl v5.10.1”(在Ubuntu 10.04.1上)。 - Ken
抱歉,我应该提到我使用的是OS X,不幸的是它没有预装rename。你的解决方案对于Linux用户看起来很好。 - nick

1

这里有另一个版本,它执行以下操作:

  1. 基于变量$old_ext(目前设置为.bx)在cwd及其子目录中查找文件,并将它们存储在$files
  2. 将这些文件的扩展名替换为空(或者根据变量$new_ext设置为新的扩展名,目前设置为.xyz

该脚本使用dirnamebasename来分别查找文件路径和文件名。

#!/bin/bash

old_ext=".bx"
new_ext=".xyz"

files=$(find ./ -name "*${old_ext}")

for file in $files
do
    file_name=$(basename $file $old_ext)
    file_path=$(dirname $file)
    new_file=${file_path}/${file_name}${new_ext}

    #echo "$file --> $new_file"
    mv "$file"    "$new_file"
done

1

附加内容:如何从文件名中删除任何扩展名

find -maxdepth 1 -type f | sed 's/.\///g'| grep -E [.] | while read file; do mv $file ${file%.*}; done

将从最后一个点开始截取,即 pet.cat.dog ---> pet.cat

find -maxdepth 1 -type f | sed 's/.\///g'| grep -E [.] | while read file; do mv $file ${file%%.*}; done

将从第一个点开始截取,即pet.cat.dog ---> pet

"-maxdepth 1" 限制操作仅在当前目录中进行,"-type f" 用于仅选择文件。使用Sed和grep组合来仅选择带有点的文件名。 "mv" 命令中的百分号数量将定义实际的截取点。


在Mac OS X上,显然需要明确指定起始目录:find . -maxdepth 1 -type f | sed 's/.\///g'| grep -E [.] | while read file; do mv $file ${file%.*}; done(请注意find后面的.)。 - miguno

1

假设您在想要执行此操作的文件夹中

find . -name "*.bx" -print0 | xargs -0 rename .bx ""

语法错误,位于(eval 1)第1行附近的“。” xargs: rename: 以状态255退出;中止 - Ken

1

对于所有以.bx结尾的文件,使用以下命令:for blah in *.bx ; do mv ${blah} ${blah%%.bx}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接