Avevo bisogno di una soluzione elegante per la busybox (router), tutte le soluzioni xargs o array erano inutili per me - nessun comando disponibile lì. find and mtime non è la risposta corretta in quanto stiamo parlando di 10 articoli e non necessariamente di 10 giorni. La risposta di Espo è stata la più breve, pulita e probabilmente la più inversa.
Errore con spazi e quando nessun file deve essere eliminato sono entrambi risolti semplicemente nel modo standard:
rm "$(ls -td *.tar | awk 'NR>7')" 2>&-
Versione un po 'più educativa: possiamo fare tutto se usiamo awk in modo diverso. Normalmente, uso questo metodo per passare (restituire) variabili da awk a sh. Mentre leggiamo tutto il tempo che non si può fare, mi permetto di dissentire: ecco il metodo.
Esempio di file .tar senza problemi relativi agli spazi nel nome file. Per provare, sostituire "rm" con "ls".
eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}')
Spiegazione:
ls -td *.tar
elenca tutti i file .tar ordinati per ora. Per applicare a tutti i file nella cartella corrente, rimuovere la parte "d * .tar"
awk 'NR>7...
salta le prime 7 righe
print "rm \"" $0 "\""
costruisce una riga: rm "nome file"
eval
lo esegue
Dal momento che stiamo usando rm
, non vorrei usare il comando sopra in uno script! L'uso più saggio è:
(cd /FolderToDeleteWithin && eval $(ls -td *.tar | awk 'NR>7 { print "rm \"" $0 "\""}'))
Nel caso di usare il ls -t
comando non farà alcun danno su esempi sciocchi come: touch 'foo " bar'
etouch 'hello * world'
. Non che abbiamo mai creato file con tali nomi nella vita reale!
Nota a margine. Se volessimo passare una variabile a sh in questo modo, modificheremmo semplicemente la stampa (modulo semplice, nessuno spazio tollerato):
print "VarName="$1
per impostare la variabile VarName
sul valore di $1
. È possibile creare più variabili in una volta sola. Questa VarName
diventa una normale variabile sh e successivamente può essere normalmente utilizzata in uno script o in una shell. Quindi, per creare variabili con awk e restituirle alla shell:
eval $(ls -td *.tar | awk 'NR>7 { print "VarName=\""$1"\"" }'); echo "$VarName"