Я написал скрипт, который удаляет все, кроме двух последних файлов в папке:
#!/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
Этот скрипт будет выполняться как задание cron каждый день.
Аргументация следующая:
Получить список всех используемых файлов
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 /
.
РЕДАКТИРОВАТЬ: Моя ошибка, имена файлов не могут содержать /
, так что эта конкретная проблема не возникнет, но вопрос о том, есть ли другие риски все еще остается.
Вот почему я использую --quoting-style=shell-always
, это должно предотвратить любые уловки с файлами с пробелами. Но теперь я задаюсь вопросом, может ли кто-нибудь быть более умным с пробелами и кавычками в имени файла, возможно.
Мой сценарий безопасен?
Примечание: мне нужно, sudo
потому что я обращаюсь к папке удаленно (с подключенного сетевого диска с помощью mount
), и я не могу заставить его работать без sudo.
/
в имени? Я пытаюсь добиться этого здесь
ls
вывод, это уже плохо написанная команда, даже с кавычками. ls
я также думаю, что он также использует локаль для порядка сортировки, поэтому я не понимаю, какова цель 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
?