Hur kan jag ta bort alla filer i Linux förutom mönstret * .txt?

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

  • Som Testa alltid de givna svaren med ett ofarligt kommando som ls innan du faktiskt försöker ringa rm.
  • ^ Detta killen ' gillar inte att leva farligt .. 🙂

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 lokala man 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 fungerar rm -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 kommer grep 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ån ls. (Exakta resultat kan bero på skalets ' s globalternativ.)
  • .txt$ matchar strängar som slutar med txt oavsett punkt. Eftersom grep tar regelbundet uttryck som parameter. Så filer a.txt och aatxt och a-txt matchas alla av detta uttryck. Rätt uttryck ska vara ls | 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 testuttryck ls | grep \\.txt$ | xargs --no-run-if-empty echo (Obs: det finns ' ingen -v flagga och rm=>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 bara echo 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") 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *