如何删除小于 1000 KB 的目录?
我已经从命令中获得了一个文件列表:
du -sk * | sort -n > sort.txt
但我不知道该如何进行。
更新:
du -sk */ | awk 'BEGIN { FS="\t" }; { if($1 < 1000) printf "%s\0",$0 }' | sort -nrz | hexdump -C | head -n 10
00000000 31 36 09 32 20 50 69 73 74 6f 6c 73 20 46 74 2e |16.2 Pistols Ft.|
00000010 20 54 2d 50 61 69 6e 20 26 20 54 61 79 20 44 69 | T-Pain & Tay Di|
00000020 7a 6d 2f 33 30 34 09 41 63 65 20 41 74 6b 69 6e |zm/304.Ace Atkin|
00000030 73 2f 38 09 41 69 72 6d 61 74 65 20 66 65 61 74 |s/8.Airmate feat|
00000040 2e 20 4d 61 72 69 73 68 6b 61 20 50 68 69 6c 6c |. Marishka Phill|
00000050 69 70 73 2f 31 36 09 41 6c 65 78 61 6e 64 65 72 |ips/16.Alexander|
00000060 20 4b 6f 77 61 6c 73 6b 69 20 66 65 61 74 2e 20 | Kowalski feat. |
00000070 42 61 72 63 61 20 42 61 78 61 6e 74 2f 35 34 34 |Barca Baxant/544|
00000080 09 41 6e 64 72 65 cc 81 73 20 66 65 61 74 20 44 |.Andre..s feat D|
00000090 4a 20 4d 69 6e 78 2f 31 36 09 41 73 69 61 20 43 |J Minx/16.Asia C|
输出
du -sk * | awk 'BEGIN { FS="\t" }; { if($1 < 1000) print $2 }'
类似于:
dirname
other dirname
other dirname with special chars / . - +
答案1
问题在于白夸克回答是grep
添加空值,但awk
删除空值。此外,您可能希望将du
命令限制为仅目录,因为这就是您要测量并根据大小删除的内容。在星号后添加斜线即可实现此目的。
du -sk */ | awk 'BEGIN { FS="\t" }; { if($1 < 1000) printf "%s\0",$2 }' | xargs -0 rm -rf
答案2
试试看du -sk * | awk 'BEGIN { FS="\t" }; { if($1 < 1000) print $2 }' | grep '' -Z | xargs -0 -s 1024 rm -rf
。小心rm
!
答案3
“grep '' -Z”对我来说不起作用,但 tr 起作用:
du -sk * | awk 'BEGIN { FS="\t" }; { if($1 < 10) print $2 }' |tr '\n' '\0' |xargs -0 rm -rf
答案4
以下是 GitHub copilot 自动生成的内容
#!/bin/env bash
# recursively list all directories and their size with less than 10KB
find . -type d -print0 | while read -d $'\0' dir; do
if [ $(du -s "$dir" | cut -f1) -lt 10 ]; then
du -sh "$dir"
fi
done
# ask for confirmation whether to delete the directories
read -p "Delete the above directories? [y/N] " -n 1 -r
# if yes, delete the directories
if [[ $REPLY =~ ^[Yy]$ ]]; then
find . -type d -print0 | while read -d $'\0' dir; do
if [ $(du -s "$dir" | cut -f1) -lt 10 ]; then
rm -rf "$dir"
echo "Deleted $dir"
fi
done
else # else, do nothing
echo "Nothing deleted."
exit 0
fi