Я написав сценарій, який видаляє всі, крім двох останніх файлів у папці:
#!/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
?