Как зафиксировать отсутствие ошибок при удалении нескольких файлов в Linux?

Обычно в Linux нет .exeфайлов; расширение .exe— артефакт времен DOS. Самый распространенный способ узнать, где находится исполняемый файл, который я видел, — запустить whichс именем команды, поэтому в данном случае это будет which nmap.

В большинстве систем семейства Red Hat результатом будет:

# which nmap
/usr/bin/nmap
1
07.08.2019, 11:38
1 ответ

Чтобы подсчитать точное количество ошибок, которые rmпроизводит:

find "$CDIR" -depth -mtime +7 -exec sh -c '
    for pathname do
        if ! rm -rfv "$pathname"; then
           count=$(( count + 1 ))
        fi
    done
    printf "This batch caused %d errors in rm\n" "$count"' sh {} +

Это выполнит глубокий -первый поиск в $CDIRи его подкаталогах -и удалит любой файл или каталог с отметкой времени модификации более недели назад. Сценарий оболочки в строке -будет вызываться для пакетов найденных путей, и он выполняет итерацию по каждому, пытаясь удалить его с помощью rm. Если удаление не удалось, оно засчитывается. В конце сценария строки -сообщается количество сбоев для этой партии.

Обратите внимание, что это очень небезопасный способ очистки, так как вся структура каталогов с корнем $CDIRбудет удалена, если ни один файл или каталог в самом $CDIRне был добавлен или удален в течение нескольких недель. время . Та же проблема верна для каждого подкаталога $CDIR.

Вместо этого вы можете удалить только старые файлы , а затем удалить пустые каталоги по отдельности:

find "$CDIR" ! -type d -mtime +7 -exec sh -c '
    for pathname do
        if ! rm -fv "$pathname"; then
           count=$(( count + 1 ))
        fi
    done
    printf "%d files in this batch could not be deleted\n" "$count"' sh {} +

find "$CDIR" -type d -empty -delete

(Это предполагает, что у вас есть реализация find, которая поддерживает -emptyи -delete, и что вы согласны с удалением пустых каталогов, даже если они не были очищены первой командой find)

Как всегда, при тестировании команд, выполняющих подобные очистки, запускайте копии данных и сохраняйте резервную копию данных.


Другой (более простой )подход заключается в простом удалении старых файлов, а затем подсчете количества старых вещей, которые все еще существуют. Это число будет равно количеству раз rmсбоев (, хотя я использую здесь -deleteдля краткости ):

.
find "$CDIR" ! -type d -mtime +7 -delete
find "$CDIR" ! -type d -mtime +7 -exec echo x \; | wc -l

Затем вы также можете очистить пустые каталоги, как описано выше.

3
27.01.2020, 23:22

Теги

Похожие вопросы