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