So come eliminare tutti i txt
file nella directory corrente tramite rm *.txt
. Qualcuno sa come eliminare tutti i file nella directory corrente TRANNE il file txt
?
Commenti
Rispondi
Puoi utilizzare find
:
find . -type f ! -name "*.txt" -delete
Oppure bash “s funzionalità di globbing esteso:
shopt -s extglob rm *.!(txt)
O in zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Commenti
- Alcuni di questi potrebbero dover essere adattati a seconda che si disponga di cartelle e cosa si desidera fare con esse.
- Non dovrebbe ' t
*.!(txt)
be!(*.txt)
? - @LauriRanta dipende da cosa ' nella cartella, che non abbiamo ' ho ottenuto una risposta a. ' va bene come se tutti i file avessero estensioni e
rm
si strozzerebbe se ci fossero cartelle. - Ho ' ho un problema con le parentesi. Quando utilizzo lo stile globbing in uno script bash, si lamenta di un errore di sintassi e delle parentesi. Comunque farlo dalla CLI funziona.
- @izogfif controlla che
find . -type f ! -name "*.txt" | xargs -r rm
funzionerebbe in GNU \ xargs. I comandi BSD e UNIX xargs potrebbero non avere -r devi controllare il tuoman xargs
Risposta
Se desideri eliminare tutti i file tranne “* .txt”, puoi utilizza il seguente comando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
ma se desideri eliminare anche directory insieme ai file, puoi utilizzare questo:
$ find . ! -name "*.txt" -exec rm -r {} \;
Risposta
ci sono molti modi per farlo. ma il modo più semplice sarebbe (bash):
shopt -s extglob rm !(*.txt)
Commenti
- Come posso usare questo per specificare più estensioni?
-
shopt -s extglob
è potente. tecmint.com/… fornisce buoni esempi. Per eliminare tutte tranne alcune estensioni,rm -v !(*.zip|*.odt)
funziona.
Rispondi
Puoi utilizzare grep e xargs invertiti
ls | grep -v .txt$| xargs rm
Commenti
-
ls | grep -v *.txt | xargs rm
funziona altrettanto bene - @phillipsk
grep -v *.txt
funziona solo se ' è esattamente un.txt
file. Se non ce ne sono,grep
utilizzerà*.txt
come pattern; se ' ce ne sono più di uno, cercherà il primo nome di file allinterno di tutti gli altri file.txt
, ignorando loutput dils
. (I risultati esatti possono dipendere dalle ' opzioni glob della shell.) -
.txt$
corrisponderà alle stringhe che terminano contxt
indipendentemente dal punto. Perchégrep
accetta lespressione regolare come parametro. Quindi i filea.txt
eaatxt
ea-txt
saranno tutti abbinati a questa espressione. Lespressione corretta dovrebbe esserels | grep -v \\.txt$ | xargs --no-run-if-empty rm
. Per i curiosi: se vuoi giocare con lespressione in sicurezza, usa questa espressione di provals | grep \\.txt$ | xargs --no-run-if-empty echo
(nota: non cè ' s no-v
flag erm=>echo
). Nota 2: potresti aver notato una doppia barra rovesciata. Uno è per regex, un altro è per bash per sfuggire alla barra.
Answer
Una soluzione senza find
:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Questo dovrebbe funzionare su tutti i tipi di shell.
Risposta
Fai semplicemente:
rm $(ls -I "*.txt" )
#Deletes tipo di file tranne * .txt
Allo stesso modo, se è necessario eliminare “eccetto uno o più tipi di file”, eseguire:
rm $(ls -I "*.txt" -I "*.pdf" )
# Elimina tipi di file eccetto * .txt & * .pdf
Commenti
- Benvenuto in StackExchange!Lopzione
-I
potrebbe essere utile, ma vedi perché non analizzare ls . E cosa ottiene| xargs
? Senza argomenti, esegue semplicementeecho
su tutti i suoi input. - Che cosa dovrebbe ottenere
xargs
? - Grazie, xargs non è stato utile nel caso precedente, ora ho corretto.
Risposta
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
.