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

Linux下如何删除所有子目录中的文件并保留每个子目录内最大的文件?

Linux下如何删除所有子目录中的文件并保留每个子目录内最大的文件?

嘿,这个需求我太熟了!针对你Ubuntu 22.04+bash的环境,我给你两个靠谱的方案,记得先跑测试命令确认没问题再执行删除操作,毕竟文件删了可找不回来~

方案一:简单直观版(适合文件名无特殊字符)

这个方法用基础命令组合,容易理解,适合文件名里没有空格、特殊符号的情况:

先测试(只打印要删除的文件,不实际删除)

find . -type d -mindepth 1 -maxdepth 1 | while read dir; do
    # 按文件大小从大到小排序,取第一个就是最大的文件
    largest=$(ls -S "$dir" | head -n1)
    echo "=== 目录 $dir ==="
    echo "保留文件: $largest"
    echo "将删除的文件:"
    ls -1 "$dir" | grep -v "^$largest$"
done

执行删除(确认测试结果正确后再运行)

find . -type d -mindepth 1 -maxdepth 1 | while read dir; do
    largest=$(ls -S "$dir" | head -n1)
    # 排除最大文件,删除其他所有文件
    ls -1 "$dir" | grep -v "^$largest$" | xargs -I {} rm "$dir/{}"
done

方案二:安全兼容版(支持带空格/特殊字符的文件名)

如果你的视频文件名里有空格、括号这类特殊字符,上面的方法可能出问题,这个用stat命令获取文件大小,能完美处理所有文件名:

先测试

find . -type d -mindepth 1 -maxdepth 1 | while read dir; do
    # 提取当前目录下最大的文件(按字节大小排序)
    largest=$(stat -c "%s %n" "$dir"/* | sort -nr | head -n1 | awk '{print substr($0, index($0,$2))}')
    echo "=== 目录 $dir ==="
    echo "保留文件: $(basename "$largest")"
    echo "将删除的文件:"
    for file in "$dir"/*; do
        if [ "$file" != "$largest" ]; then
            echo "$(basename "$file")"
        fi
    done
done

执行删除

find . -type d -mindepth 1 -maxdepth 1 | while read dir; do
    largest=$(stat -c "%s %n" "$dir"/* | sort -nr | head -n1 | awk '{print substr($0, index($0,$2))}')
    for file in "$dir"/*; do
        if [ "$file" != "$largest" ]; then
            rm "$file"
        fi
    done
done

额外说明

  • 如果你的子目录还有嵌套的子目录(不止一级),把命令里的-maxdepth 1去掉就行,这样会递归处理所有深度的子目录。
  • 如果某个目录里有多个大小相同的“最大文件”,上面的方法只会保留排序后的第一个,要是你想保留所有同大小的最大文件,可以告诉我,我再调整逻辑~

备注:内容来源于stack exchange,提问作者EazyEz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 07:33:05