我有一个别名
alias binobj="find . -iname "bin" -o -iname "obj" | xargs rm -rf"
当我的磁盘快满了的时候,我会使用它。它会从当前文件夹开始递归搜索,删除文件夹“bin”和“obj”。
我想知道如何知道所有已删除文件的总和。我研究过通过管道在两个命令之间放置一个 echo,但这样就xargs
不会收到要删除的文件。
我在 Mac 上,但我并不羞于添加软件包。我只是不想把它放在另一个文件中(这是我的.bash_profile
),因为这个文件与我所有的其他 Mac 同步。
答案1
您需要非常小心地进行递归查找bin
...obj
例如,您可能会意外弹出重要文件或目录(例如:),.../.hg/store/data/obj
这不是一个好主意。
只要有可能,您就希望尽可能精确。如果您尝试删除目录,请指定,-type d
以免意外匹配文件/符号链接/等...
此外,它足够大,有利于成为一组可读性/可维护性的函数。
这组函数(以及最终可以别名/放入函数的管道)将删除名为的文件旁边的所有bin
和目录(不区分大小写)。将使用 shy写入总字节数以获得输出,例如“ ”obj
makefile
stderr
numfmt
9.1MB
function getMakefiles {
find . -type f -iname makefile
}
function getBinObjDirsNear {
while read NEAR; do
find $(dirname ${NEAR}) -type d -maxdepth 1 \( -iname bin -o -iname obj \)
done
}
function calcTotal {
TOTAL=0
while read ENT; do
TOTAL=$(( TOTAL + $(du -bc ${ENT} | tail -n 1 | cut -f 1) ))
echo ${ENT}
done
numfmt --to=iec --suffix=B --format="%f" ${TOTAL} >&2
}
getMakefiles | getBinObjDirsNear | calcTotal | xargs -d '\n' rm -rf
答案2
我只需在删除文件夹之前计算大小:
alias binobj="du -sc bin/ obj/ | grep total ; find . -iname "bin" -o -iname "obj" | xargs rm -rf"
bin
该命令将提示您从当前目录添加的+目录的大小(以字节为单位)obj
;然后执行删除。
编辑:根据评论:应该以递归方式找到bin
和:obj
我不会花太多时间去寻找一个优雅的解决方案,我会在删除每个目录之前记录其大小,并在清理完成后计算它们。一个肮脏的一行可能是:
find . -iname "bin" -o -iname "obj" | xargs -I % sh -c "du -sb % >> /tmp/delreport.log; rm -rf %"; awk '{sum+=$1} END {print sum}' /tmp/delreport.log && rm /tmp/delreport.log
| xargs -I % sh -c "..."
:允许您使用 \% 参数放置多个命令du -sb
:将记录将被删除的存储库的大小awk '{sum+=$1} END {print sum}'
:汇总报告第一列中的所有大小