Jeg ved hvordan man sletter alle txt filer under den aktuelle mappe ved rm *.txt. Er der nogen, der ved, hvordan man sletter alle filer i det aktuelle bibliotek Bortset fra txt -fil?
Kommentarer
Svar
Du kan bruge find:
find . -type f ! -name "*.txt" -delete
Eller bashs udvidede globbing-funktioner:
shopt -s extglob rm *.!(txt)
Eller i zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Kommentarer
- Nogle af disse skal muligvis tilpasses, afhængigt af om du har mapper, og hvad du vil gøre med dem.
- Skal ' t
*.!(txt)være!(*.txt)? - @LauriRanta afhænger af, hvad ' s i mappen, som vi ikke har ' t fik et svar på. Det ' er fint, som hvis alle filerne har filtypenavne, og
rmville kvæles, hvis der var mapper. - Jeg ' har et problem med parenteserne. Når jeg bruger den globerende stil i et bash-script, klager det over en syntaksfejl og parenteserne. Men at gøre det fra CLI fungerer.
- @izogfif tjek dette
find . -type f ! -name "*.txt" | xargs -r rmfungerer i GNU \ xargs. BSD og UNIX xargs-kommandoen har muligvis ikke -r du skal kontrollere dit lokaleman xargs
Svar
Hvis du bare vil slette alle filer undtagen “* .txt” så kan du brug følgende kommando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
men hvis du også vil slette mapper sammen med filerne, så kan du bruge dette:
$ find . ! -name "*.txt" -exec rm -r {} \;
Svar
der er mange måder, det kan gøres på. men den mest enkle måde ville være (bash):
shopt -s extglob rm !(*.txt)
Kommentarer
- Hvordan kan jeg bruge dette for at specificere flere udvidelser?
-
shopt -s extglober kraftfuldt. tecmint.com/… giver gode eksempler. For at slette alle undtagen bestemte udvidelser fungererrm -v !(*.zip|*.odt).
Svar
Du kan bruge inverteret grep og xargs
ls | grep -v .txt$| xargs rm
Kommentarer
-
ls | grep -v *.txt | xargs rmfungerer lige så godt - @phillipsk
grep -v *.txtfungerer kun, hvis der ' er nøjagtigt en.txt-fil. Hvis der ikke er nogen, vilgrepbruge*.txtsom mønster; hvis der ' er mere end en, vil den søge efter det første filnavn i alle de andre.txtfiler og ignorere output frals. (Nøjagtige resultater kan afhænge af skallen ' s glob-muligheder.) -
.txt$matcher strenge, der slutter medtxtuanset prikken. Fordigreptager regelmæssigt udtryk som parameter. Så filera.txtogaatxtoga-txtmatches alle med dette udtryk. Korrekt udtryk skal værels | grep -v \\.txt$ | xargs --no-run-if-empty rm. For nysgerrige mennesker: Hvis du vil lege med udtrykket sikkert, skal du bruge dette testudtrykls | grep \\.txt$ | xargs --no-run-if-empty echo(note: der ' er ingen-vflag ogrm=>echo). Note2: Du har muligvis bemærket dobbelt tilbageslag. Den ene er til regex, en anden er for bash at undslippe skråstreg.
Svar
En løsning uden find:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Dette skal fungere på alle slags skaller.
Svar
Gør det blot:
rm $(ls -I "*.txt" ) # Slet filtype undtagen * .txt
Hvis det er nødvendigt at slette “undtagen en eller flere filtyper”, skal du også gøre:
rm $(ls -I "*.txt" -I "*.pdf" ) #Sletter filtyper undtagen * .txt & * .pdf
Kommentarer
- Velkommen til StackExchange!Indstillingen
-Ikan være nyttig, men se hvorfor ikke parse ls . Og hvad opnår| xargs? Uden argumenter kører den bareechopå alle dens input. - Hvad skal
xargsopnå? - Tak, xargs var ikke nyttigt i ovenstående tilfælde, er rettet nu.
Svar
Dette fungerer også for at fjerne alle skjulte (dot) filer og mapper undtagen den angivne (.mydir):
rm -rf $(ls -aI ".mydir")
lsfør du faktisk prøver at ringe tilrm.