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
相关产品推荐
相关产品推荐

