Di recente mi sono trovato di fronte al compito di eliminare tutti i file / cartelle in una directory escludendo quelli corrispondenti a un modello specifico. Quindi ho elaborato un comando unix a riga singola per fare il lavoro. Deve essere solo una riga? Suppongo di no, ma è decisamente più bello in quel modo!
Mentre il problema è piuttosto semplice, sono rimasto un po 'sorpreso da quanto sia complessa la mia soluzione. Ecco il comando che ho usato; NOTA: questa è una soluzione scadente perché non gestisce nomi di file contenenti caratteri di avanzamento riga (che non importa nella mia situazione).
ls | grep -v PATTERN | xargs -n1 -IREPLACE rm -rf REPLACE
Non ho usato il comando "trova" perché non voglio ricorrere in cartelle corrispondenti a PATTERN. Ad esempio, considera la seguente struttura di file:
file_foo.txt
first_dir
|
+--> contents
+--> ...
foo_dir
|
+--> anotherfile.txt
+--> morefiles.log
foo_file.txt
somefile.txt
L'uso del modello "pippo" deve solo rimuovere "first_dir" (e ovviamente i suoi contenuti) e "somefile.txt" ( non "anotherfile.txt" o "morefiles.log").
Domanda, ci sono modi migliori (più eleganti e corretti) per raggiungere questo obiettivo?
EDIT:
Di recente è stato portato alla mia attenzione che "trova" potrebbe essere un'opzione migliore :
find * -maxdepth 0 ! -name PATTERN -print0 | xargs -0n1 rm -rf
Questa soluzione gestisce correttamente i percorsi contenenti caratteri di avanzamento riga.