Hvordan slette alle filer i Linux, UNNTAT mønsteret * .txt?

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

  • Som Test alltid de gitte svarene med en ufarlig kommando som ls før du faktisk prøver å ringe rm.
  • ^ Dette fyren ' liker ikke å leve farlig .. 🙂

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 rm ville 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 rm vil fungere i GNU \ xargs. BSD og UNIX xargs-kommando har kanskje ikke -r du må sjekke det lokale man 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 extglob er kraftig. tecmint.com/… gir gode eksempler. For å slette alle unntatt visse utvidelser, fungerer rm -v !(*.zip|*.odt).

Svar

Du kan bruke invertert grep og xargs

ls | grep -v .txt$| xargs rm 

Kommentarer

  • ls | grep -v *.txt | xargs rm fungerer like bra
  • @phillipsk grep -v *.txt fungerer bare hvis det ' er nøyaktig en .txt -fil. Hvis det ikke er noen, vil grep bruke *.txt som 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 fra ls. (Nøyaktige resultater kan avhenge av shell ' s globalternativer.)
  • .txt$ vil matche strenger som slutter med txt uansett prikk. Fordi grep tar vanlig uttrykk som parameter. Så filer a.txt og aatxt og a-txt vil alle bli matchet av dette uttrykket. Riktig uttrykk skal være ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. For nysgjerrige mennesker: Hvis du vil leke med uttrykket trygt, bruk dette testuttrykket ls | grep \\.txt$ | xargs --no-run-if-empty echo (merk: det ' er ingen -v flagg og rm=>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 bare echo på alle innspillene.
  • Hva skal xargs oppnå?
  • 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") 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *