我正在寻找一个bash脚本,可以递归地查找具有.bx扩展名的文件,并删除此扩展名。文件名没有特定的格式(一些是带有“.”前缀的隐藏文件,一些名称中有空格等),并且并非所有文件都具有此扩展名。
我不确定如何查找每个具有.bx扩展名的文件(在我的当前工作目录及其子目录中)并将其删除。谢谢帮助!
我不确定如何查找每个具有.bx扩展名的文件(在我的当前工作目录及其子目录中)并将其删除。谢谢帮助!
find . -name '*.bx' -type f | while read NAME ; do mv "${NAME}" "${NAME%.bx}" ; done
Bash 4+
shopt -s globstar
shopt -s nullglob
shopt -s dotglob
for file in **/*.bx
do
mv "$file" "${file%.bx}"
done
find -name "*.bx" -print0 | xargs -0 rename 's/\.bx//'
rename
版本不支持正则表达式。请参阅 Raghuram 的答案获取可行解决方案。 - tylerl这里有另一个版本,它执行以下操作:
$old_ext
(目前设置为.bx
)在cwd
及其子目录中查找文件,并将它们存储在$files
中$new_ext
设置为新的扩展名,目前设置为.xyz
)该脚本使用dirname
和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
附加内容:如何从文件名中删除任何扩展名
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" 命令中的百分号数量将定义实际的截取点。
find . -maxdepth 1 -type f | sed 's/.\///g'| grep -E [.] | while read file; do mv $file ${file%.*}; done
(请注意find
后面的.
)。 - miguno假设您在想要执行此操作的文件夹中
find . -name "*.bx" -print0 | xargs -0 rename .bx ""
对于所有以.bx结尾的文件,使用以下命令:for blah in *.bx ; do mv ${blah} ${blah%%.bx}