În linux, cum să ștergeți toate fișierele EXCEPȚI modelul * .txt?

Știu cum să șterg toate fișierele txt din directorul curent de rm *.txt. Știe cineva cum să șteargă toate fișierele din directorul curent EXCEPT txt fișier?

Comentarii

  • Ca întotdeauna, testați răspunsurile date cu o comandă inofensivă precum ls înainte de a încerca efectiv să apelați rm.
  • ^ Acest lucru tipului ' nu-i place să trăiască periculos .. 🙂

Răspunde

Puteți utiliza find:

find . -type f ! -name "*.txt" -delete 

Sau bash „s caracteristici extinse globbing:

shopt -s extglob rm *.!(txt) 

Sau în zsh:

setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything 

Comentarii

  • Este posibil ca unele dintre acestea să fie adaptate în funcție de dacă aveți foldere și de ceea ce doriți să faceți cu ele.
  • Nu ar trebui să ' t *.!(txt) be !(*.txt)?
  • @LauriRanta depinde de ce ' în dosar, pe care nu l-am ' nu am primit un răspuns la. ' este bine așa cum ar fi dacă toate fișierele au extensii și rm s-ar înăbuși dacă ar exista foldere.
  • Am ' am primit o problemă cu parantezele. Când folosesc stilul globbing într-un script bash, acesta se plânge de o eroare de sintaxă și de paranteze. Cu toate acestea, a face acest lucru din CLI funcționează.
  • @izogfif verificați acest lucru find . -type f ! -name "*.txt" | xargs -r rm ar funcționa în GNU \ xargs. Este posibil ca comanda BSD și UNIX xargs să nu aibă -r trebuie să vă verificați man xargs local

div

Răspuns

Dacă doriți doar să ștergeți toate fișiere cu excepția „* .txt”, atunci puteți utilizați următoarea comandă:

$ find . -type f ! -name "*.txt" -exec rm -rf {} \;

dar dacă doriți și să ștergeți directoare împreună cu fișierele, puteți utiliza acest lucru:

$ find . ! -name "*.txt" -exec rm -r {} \;

Răspuns

există multe modalități de a face acest lucru. dar cel mai simplu mod ar fi (bash):

shopt -s extglob rm !(*.txt) 

Comentarii

  • Cum pot folosi aceasta pentru a specifica mai multe extensii?
  • shopt -s extglob este puternic. tecmint.com/… oferă exemple bune. Pentru a șterge toate cu excepția anumitor extensii, funcționează rm -v !(*.zip|*.odt).

Răspunde

Puteți utiliza grep și xargs inversate

ls | grep -v .txt$| xargs rm 

Comentarii

  • ls | grep -v *.txt | xargs rm funcționează la fel de bine
  • @phillipsk grep -v *.txt va funcționa numai dacă există ' este exact un fișier .txt. Dacă nu există, grep va folosi *.txt ca model; dacă există ' mai multe, va căuta primul nume de fișier în toate celelalte fișiere .txt, ignorând ieșirea din ls. (Rezultatele exacte pot depinde de opțiunile glob ale shell-ului '.)
  • .txt$ va potrivi șirurile care se termină cu txt indiferent de punct. Deoarece grep ia expresia regulată ca parametru. Deci, fișierele a.txt și aatxt și a-txt vor fi toate potrivite cu această expresie. Expresia corectă ar trebui să fie ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Pentru curioși: dacă doriți să vă jucați cu expresia în siguranță, utilizați această expresie de test ls | grep \\.txt$ | xargs --no-run-if-empty echo (notă: nu există ' s -v pavilion și rm=>echo). Notă2: este posibil să fi observat o bară inversă dublă. Una este pentru regex, alta este pentru bash să scape de slash.

Răspuns

O soluție fără find:

mv dir/*.txt otherdir/ rm -r dir mv otherdir dir 

Acest lucru ar trebui să funcționeze pe tot felul de cochilii.

Răspuns

Pur și simplu faceți:

rm $(ls -I "*.txt" ) # Șterge tipul de fișier cu excepția * .txt

La fel, dacă este necesar să ștergeți „cu excepția unuia sau mai multor tipuri de fișiere”, faceți:

rm $(ls -I "*.txt" -I "*.pdf" ) #Deletes tipuri de fișiere cu excepția * .txt & * .pdf

Comentarii

  • Bine ați venit la StackExchange!Opțiunea -I ar putea fi utilă, dar consultați de ce nu analizați ls . Și ce realizează | xargs? Fără argumente, acesta rulează doar echo pe toate intrările sale.
  • Ce se dorește să realizeze xargs?
  • Mulțumesc, xargs nu a fost util în cazul de mai sus, s-au corectat acum.

Răspuns

Acest lucru funcționează și pentru a elimina toate ascunse (punct) , cu excepția celui menționat (.mydir):

rm -rf $(ls -aI ".mydir") 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *