Kuinka poistaa kaikki tiedostot Linuxissa, Paitsi kuvio * .txt?

Tiedän kuinka poistaa kaikki txt nykyisen hakemiston tiedostot rm *.txt. Tietääkö kukaan, kuinka kaikki tiedostot poistetaan nykyisestä hakemistosta, PAITSI txt -tiedostoa?

Kommentit

  • Kuten testaa annetut vastaukset aina vaarattomalla komennolla, kuten ls, ennen kuin yrität todella soittaa rm.
  • ^ Tämä kaveri ei ' halua elää vaarallisesti .. 🙂

Vastaa

Voit käyttää find:

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

Tai bashin laajennettuja huijausominaisuuksia:

shopt -s extglob rm *.!(txt) 

Tai zsh-muodossa:

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

kommentit

  • Joitakin näistä on ehkä mukautettava sen mukaan, onko sinulla kansioita ja mitä haluat tehdä niille.
  • Pitäisi ' t *.!(txt) be !(*.txt)?
  • @LauriRanta riippuu siitä, mitä ' kansiossa, jonka meillä on ' t saanut vastauksen. ' on hieno ikään kuin jos kaikilla tiedostoilla olisi laajennuksia, ja rm tukehtuisi, jos kansioita olisi.
  • Minulla on ' ongelma suluissa. Kun käytän huutavaa tyyliä bash-komentosarjassa, se valittaa syntaksivirheestä ja sulkeista. Kuitenkin sen tekeminen CLI: stä toimii.
  • @izogfif tarkista, että tämä find . -type f ! -name "*.txt" | xargs -r rm toimisi GNU \ xargsissa. BSD- ja UNIX xargs -komennoilla ei ehkä ole -r sinun on tarkistettava paikallinen man xargs

vastaus

Jos haluat vain poistaa kaikki -tiedostot paitsi ”* .txt”, voit käytä seuraavaa komentoa:

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

mutta jos haluat myös poistaa hakemistot yhdessä tiedostojen kanssa, voit käyttää tätä:

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

Vastaa

siihen on monia tapoja. mutta yksinkertaisin tapa olisi (bash):

shopt -s extglob rm !(*.txt) 

kommentit

  • Kuinka voin käyttää määritetäänkö tämä useita laajennuksia?
  • shopt -s extglob on tehokas. tecmint.com/… tarjoaa hyviä esimerkkejä. Jos haluat poistaa kaikki lukuun ottamatta tiettyjä laajennuksia, rm -v !(*.zip|*.odt) toimii.

Vastaa

Voit käyttää käänteisiä grep- ja xargs-tiedostoja

ls | grep -v .txt$| xargs rm 

Kommentit

  • ls | grep -v *.txt | xargs rm toimii yhtä hyvin
  • @phillipsk grep -v *.txt toimii vain, jos siellä on ' tarkalleen yhden .txt -tiedoston. Jos sellaista ei ole, grep käyttää mallina *.txt; jos ' on enemmän kuin yksi, se etsii ensimmäistä tiedostonimeä kaikkien muiden .txt -tiedostojen sisältä, ohittamatta ls. (Tarkat tulokset voivat riippua komentotulkin ' globaaleista vaihtoehdoista.)
  • .txt$ vastaa merkkijonoja, jotka päättyvät txt pisteestä riippumatta. Koska grep ottaa säännöllisen lausekkeen parametrina. Joten tiedostot a.txt ja aatxt ja a-txt vastaavat kaikki tämä lauseke. Oikean lausekkeen tulee olla ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. Uteliaille: Jos haluat pelata ilmaisulla turvallisesti, käytä tätä testilauseketta ls | grep \\.txt$ | xargs --no-run-if-empty echo (huomautus: ' s ei -v -lippu ja rm=>echo). Huom.2: Olet ehkä huomannut kaksoisviivan. Yksi on regexille, toinen bashille, jotta vältetään kauttaviiva.

Vastaa

Yksi ratkaisu ilman find:

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

Tämän pitäisi toimia kaikentyyppisissä kuoreissa.

Vastaa

Tee vain:

rm $(ls -I "*.txt" ) #Poistaa tiedostotyypin paitsi * .txt

Samoin, jos sinun on poistettava ”paitsi yksi tai useampi tiedostotyyppi”, tee:

rm $(ls -I "*.txt" -I "*.pdf" ) #Poistaa tiedostotyypit paitsi * .txt & * .pdf

kommentit

  • Tervetuloa StackExchangeen!Vaihtoehto -I voi olla hyödyllinen, mutta katso miksi ei jäsennettäisi ls . Ja mitä | xargs saavuttaa? Ilman argumentteja se toimii vain echo kaikilla syötteillään.
  • Mitä xargs on tarkoitus saavuttaa?
  • Kiitos, xargs ei ollut hyödyllinen edellä mainitussa tapauksessa, on korjattu nyt.

Vastaa

Tämä toimii myös kaikkien piilotettujen (piste) tiedostojen ja kansioiden poistamiseen, paitsi ilmoitetun (.mydir):

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

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *