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
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.
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é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 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 agrep
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 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
-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 aecho
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")
ls
, mielőtt valóban megkísérelné hívni arm
-et.