Hvordan slettes alle filer i Linux UNDTAGEN mønsteret * .txt?

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

  • Som test altid de givne svar med en harmløs kommando som ls før du faktisk prøver at ringe til rm.
  • ^ Dette fyr ' kan ikke lide at leve farligt .. 🙂

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 rm ville 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 rm fungerer i GNU \ xargs. BSD og UNIX xargs-kommandoen har muligvis ikke -r du skal kontrollere dit lokale man 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 extglob er kraftfuldt. tecmint.com/… giver gode eksempler. For at slette alle undtagen bestemte udvidelser fungerer rm -v !(*.zip|*.odt).

Svar

Du kan bruge inverteret grep og xargs

ls | grep -v .txt$| xargs rm 

Kommentarer

  • ls | grep -v *.txt | xargs rm fungerer lige så godt
  • @phillipsk grep -v *.txt fungerer kun, hvis der ' er nøjagtigt en .txt -fil. Hvis der ikke er nogen, vil grep bruge *.txt som mønster; hvis der ' er mere end en, vil den søge efter det første filnavn i alle de andre .txt filer og ignorere output fra ls. (Nøjagtige resultater kan afhænge af skallen ' s glob-muligheder.)
  • .txt$ matcher strenge, der slutter med txt uanset prikken. Fordi grep tager regelmæssigt udtryk som parameter. Så filer a.txt og aatxt og a-txt matches alle med dette udtryk. Korrekt udtryk skal være ls | grep -v \\.txt$ | xargs --no-run-if-empty rm. For nysgerrige mennesker: Hvis du vil lege med udtrykket sikkert, skal du bruge dette testudtryk ls | grep \\.txt$ | xargs --no-run-if-empty echo (note: der ' er ingen -v flag og rm=>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 -I kan være nyttig, men se hvorfor ikke parse ls . Og hvad opnår | xargs? Uden argumenter kører den bare echo på alle dens input.
  • Hvad skal xargs opnå?
  • 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") 

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *