Jeg vet hvordan jeg skal slette alle txt -filene under den aktuelle katalogen av rm *.txt. Er det noen som vet hvordan du sletter alle filene i gjeldende katalog UNNTATT txt -filen?
Kommentarer
Svar
Du kan bruke find:
find . -type f ! -name "*.txt" -delete
Eller bashs utvidede globbing-funksjoner:
shopt -s extglob rm *.!(txt)
Eller i zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Kommentarer
- Noen av disse må kanskje tilpasses avhengig av om du har mapper og hva du vil gjøre med dem.
- Skal ' t
*.!(txt)være!(*.txt)? - @LauriRanta avhenger av hva ' s i mappen, som vi ikke har ' t fikk svar på. Det er ' som om alle filene har utvidelser, og
rmville kveles hvis det var mapper. - Jeg ' har fått et problem med parentesene. Når jeg bruker globbing-stilen i et bash-skript, klager det på en syntaksfeil og parentesene. Imidlertid fungerer det fra CLI.
- @izogfif sjekk dette
find . -type f ! -name "*.txt" | xargs -r rmvil fungere i GNU \ xargs. BSD og UNIX xargs-kommando har kanskje ikke -r du må sjekke det lokaleman xargs
Svar
Hvis du bare vil slette alle filer bortsett fra «* .txt», kan du bruk følgende kommando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
men hvis du også vil slette kataloger sammen med filene, så kan du bruke dette:
$ find . ! -name "*.txt" -exec rm -r {} \;
Svar
det er mange måter å gjøre det på. men den enkleste måten ville være (bash):
shopt -s extglob rm !(*.txt)
Kommentarer
- Hvordan kan jeg bruke dette for å spesifisere flere utvidelser?
-
shopt -s extglober kraftig. tecmint.com/… gir gode eksempler. For å slette alle unntatt visse utvidelser, fungererrm -v !(*.zip|*.odt).
Svar
Du kan bruke invertert grep og xargs
ls | grep -v .txt$| xargs rm
Kommentarer
-
ls | grep -v *.txt | xargs rmfungerer like bra - @phillipsk
grep -v *.txtfungerer bare hvis det ' er nøyaktig en.txt-fil. Hvis det ikke er noen, vilgrepbruke*.txtsom mønster; hvis det ' er mer enn en, vil den søke etter det første filnavnet i alle de andre.txt-filene, og ignorere utdata frals. (Nøyaktige resultater kan avhenge av shell ' s globalternativer.) -
.txt$vil matche strenger som slutter medtxtuansett prikk. Fordigreptar vanlig uttrykk som parameter. Så filera.txtogaatxtoga-txtvil alle bli matchet av dette uttrykket. Riktig uttrykk skal værels | grep -v \\.txt$ | xargs --no-run-if-empty rm. For nysgjerrige mennesker: Hvis du vil leke med uttrykket trygt, bruk dette testuttrykketls | grep \\.txt$ | xargs --no-run-if-empty echo(merk: det ' er ingen-vflagg ogrm=>echo). Merknad 2: Du har kanskje lagt merke til dobbel tilbakeslag. Den ene er for regex, en annen er for bash å slippe skråstrek.
Svar
En løsning uten find:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Dette skal fungere på alle slags skjell.
Svar
Bare gjør:
rm $(ls -I "*.txt" ) #Sletter filtypen unntatt * .txt
På samme måte, hvis du trenger å slette «unntatt en eller flere filtyper», gjør du:
rm $(ls -I "*.txt" -I "*.pdf" ) # Sletter filtyper unntatt * .txt & * .pdf
Kommentarer
- Velkommen til StackExchange!
-I-alternativet kan være nyttig, men se hvorfor ikke analysere ls . Og hva oppnår| xargs? Uten noen argumenter kjører den bareechopå alle innspillene. - Hva skal
xargsoppnå? - Takk, xargs var ikke nyttig i ovennevnte tilfelle, har korrigert nå.
Svar
Dette fungerer også for å fjerne alle skjulte (punkt) filer og mapper bortsett fra den oppgitte filen (.mydir):
rm -rf $(ls -aI ".mydir")
lsfør du faktisk prøver å ringerm.