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
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 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 extglob
er 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 rm
fungerer lige så godt - @phillipsk
grep -v *.txt
fungerer kun, hvis der ' er nøjagtigt en.txt
-fil. Hvis der ikke er nogen, vilgrep
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 frals
. (Nøjagtige resultater kan afhænge af skallen ' s glob-muligheder.) -
.txt$
matcher strenge, der slutter medtxt
uanset prikken. Fordigrep
tager regelmæssigt udtryk som parameter. Så filera.txt
ogaatxt
oga-txt
matches 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-v
flag 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
-I
kan være nyttig, men se hvorfor ikke parse ls . Og hvad opnår| xargs
? Uden argumenter kører den bareecho
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")
ls
før du faktisk prøver at ringe tilrm
.