如何使用bash脚本递归删除文件中的特定扩展名

时间:2010-10-01 08:07:56

标签: bash filenames

我正在尝试找到一个bash脚本,该脚本将以递归方式查找扩展名为.bx的文件,并删除此扩展名。文件名没有特定的格式(一些是带有“。”前缀的隐藏文件,一些名称中有空格等),并且并非所有文件都有此扩展名。

我不确定如何找到扩展名为.bx的每个文件(在我的cwd中和下面)并将其删除。谢谢你的帮助!

7 个答案:

答案 0 :(得分:15)

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

答案 1 :(得分:2)

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

答案 2 :(得分:2)

Bash 4 +

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

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

答案 3 :(得分:1)

假设您位于您要执行此操作的文件夹中

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

答案 4 :(得分:1)

for blah in *.bx ; do mv ${blah} ${blah%%.bx}

答案 5 :(得分:1)

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

  1. 根据$old_ext及以下.bx中的cwd变量(现在设置为$files)查找文件,将其存储在$new_ext
  2. 将这些文件的扩展名替换为空(取决于.xyz变量的新内容,当前设置为dirname
  3. 该脚本使用basename#!/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}}

答案 6 :(得分: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 --->宠物

“ - maxdepth 1”限制对当前目录的操作,“ - type f”仅用于选择文件。 Sed& grep组合用于仅选择带有点的文件名。 “mv”命令中的百分号数量将定义实际切割点。