1

У меня есть псевдоним

alias binobj="find . -iname "bin" -o -iname "obj" | xargs rm -rf"

Это я использую, когда мой диск почти заполнен. При этом удаляются папки "bin" и "obj", рекурсивно ища из текущей папки.

Я хотел бы знать, как я могу узнать общую сумму всех удаленных файлов. Я рассмотрел размещение эха между двумя командами через канал, но тогда xargs не получит файлы для удаления.

Я на Mac, но я не стесняюсь добавлять пакеты. Я просто не хочу помещать это в другой файл (это мой .bash_profile), так как этот синхронизируется со всеми моими другими маками.

2 ответа2

1

Я бы просто вычислил размер перед удалением папок:

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}' : суммировать все размеры в первом столбце отчета
1

Вы должны быть очень осторожны при выполнении рекурсивного поиска для bin и obj ... например, вы можете случайно выскочить из важных файлов или каталогов (например: .../.hg/store/data/obj), что не будет хорошей идеей.

Там, где это возможно, вы хотите быть максимально точным. Если вы пытаетесь удалить каталоги, укажите -type d чтобы случайно не найти файл / символическую ссылку / etc ...

Кроме того, он достаточно велик, поэтому было бы полезно иметь набор функций для удобочитаемости / удобства обслуживания.

Этот набор функций (и, наконец, конвейер, который можно связать / поместить в функцию) удалит все каталоги bin и obj которые находятся рядом с файлом с именем makefile (все без учета регистра). Всего байтов будет записано в stderr с помощью shy 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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .