You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

需求:编写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"

关键细节说明

  1. 输入校验:先检查用户输入的目录是否存在,避免后续报错
  2. 文件匹配:用find的-iname参数实现不区分大小写的扩展名匹配,如果需要严格区分大小写,改成-name即可
  3. 格式对齐:用printf控制列宽,保证输出的表格整齐
  4. 安全删除:先把所有要删除的文件路径存入临时文件,再批量删除,避免边遍历边删导致的统计错误
  5. 测试建议:第一次运行时可以把rm -f改成echo rm -f,先预览要删除的文件,防止误删

内容的提问来源于stack exchange,提问作者Mat

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:18:22