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
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 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 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ä, ohittamattals
. (Tarkat tulokset voivat riippua komentotulkin ' globaaleista vaihtoehdoista.) -
.txt$
vastaa merkkijonoja, jotka päättyvättxt
pisteestä riippumatta. Koskagrep
ottaa säännöllisen lausekkeen parametrina. Joten tiedostota.txt
jaaatxt
jaa-txt
vastaavat 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
-I
voi olla hyödyllinen, mutta katso miksi ei jäsennettäisi ls . Ja mitä| xargs
saavuttaa? Ilman argumentteja se toimii vainecho
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")
ls
, ennen kuin yrität todella soittaarm
.