Удалите все файлы в каталоге кроме последних 20

У меня есть вопрос, почему мой cmd для "удаления всех файлов в каталоге кроме последних 20" не работающий в кроне, но в командной строке да.

* * * * *  ls -1tr /home/testusr/test | head -n -20 | xargs -d '\n' rm -f  > /var/opt/check.log 2>&1

Каталог содержит, позволяют, говорят 100x файлы, которые называют, ДАННЫЕ-20140605xxxx генерировали минуту к минуте.

Благодарность усовершенствование для любого ответа.

-3
задан 5 June 2014 в 12:00
2 ответа

Проблема вызвана тем, что в выводе команды ls не указан путь к файлу, содержащему только имя файла. Когда запускается задание cron, оно запускается в домашнем каталоге users, поэтому когда запускается rm, он ищет файлы в /home/testuser, а не в /home/testuser/test.

Вы можете исправить это простой командой cd

cd /home/testuser/test && ls -1tr /home/testusr/test ...

Это, однако, не очень хорошо, так как вы разбираете вывод ls, который является Плохой идеейTM смотрите ссылку для подробного обсуждения.

2
ответ дан 5 December 2019 в 21:56

Если вы запустите этот ls из своего корневого каталога, вы получите список файлов, но НЕ путь. Таким образом, на самом деле, вы пытаетесь удалить DATAblah из того, чем является cwd из cron.

Решение тоже есть:

  • вставить chdir в cron (или обернуть ваши команды в сценарий).
  • используйте что-нибудь кроме 'ls.echo /home/testuser/test/*' даст вам имена путей, например. (Но очевидно - нет определенного порядка сортировки).
  • найдите способ префиксовать этот путь к rm.

Оберточные скрипты обычно являются хорошей ставкой для такого рода вещей. Не могли бы вы вместо этого удалить по времени? Если они имеют временные метки минуту за минутой, не могли бы вы вместо этого удалить все файлы старше, чем, скажем, 10 м?

В таком случае: найти /home/testuser/test/ -mmin +10 -exec rm {} \; может помочь.

0
ответ дан 5 December 2019 в 21:56

Теги

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