我怎样才能显示从 rm -rf 中删除的字节数?

我怎样才能显示从 rm -rf 中删除的字节数?

我有一个别名

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写入总字节数以获得输出,例如“ ”objmakefilestderrnumfmt9.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}':汇总报告第一列中的所有大小

相关内容