需求:编写Bash脚本按指定扩展名统计并删除目录文件
我看你写的脚本混了Bash和Perl的语法,这肯定跑不起来啦,咱们一步步把它改成符合要求的纯Bash脚本:
先说说原脚本的几个问题
- 混用了Perl语法(比如
print、chomp、my $filepath这些都是Perl的写法,Bash里不这么用) - 判断文件类型的逻辑错误:用
head -c 4匹配%EXE这类标识完全不对,咱们需求是按文件扩展名筛选,直接匹配后缀更准确 - 递归遍历的逻辑可以用
find命令更高效,不用自己写递归函数 - 边遍历边删除会导致统计不准确,应该先收集所有目标文件信息,再统一删除
完善后的Bash脚本
#!/bin/bash # 提示用户输入目标目录 read -p "Please enter file path: " target_dir # 先检查输入的目录是否存在 if [ ! -d "$target_dir" ]; then echo "Error: Directory '$target_dir' does not exist." exit 1 fi # 定义需要处理的文件扩展名(不区分大小写) target_exts=("exe" "mp3" "avi") file_count=0 temp_file="/tmp/target_files_to_delete.txt" # 打印表头,用printf保证格式对齐 printf "%-15s %-10s %s\n" "Filename" "Filesize" "Filepath" printf "%-15s %-10s %s\n" "---------------" "----------" "------------------------" # 用find命令递归查找所有目标扩展名的文件 find "$target_dir" -type f \( -iname "*.exe" -o -iname "*.mp3" -o -iname "*.avi" \) | while read -r file; do # 提取文件名、所在路径 filename=$(basename "$file") filepath=$(dirname "$file") # 获取人类可读的文件大小(比如5KB、10MB) filesize=$(numfmt --to=iec --suffix=B < <(du -b "$file")) # 打印文件信息 printf "%-15s %-10s %s\n" "$filename" "$filesize" "$filepath" # 把文件路径写入临时文件,后续批量删除 echo "$file" >> "$temp_file" ((file_count++)) done # 执行删除操作并输出结果 if [ $file_count -gt 0 ]; then rm -f $(cat "$temp_file") echo "$file_count files are removed" else echo "No matching files found to remove." fi # 清理临时文件 rm -f "$temp_file"
关键细节说明
- 输入校验:先检查用户输入的目录是否存在,避免后续报错
- 文件匹配:用
find的-iname参数实现不区分大小写的扩展名匹配,如果需要严格区分大小写,改成-name即可 - 格式对齐:用
printf控制列宽,保证输出的表格整齐 - 安全删除:先把所有要删除的文件路径存入临时文件,再批量删除,避免边遍历边删导致的统计错误
- 测试建议:第一次运行时可以把
rm -f改成echo rm -f,先预览要删除的文件,防止误删
内容的提问来源于stack exchange,提问作者Mat
相关产品推荐
相关产品推荐

