Jag vet hur jag tar bort alla txt
-filer under aktuell katalog med rm *.txt
. Vet någon hur man tar bort alla filer i den aktuella katalogen FÖR txt
-fil?
Kommentarer
Svar
Du kan använda find
:
find . -type f ! -name "*.txt" -delete
Eller bashs utökade globfunktioner:
shopt -s extglob rm *.!(txt)
Eller i zsh:
setopt extendedglob rm *~*.txt(.) # || ^^^ Only plain files # ||^^^^^ files ending in ".txt" # | \Except # \Everything
Kommentarer
- Vissa av dessa kan behöva anpassas beroende på om du har mappar och vad du vill göra med dem.
- Bör ' t
*.!(txt)
vara!(*.txt)
? - @LauriRanta beror på vad ' s i mappen, som vi inte har ' t fick svar på. Det är ' som om alla filer har tillägg och
rm
skulle kvävas om det fanns mappar. - Jag ' har fått ett problem med parenteserna. När jag använder klotstilen i ett bash-skript klagar det på ett syntaxfel och inom parenteserna. Att göra det från CLI fungerar dock.
- @izogfif kolla det här
find . -type f ! -name "*.txt" | xargs -r rm
skulle fungera i GNU \ xargs. BSD och UNIX xargs-kommandot kanske inte har -r du måste kontrollera ditt lokalaman xargs
Svar
Om du bara vill ta bort alla filer utom ”* .txt” så kan du använd följande kommando:
$ find . -type f ! -name "*.txt" -exec rm -rf {} \;
men om du också vill ta bort kataloger tillsammans med filerna så kan du använda detta:
$ find . ! -name "*.txt" -exec rm -r {} \;
Svar
det finns många sätt att göra det. men det enklaste sättet skulle vara (bash):
shopt -s extglob rm !(*.txt)
Kommentarer
- Hur kan jag använda detta för att specificera flera tillägg?
-
shopt -s extglob
är kraftfullt. tecmint.com/… ger bra exempel. För att radera alla utom vissa tillägg fungerarrm -v !(*.zip|*.odt)
.
Svar
Du kan använda inverterad grep och xargs
ls | grep -v .txt$| xargs rm
Kommentarer
-
ls | grep -v *.txt | xargs rm
fungerar lika bra - @phillipsk
grep -v *.txt
fungerar bara om det finns ' är exakt en.txt
-fil. Om det inte finns någon kommergrep
att använda*.txt
som mönster; om det finns ' mer än en, kommer den att söka efter det första filnamnet i alla de andra.txt
-filerna och ignorera utdata frånls
. (Exakta resultat kan bero på skalets ' s globalternativ.) -
.txt$
matchar strängar som slutar medtxt
oavsett punkt. Eftersomgrep
tar regelbundet uttryck som parameter. Så filera.txt
ochaatxt
ocha-txt
matchas alla av detta uttryck. Rätt uttryck ska varals | grep -v \\.txt$ | xargs --no-run-if-empty rm
. För nyfikna människor: Om du vill leka med uttrycket på ett säkert sätt kan du använda detta testuttryckls | grep \\.txt$ | xargs --no-run-if-empty echo
(Obs: det finns ' ingen-v
flagga ochrm=>echo
). Anmärkning2: du kanske har lagt märke till dubbla snedstreck. En är för regex, en annan är för bash att undkomma snedstreck.
Svar
En lösning utan find
:
mv dir/*.txt otherdir/ rm -r dir mv otherdir dir
Detta borde fungera på alla slags skal.
Svar
Gör helt enkelt:
rm $(ls -I "*.txt" )
#Raderar filtyp utom * .txt
På samma sätt, om du behöver ta bort ”utom en eller flera filtyper”, gör:
rm $(ls -I "*.txt" -I "*.pdf" )
# Raderar filtyper utom * .txt & * .pdf
Kommentarer
- Välkommen till StackExchange!Alternativet
-I
kan vara användbart, men se varför inte analysera ls . Och vad uppnår| xargs
? Utan några argument kör den baraecho
på alla dess inmatningar. - Vad ska
xargs
uppnå? - Tack, xargs var inte användbart i ovanstående fall, har korrigerats nu.
Svar
Detta fungerar också för att ta bort alla dolda (punkt) filer och mappar förutom den angivna (.mydir
):
rm -rf $(ls -aI ".mydir")
ls
innan du faktiskt försöker ringarm
.