Risposte:
Invece di usare rm, potrebbe essere più facile usare find . Un comando come questo eliminerebbe tutto tranne un file chiamato esattamente "file"
find . \! -name 'file' -delete
Molte versioni di dovrebbero essere in grado di supportare il globbing e la corrispondenza delle espressioni regolari.
Potresti anche reindirizzare l'output di find a rm
find . \! -name '*pattern*' -print0 | xargs --null rm
-delete
così come quali file verranno salvati rimuovendo -delete
e \!
.
find
è ricorsivo! così anche tutte le sottodirectory dei file che non corrispondono a " pattern " verranno eliminate
Uso di zsh, con setopt EXTENDED_GLOB
, utilizzo ~
dell'operatore ( tranne )
rm -- *~(x|y|z)
o ^
operatore (negazione):
rm -- ^(x|y|z)
Tuttavia, dovresti probabilmente spostare i file altrove, quindi eliminare tutto. È molto più sicuro in termini di scivolamenti delle dita, come colpire entrare troppo presto.
Le versioni successive di bash hanno l' extglob
opzione shell che ti dà una sintassi per fare quello che vuoi (controlla la tua pagina man in "Espansione percorso" per vedere se la tua versione installata ce l'ha):
$ shopt -s extglob # turn on extended globbing
$ rm !(X|Y|Z)
Per provare, ti suggerisco di sostituire prima rm
con echo
per vedere se l'elenco dei file da eliminare è quello che ti aspetti.
ls -1 | grep -v "^[XYZ]$" # | xargs rm -r
Attenzione: eseguire il comando e se i file da eliminare sono quelli giusti, eseguirlo nuovamente ed eliminare il carattere hash "#".
Se i nomi dei file sono più complicati, allora
ls -1 | egrep -v "^file1$|^filename2$|^f1le$" # | xargs rm -r
Ancora una volta, prima guarda i risultati, quindi rimuovi il segno hash.
Questa versione - come suggerito nei commenti - salva alcuni personaggi e appare un po 'più chiara.
ls -1 | egrep -v "^(file1|filename2|f1le)$" # | xargs rm -r
a
, b
e a b
il primo programma cancellerà - se si mette ab nella parte grep: "^[ab]$"
a
e b
ma non a b
, proprio al contrario di vostre intenzioni. Il secondo comando farà lo stesso. E anche il terzo. Non dovresti usare 'ls' negli script, con eccezioni molto, molto rare. Basta non farlo.
Sposta i file che vuoi tenere lontano. Salire di un livello, eliminare la cartella. Ricreare la cartella e spostare indietro quei file.
/
, eh? Non molto pratico. c) Cercare di rimuovere tutti i file nel tuo $HOME
non è nemmeno molto pratico.
Questo è ciò che ho impostato come script .sh per un hook di logout OSX / MacOS, funziona abbastanza bene.
#! /bin/bash
for dir in /PathToFolder/*
do
if [ ! "$dir" = "/PathToFolder/FolderToKeep1" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep2" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep3" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep4" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep5" ] && [ ! "$dir" = "/PathToFolder/FolderToKeep6" ] ; then
echo ${dir}
sudo rm -R $dir user
dscl . -delete $dir
fi
done
exit 0
Con GNU-find puoi usare l'opzione -delete, che rimuove anche le directory, se vuote:
find tmp -not -name X -not -name Y -not -name Z -delete
find tmp -maxdepth 1 -not -name X -not -name Y -not -name Z -delete
è un modo per aggirare questo.
tmp
se non ci fossero X
/ Y
/ Z
file in esso. Nota !
come equivalente standard di GNU -not
( -delete
è anche un'estensione GNU)