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
rmsi 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 rmfunzionerebbe 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 rmfunziona altrettanto bene - @phillipsk
grep -v *.txtfunziona solo se ' è esattamente un.txtfile. Se non ce ne sono,greputilizzerà*.txtcome 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 contxtindipendentemente dal punto. Perchégrepaccetta lespressione regolare come parametro. Quindi i filea.txteaatxtea-txtsaranno 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-vflag 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
-Ipotrebbe essere utile, ma vedi perché non analizzare ls . E cosa ottiene| xargs? Senza argomenti, esegue semplicementeechosu 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")
lsprima di tentare effettivamente di chiamarerm.