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
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
rmfulladna, 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.
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 extgloberőteljes. A tecmint.com/… jó példákat mutat be. Az összes bizonyos kiterjesztés kivételévelrm -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 rmugyanolyan jól működik - @phillipsk
grep -v *.txtcsak akkor fog működni, ha ' pontosan egy.txtfájlt. Ha nincs, akkor agrepaz*.txt-t fogja használni mintaként; ha ' több van, akkor az összes többi.txtfájl belsejében keresi az első fájlnevet, figyelmen kívül hagyva als. (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
-Iopció hasznos lehet, de lásd: , miért nem elemzi az ls-t . És mit ér el a| xargs? Minden érv nélkül csak aechofá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")
ls, mielőtt valóban megkísérelné hívni arm-et.