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
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 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 extglob
er 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 rm
fungerer like bra - @phillipsk
grep -v *.txt
fungerer bare hvis det ' er nøyaktig en.txt
-fil. Hvis det ikke er noen, vilgrep
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 frals
. (Nøyaktige resultater kan avhenge av shell ' s globalternativer.) -
.txt$
vil matche strenger som slutter medtxt
uansett prikk. Fordigrep
tar vanlig uttrykk som parameter. Så filera.txt
ogaatxt
oga-txt
vil 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-v
flagg 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 bareecho
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")
ls
før du faktisk prøver å ringerm
.