Поиск и удаление файлов старше 30 дней

Проблема заключается в вашем значении fsid = 0 .

Если мы посмотрим на записи exports , мы можем разделить их на два хоста:

10.34.0.10(rw,sync,no_root_squash,no_subtree_check)
10.34.0.20(rw,sync,no_root_squash,no_subtree_check,fsid=0)

Итак, для клиента .10 экспорт будет иметь разные FSID, но на .20 клиент, оба общих ресурса будут иметь одинаковый FSID.

Таким образом, клиент .10 увидит оба экспорта правильно, но .20 будет сбит с толку.

Удалите значение , fsid = 0 , и все должно работать правильно для обоих клиентов.

3
17.08.2017, 17:18
3 ответа

Команда find обычно требует определенного типа (f для файла, d для каталога, b для блочного устройства, c для символа и т. д.), связанного с вашим поиском, если вы аннотируете подстановочные знаки. В этой ситуации может быть более удобно использовать цикл for вместо оператора if, а также использовать параметр --max-depth, который может быть полезен для поиска скрытых файлов/

Код:

    for i in $(find /h/$USER/ -type f -name "*.txt" -mtime +30 2> /dev/null);
    do
    rm -rf  $i 2> /dev/null;
    done
-1
27.01.2020, 21:30

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

find /h/$USER -maxdepth 1 -name "*.txt" -type f -mtime +30 -delete

Не могу сказать, лучший это или худший способ сделать это, но он работает годами без каких-либо проблем, на самом деле это набор очистителей мусора, все тот же синтаксис, никаких проблем, поэтому я думаю, что это достаточно хорошо для производства..

3
27.01.2020, 21:30

Проблема здесь в том, что вы используете глобусы оболочки вместо findдля перечисления файлов txt (это также исключит скрытые файлы txt, и если какие-либо файлы .txtимеют тип каталога, он будет спуститесь в них, чтобы удалить там все старые файлы ). Оболочки, такие как bash, когда glob не соответствует ни одному файлу, передают glob как -в find, а findжалуются на этот не -существующий *.txtфайл.

Можно просто:

LC_ALL=C find "/h/$USER/." ! -name. -prune \
  -name '*.txt' ! -type d -mtime +30 -print -exec rm -f {} + |
  grep '^' > /dev/null || echo >&2 No text files to del

grepпроверяет, выдает ли findкакие-либо выходные данные (нет ошибок ), поэтому мы выводим сообщение Нет текстовых файлов для удаления , если оно не (удалило > /dev/null, если вы хотите увидеть файлы, которые мы пытаемся удалить ). Обратите внимание, что в процессе мы теряем статус выхода find.

Вы также можете использовать zshвместо этого, чьи глобусы могут проверять возраст файлов (вы уже используете синтаксис zsh, не цитируя это$USER):

oldfiles=(/h/$USER/*.txt(NDm+30^/))
if (($#oldfile)); then
  rm -f -- $oldfiles
else
  echo >&2 No text files to del
fi

В любом случае, как для -find -mtime +30, так и для zshквалификатора glob m+30обратите внимание, что он выбирает файлы старше 31 дня, так как он сравнивает возраст с точки зрения целого числа дней. Файл, которому 30 дней и 23 часа, не будет выбран, поскольку его возраст округляется до 30 дней, что не превышает 30 дней.

2
27.01.2020, 21:30

Теги

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