A linuxban hogyan lehet az összes fájlt törölni, KIVÉVE a * .txt mintát?

Tudom, hogyan törölhetem az összes aktuális könyvtár alatti txt fájlt rm *.txt. Tudja valaki, hogyan kell törölni az összes fájlt az aktuális könyvtárban, KIVÉTELE txt fájlt?

Megjegyzések

  • Mint mindig tesztelje a megadott válaszokat egy ártalmatlan paranccsal, például ls, mielőtt valóban megkísérelné hívni a rm -et.
  • ^ Ez A srác nem szereti ' nem szeret veszélyesen élni .. 🙂

Válasz

Használhatja a find:

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

Vagy a bash kibővített funkcióit:

shopt -s extglob rm *.!(txt) 

Vagy zsh-ben:

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

Megjegyzések

  • Ezek némelyikét lehet, hogy módosítani kell attól függően, hogy vannak-e mappái és mit szeretne velük kezdeni.
  • Nem kellene ' t *.!(txt) be !(*.txt)?
  • @LauriRanta attól függ, mit ' a mappában, amelyet ' t nem kapott választ erre. ' rendben van, mintha minden fájl kiterjesztésű lenne, és rm fulladna, ha mappák lennének.
  • <

problémám van a zárójelekkel. Amikor egy bash szkriptben használom a globbing stílust, az szintaktikai hibára és a zárójelekre panaszkodik. Azonban a CLI-ből való végrehajtás működik.

  • @izogfif ellenőrizze, hogy ez a find . -type f ! -name "*.txt" | xargs -r rm működni fog-e a GNU \ xargs-ban. Előfordulhat, hogy a BSD és a UNIX xargs parancsnak nincs -r ellenőrzése a helyi man xargs
  • Válasz

    Ha csak az összes fájlt törölni szeretné, kivéve a “* .txt” fájlt, akkor használja a következő parancsot:

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

    de ha törölni akarja a könyvtárak a fájlokkal együtt, akkor ezt használhatja:

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

    Válasz

    sokféleképpen lehet megtenni. de a legegyszerűbb módszer a következő lenne (bash):

    shopt -s extglob rm !(*.txt) 

    Megjegyzések

    • Hogyan használhatom ez több kiterjesztés megadásához?
    • shopt -s extglob erőteljes. A tecmint.com/… jó példákat mutat be. Az összes bizonyos kiterjesztés kivételével rm -v !(*.zip|*.odt) működik.

    Válasz

    Használhatja az invert grep és az xargs

    ls | grep -v .txt$| xargs rm 

    Megjegyzés

    • ls | grep -v *.txt | xargs rm ugyanolyan jól működik
    • @phillipsk grep -v *.txt csak akkor fog működni, ha ' pontosan egy .txt fájlt. Ha nincs, akkor a grep az *.txt -t fogja használni mintaként; ha ' több van, akkor az összes többi .txt fájl belsejében keresi az első fájlnevet, figyelmen kívül hagyva a ls. (A pontos eredmények a héj ' s glob opcióitól függhetnek.)
    • .txt$ megegyezik a div id = “e3681bed20″>

    a ponttól függetlenül. Mivel a grep a reguláris kifejezést veszi paraméterként. Tehát a a.txt és a aatxt és a a-txt fájlok mindegyikét meg fogja egyezni ez a kifejezés. A helyes kifejezésnek ls | grep -v \\.txt$ | xargs --no-run-if-empty rm kell lennie. Kíváncsi emberek számára: Ha biztonságosan el akarja játszani a kifejezést, használja ezt a tesztet: ls | grep \\.txt$ | xargs --no-run-if-empty echo (megjegyzés: ' s nem -v jelző és rm=>echo). 2. megjegyzés: lehet, hogy kettős visszavonást észlelt. Az egyik a regexre, a másik az, hogy a bash elkerülje a perjelet.

    Válasz

    Egy megoldás find:

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

    Ennek mindenféle héjnál működnie kell.

    Válasz

    Egyszerűen tegye:

    rm $(ls -I "*.txt" ) #Törli a fájltípust, kivéve a * .txt

    Hasonlóképpen, ha törölnie kell az “egy vagy több fájltípus kivételével” műveletet, tegye a következőket:

    rm $(ls -I "*.txt" -I "*.pdf" ) #Törli a fájltípusokat, kivéve a * .txt & * .pdf

    megjegyzéseket

    • Üdvözöljük a StackExchange-ben!A -I opció hasznos lehet, de lásd: , miért nem elemzi az ls-t . És mit ér el a | xargs? Minden érv nélkül csak a echo fájlt futtatja az összes bemenetén.
    • Mit kell elérnie xargs?
    • Köszönöm, az xargs nem volt hasznos a fenti esetben, most kijavítottuk.

      Ez az összes rejtett (pont) fájl és mappa eltávolítására is szolgál, kivéve a kijelöltet (.mydir):

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

    Vélemény, hozzászólás?

    Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük