Я написав сценарій, який видаляє всі, крім двох останніх файлів у папці:
#!/bin/bash
ls -1 --quoting-style=shell-always /path/to/some/folder \
| head -n -2 \
| xargs printf -- "'/path/to/some/folder/%s'\n" \
| xargs sudo rm -rf
Цей сценарій буде виконуватись як робота з хроном щодня.
Міркування такі:
Отримати список усіх файлів, що використовуються
ls -1(так що я отримую один файл у рядку);Видаліть останні два зі списку за допомогою
head -n -2;Оскільки
lsдрукує відносні шляхи, використовуйтеxargs printfріч, щоб додати шлях до папки та зробити її абсолютним шляхом;Надіслати їх у
sudo rm -rfкористуванняxargs.
Усі мають доступ до цієї папки, тому кожен може створювати та видаляти будь-які файли в цій папці.
Проблема в тому, що: sudo rm -rf страшно. xargs sudo rm -rfнеймовірно страшно.
Я хочу бути впевненим, що ніхто не може пошкодити інші папки / системи, створюючи розумні файли, які потрібно видалити (випадково або за призначенням). Я не знаю, щось розумне, як:
file with / spaces.txt
що може призвести до надто страшного sudo rm -rf /.
EDIT: Моя помилка, назви файлів не можуть містити /, тому ця конкретна проблема не трапиться, але все ще стоїть питання про те, чи є інші ризики чи ні.
Ось чому я використовую --quoting-style=shell-always, це повинно запобігти будь-яким хитростям з файлами з пробілами. Але зараз мені цікаво, чи може хтось бути надзвичайно розумним із пробілами та цитатами у назві файлу, можливо.
Чи безпечний мій сценарій?
Примітка. Мені це потрібно, sudoоскільки я віддаляю папку віддалено (з картографічного мережевого накопичувача за допомогою mount), і я не міг змусити її працювати без судо.
/бути створений файл із символом в імені, я намагаюся досягти цього ще тут
lsвихід, це вже погано написана команда, навіть із цитуванням. lsЯ також вважаю, що також використовується locale для порядку сортування, я вважаю, тому я не бачу, у чому мета headвидалення останніх 2 (якщо ви не намагаєтеся позбутися .і ..яких iirc не дозволено як аргументи rm. Просто використовуйте find /path/to/folder -type f delete. І ні, sudoякщо ви біжите від cron - cron вже на рівні коренів
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?