Как удалить файлы старше, чем в огромной директории

Думайте о псевдонимах как о замене слова каким-либо другим текстом в шелл-коде перед его интерпретацией.

С псевдонимом find, определенным как:

alias find='function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}'

При вводе

find

в подсказке, которая заменяется на:

function _find(){find / -name "$1" 2>&1 | grep -v "Permission denied"}

Если бы оболочка была zsh, этот код определял бы функцию _find, тело которой find / -name "$1" 2>&1 | grep -v "Permission denied". В других оболочках, включая bash, вы получите синтаксическую ошибку либо потому, что function f()не является правильным синтаксисом объявления переменной, либо (, как в bashили yash), потому что {find...будет рассматриваться как простой command и bashи yashоказались единственными оболочками, которые не поддерживают простые команды в качестве тела функции.

Здесь вы хотите определить функцию, а не псевдоним, и, поскольку эта функция будет иметь API, отличный от API команды find, вы можете назвать ее другим именем, например:

myfind() {
  find / -name "$@" 2>&1 | grep -v "Permission denied"
}

В любом случае, будь то псевдоним или функция, поскольку оба являются внутренними функциями оболочки, вы не сможете использовать их из sudo. Чтобы sudoможно было вызвать, вам нужно сделать это реальной командой, например скриптом:

#! /bin/sh -
find / -name "$@" 2>&1 | grep -v "Permission denied"

Вам нужно сделать этот скрипт исполняемым и сохранить его в каталоге, который находится в sudo's secure_path, если он определен.

1
05.11.2020, 12:44
1 ответ

Вероятно, вы не станете более эффективным, чем:

find /dir -type f -mtime +6 -delete

Для удаления файлов старше 7 (да, 7, а не 6 )дней.

В любом случае вам потребуется выполнить один lstat()системный вызов для каждого файла, чтобы определить время его последней модификации. Удаление файла(unlink()из каталога )обходится дорого, поскольку необходимо отредактировать содержимое каталога, обновить время модификации каталога, обновить счетчик ссылок файла в индексном узле и обновить информацию о распределении блоков/экстентов.

Использование-delete(расширения GNU )эффективно, поскольку тогда unlink()выполняется непосредственно findбез необходимости вызова отдельной утилиты rm. Это подразумевает -depth, но я не ожидаю, что это сильно повлияет на производительность.

4
18.03.2021, 22:52

Теги

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