Ho scritto uno script che elimina tutto tranne gli ultimi due file in una cartella:
#!/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
Questo script verrà eseguito come cron job ogni giorno.
Il ragionamento è il seguente:
Ottieni un elenco di tutti i file utilizzando
ls -1
(in modo da ottenere un file per riga);Rimuovere gli ultimi due dall'elenco usando
head -n -2
;Poiché
ls
stampa percorsi relativi, usa l'xargs printf
oggetto per anteporre il percorso della cartella e renderlo un percorso assoluto;Mandali a
sudo rm -rf
usarexargs
.
Tutti hanno accesso a questa cartella, quindi chiunque può creare ed eliminare qualsiasi file in questa cartella.
Il problema è: sudo rm -rf
fa paura. xargs sudo rm -rf
è incredibilmente spaventoso.
Voglio essere sicuro che nessuno può danneggiare altre cartelle / sistemi creando file intelligenti da eliminare (o accidentalmente o di proposito). Non lo so, qualcosa di intelligente come:
file with / spaces.txt
che potrebbe risultare in un super spaventoso sudo rm -rf /
.
EDIT: Il mio errore, i nomi dei file non possono contenere /
, quindi questo specifico problema non si verifica, ma la domanda se ci sono altri rischi rimane valida.
Questo è il motivo per cui sto usando --quoting-style=shell-always
, questo dovrebbe impedire qualsiasi trucco con file con spazi. Ma ora mi chiedo se qualcuno potrebbe essere più intelligente con spazi e citazioni nel nome del file, forse.
La mia sceneggiatura è sicura?
Nota: ho bisogno sudo
perché accedo alla cartella da remoto (da un'unità di rete mappata utilizzando mount
) e non sono riuscito a farlo funzionare senza sudo.
/
creare un file con il personaggio nel nome Sto provando a raggiungere questo risultato qui
ls
output questo è già un comando scritto male, anche con la citazione. ls
usa anche le impostazioni locali per l'ordinamento, penso, quindi non vedo lo scopo di head
rimuovere gli ultimi 2 (a meno che tu non stia cercando di sbarazzarti di .
e ..
che iirc non sia consentito come argomenti per rm
comunque. Basta usare find /path/to/folder -type f delete
. E no sudo
se corri da cron - cron è già al livello principale
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm
?