Voglio rimuovere tutti i file in una directory lasciando solo alcuni file specificati, non hanno nulla in comune per nome. Come potrei farlo?
Ad esempio, i nomi dei file che voglio conservare sono:
file_1.png
, another_file.jpg
,some_music.mp3
Voglio rimuovere tutti i file in una directory lasciando solo alcuni file specificati, non hanno nulla in comune per nome. Come potrei farlo?
Ad esempio, i nomi dei file che voglio conservare sono:
file_1.png
, another_file.jpg
,some_music.mp3
Risposte:
Se stai usando bash:
shopt -s extglob
rm -- !(file1|file2|file3)
La prima riga attiva solo la corrispondenza estesa del modello e successivamente ne usiamo una:
!(pattern-list)
corrisponde a qualsiasi cosa tranne uno dei modelli indicati
e l'elenco dei modelli è un elenco di uno o più motivi separati da un |
.
O con zsh
setopt extendedglob
rm -- ^(file1|file2)
O, più portatile, usando find
:
find . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -v {} +
Crea una sottodirectory tmp
, sposta tutti i file che vuoi conservare in quella directory ed esegui rm -f *
successivamente. Ciò non influirà sulla tmp
directory.
Dopo di che basta fare:
mv tmp/* .
rmdir tmp
(Supponendo che nessuno dei file spostati inizi con un punto).
Questo è uno dei pochi casi in cui ha senso utilizzare il mouse e un browser di file come Nautilus in cui è possibile effettivamente fare Ctrlclic sui pochi file che si desidera conservare e quindi utilizzare il menu: Edit -> Invert Selection
per ottenere gli altri file e quindi eliminare quelli .
ls
per vedere se non hai perso nessuno dei file che vuoi conservare.
Aggiungi i nomi dei file che desideri conservare in un file di testo, uno per riga. Questo file non dovrebbe trovarsi nella directory o dovresti aggiungere anche il suo nome.
Se il nome della directory è foo e il nome del file è bar , procedere come segue.
find foo -type f -print0|grep -vzZ -f bar|xargs -0 rm
Questo fa quanto segue:
find -type f
cerca i nomi di tutti i file in foo e nelle sue sottodirectory e li stampa su STDOUT. Con l'opzione -print0
delimita i nomi dei file con byte NUL.grep -v -f bar
esclude tutti i nomi di file che corrispondono a una riga nella barra . Con l'opzione -z
tratta il suo input come un insieme di linee delimitate dal byte NUL, con l'opzione -Z
delimita il suo output con un byte NUL.xargs rm
chiama rm
ripetutamente per eliminare i file. Con l'opzione -0
tratta il suo input come un insieme di linee delimitate dal byte NUL.Funziona con nomi di file contenenti spazi bianchi.
find
, preferirei farlofind . -maxdepth 1 ! -name 'file1' ! -name 'file2' -type f -exec rm -vi {} +
shopt -u extglob
).