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)?
rmsi soffocerebbe se ci fossero cartelle.
find . -type f ! -name "*.txt" | xargs -r rmche 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 rmfunziona altrettanto bene
grep -v *.txtfunzionerà solo se c'è esattamente un .txtfile. Se non ce n'è, grepuserà *.txtcome modello; se ce n'è più di uno, cercherà il primo nome file all'interno di tutti gli altri .txtfile, ignorando l'output da ls. (I risultati esatti potrebbero dipendere dalle opzioni glob della shell.)
.txt$corrisponderà alle stringhe che terminano txtindipendentemente dal punto. Perché grepaccetta l'espressione regolare come parametro. Così i file a.txte le aatxte a-txtsaranno 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'è -vbandiera 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
-Iopzione potrebbe essere utile, ma vedi perché non analizzare ls . E che cosa | xargsottiene? Senza alcun argomento, funziona solo echosu tutti i suoi input.
xargsdovrebbe raggiungere?
Questo funziona anche per rimuovere tutti i file e le cartelle nascosti (punto) tranne quello indicato ( .mydir):
rm -rf $(ls -aI ".mydir")
lsprima di tentare effettivamente di chiamarerm.