Удалить все файлы в каталоге, кроме последних 20
У меня есть вопрос, почему мой cmd для "удаления всех файлов в каталоге, кроме последних 20" не работает в cron, но в командной строке да.
* * * * * ls -1tr /home/testusr/test | head -n -20 | xargs -d '\n' rm -f > /var/opt/check.log 2>&1
Каталог содержит, скажем, 100x файлы, которые называются DATA-20140605xxxx, генерируемые каждую минуту.
Спасибо заранее за любой ответ.
2 ответа
Возникшая у вас проблема вызвана тем, что вывод вашей команды ls не содержит путь к файлу, он содержит только имя файла. Когда запускается задание cron, оно запускается в домашнем каталоге пользователя, поэтому при запуске rm ищет файлы в / home / testuser, а не / home / testuser / test.
Вы можете исправить это с помощью простой команды CD
cd /home/testuser/test && ls -1tr /home/testusr/test ...
Это, однако, не очень хорошо, так как вы анализируете вывод ls, который является Bad IdeaTM, смотрите ссылку для подробного обсуждения.
Если вы запустите это ls
из вашего корневого каталога вы получите список файлов, но НЕ путь. Таким образом, вы пытаетесь удалить DATAblah
от чего бы то ни было cwd
из cron
является.
Решение либо:
- вставьте chdir в cron (или оберните ваши команды в скрипт).
- использовать что-то другое, чем 'ls
.
Например, echo /home/testuser/test/*`даст вам имена путей. (Но очевидно - нет определенного порядка сортировки). - найти способ префикс этого пути к рм.
Скрипты-обертки, как правило, хорошие ставки для такого рода вещей. Не могли бы вы вместо удаления на основе времени? Если они помечены меткой времени за минутой, могли бы вы вместо этого удалить все файлы старше, чем, скажем, 10 миллионов лет?
В таком случае: find /home/testuser/test/ -mmin +10 -exec rm {} \;
может сделать свое дело.