Tiedän kuinka poistaa kaikki txt nykyisen hakemiston tiedostot rm *.txt. Tietääkö kukaan, kuinka kaikki tiedostot poistetaan nykyisestä hakemistosta, PAITSI txt -tiedostoa?
Kommentit
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
rmtukehtuisi, 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 rmtoimisi GNU \ xargsissa. BSD- ja UNIX xargs -komennoilla ei ehkä ole -r sinun on tarkistettava paikallinenman 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 extglobon 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 rmtoimii yhtä hyvin - @phillipsk
grep -v *.txttoimii vain, jos siellä on ' tarkalleen yhden.txt-tiedoston. Jos sellaista ei ole,grepkäyttää mallina*.txt; jos ' on enemmän kuin yksi, se etsii ensimmäistä tiedostonimeä kaikkien muiden.txt-tiedostojen sisältä, ohittamattals. (Tarkat tulokset voivat riippua komentotulkin ' globaaleista vaihtoehdoista.) -
.txt$vastaa merkkijonoja, jotka päättyvättxtpisteestä riippumatta. Koskagrepottaa säännöllisen lausekkeen parametrina. Joten tiedostota.txtjaaatxtjaa-txtvastaavat kaikki tämä lauseke. Oikean lausekkeen tulee ollals | grep -v \\.txt$ | xargs --no-run-if-empty rm. Uteliaille: Jos haluat pelata ilmaisulla turvallisesti, käytä tätä testilausekettals | grep \\.txt$ | xargs --no-run-if-empty echo(huomautus: ' s ei-v-lippu jarm=>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
-Ivoi olla hyödyllinen, mutta katso miksi ei jäsennettäisi ls . Ja mitä| xargssaavuttaa? Ilman argumentteja se toimii vainechokaikilla syötteillään. - Mitä
xargson 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")
ls, ennen kuin yrität todella soittaarm.