In linux, come eliminare tutti i file TRANNE il pattern * .txt?

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

  • As sempre, verifica le risposte fornite con un comando innocuo come ls prima di tentare effettivamente di chiamare rm.
  • ^ Questo al ragazzo ' non piace vivere pericolosamente .. 🙂

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 tuo man 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 di ls. (I risultati esatti possono dipendere dalle ' opzioni glob della shell.)
  • .txt$ corrisponderà alle stringhe che terminano con txt indipendentemente dal punto. Perché grep accetta lespressione regolare come parametro. Quindi i file a.txt e aatxt e a-txt saranno tutti abbinati a questa espressione. Lespressione corretta dovrebbe essere ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Per i curiosi: se vuoi giocare con lespressione in sicurezza, usa questa espressione di prova ls | grep \\.txt$ | xargs --no-run-if-empty echo (nota: non cè ' s no -v flag e rm=>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 semplicemente echo 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") 

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *