Risposte:
Puoi usare find
:
find . -type f ! -name '*.txt' -delete
O le funzionalità di globbing estese di bash:
shopt -s extglob
rm *.!(txt)
O in zsh:
setopt extendedglob
rm *~*.txt(.)
# || ^^^ Only plain files
# ||^^^^^ files ending in ".txt"
# | \Except
# \Everything
*.!(txt)
essere !(*.txt)
?
rm
si soffocerebbe se ci fossero cartelle.
find . -type f ! -name "*.txt" | xargs -r rm
che funzionerebbe in GNU \ xargs. Il comando xargs BSD e UNIX potrebbe non avere -r devi controllare il tuo localeman xargs
Se desideri solo eliminare tutti i file tranne '* .txt', puoi utilizzare il seguente comando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
ma se vuoi anche eliminare le directory insieme ai file, puoi usare questo:
$ find . ! -name "*.txt" -exec rm -r {} \;
Puoi usare grep e xargs invertiti
ls | grep -v .txt$| xargs rm
ls | grep -v *.txt | xargs rm
funziona altrettanto bene
grep -v *.txt
funzionerà solo se c'è esattamente un .txt
file. Se non ce n'è, grep
userà *.txt
come modello; se ce n'è più di uno, cercherà il primo nome file all'interno di tutti gli altri .txt
file, ignorando l'output da ls
. (I risultati esatti potrebbero dipendere dalle opzioni glob della shell.)
.txt$
corrisponderà alle stringhe che terminano txt
indipendentemente dal punto. Perché grep
accetta l'espressione regolare come parametro. Così i file a.txt
e le aatxt
e a-txt
saranno tutti abbinati con questa espressione. L'espressione corretta dovrebbe essere ls | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Per le persone curiose: se vuoi giocare con l'espressione in modo sicuro usa questa espressione di prova ls | grep \\.txt$ | xargs --no-run-if-empty echo
(nota: non c'è -v
bandiera e rm=>echo
). Nota2: potresti aver notato una doppia barra rovesciata. Uno è per regex, un altro è per bash per sfuggire alla barra.
Fai semplicemente:
rm $(ls -I "*.txt" )
# Elimina il tipo di file tranne * .txt
Allo stesso modo, se è necessario eliminare "tranne uno o più tipi di file", eseguire:
rm $(ls -I "*.txt" -I "*.pdf" )
# Elimina i tipi di file tranne * .txt & * .pdf
-I
opzione potrebbe essere utile, ma vedi perché non analizzare ls . E che cosa | xargs
ottiene? Senza alcun argomento, funziona solo echo
su tutti i suoi input.
xargs
dovrebbe raggiungere?
Questo funziona anche per rimuovere tutti i file e le cartelle nascosti (punto) tranne quello indicato ( .mydir
):
rm -rf $(ls -aI ".mydir")
ls
prima di tentare effettivamente di chiamarerm
.