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é
lsstampa percorsi relativi, usa l'xargs printfoggetto per anteporre il percorso della cartella e renderlo un percorso assoluto;Mandali a
sudo rm -rfusarexargs.
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 sudoperché 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
lsoutput questo è già un comando scritto male, anche con la citazione. lsusa anche le impostazioni locali per l'ordinamento, penso, quindi non vedo lo scopo di headrimuovere gli ultimi 2 (a meno che tu non stia cercando di sbarazzarti di .e ..che iirc non sia consentito come argomenti per rmcomunque. Basta usare find /path/to/folder -type f delete. E no sudose corri da cron - cron è già al livello principale
printf -- '%s\0' /path/to/some/folder/* | head -zn -2 | xargs -0 rm?