Jag försöker förstå skillnaden mellan dessa två kommandon:

sudo find / -name .DS_Store -delete 

och

sudo find / -name ".DS_Store" -exec rm {} \; 

Jag märkte att -exec ... {} -metoden är att föredra. Varför? Vilken är säkrare / snabbare / bättre? Jag har använt båda på min Macbook och allt verkar fungera bra.

Svar

-delete kommer att fungera bättre eftersom det inte behöver skapa en extern process för varje och alla matchade filer.

Det är möjligt att du kan se -exec rm {} \; rekommenderas ofta eftersom -delete inte finns i alla versioner av find. Jag kan inte kolla just nu men jag är ganska säker på att jag har använt en find utan den.

B andra metoder ska vara ”säkra”.

EDIT per kommentar från @doitmyway: se till att du matchar på namnet och sedan ta bort, inte tvärtom (radera, sedan matcha). Annars raderas varje fil, oavsett om den matchar eller inte . Det vill säga GÖR INTE detta: find / -delete -name .DS_Store.

En vanlig metod för att undvika kostnaden för att leka en extern process för varje matchad fil är:

find / -name .DS_Store -print0 | xargs -0 rm 

(men notera att det också finns ett portabilitetsproblem här: inte alla versioner av find har -print0!)

Kommentarer

  • ser jag. Jag ' har också läst att med -delete -omkopplaren innan -name raderas det angivna filträdet så jag antar att jag måste vara försiktig.
  • På senaste find kan du använda -exec rm {} + för att ta bort alla matchade filer med enstaka rm kommando.
  • .DS_Store inte ' t innehåller några specialtecken alls, så citaten är onödiga och ändrar ingenting i det här fallet.
  • I grund och botten är endast blanksteg (mellanslag, flikar, kanske andra) det enda som gör att en ociterad sträng tolkas som två separata kommandoradsargument, men att ' inte är allt du behöver ledsen för när du bestämmer dig för att citera eller inte. Du måste oroa dig för alla skalmetatecken som ; eller | eller > eller < och ” och många andra som har speciell betydelse för skalet såvida det inte citeras.
  • @MarcoMarsala xargs tar hand om argumentlistans problem med begränsad storlek transparent genom att dela upp det i flera anrop av kommandot.

Svar

Förutsatt att .DS_Store representerar filer och inte kataloger, är det mest portabla fortfarande snabba sättet att göra det:

sudo find / -name .DS_Store -exec rm {} + 

Den enda risken är att sudo inte är tillgänglig men den är ganska låg nuförtiden.

-delete -alternativet för att kräva GNU-sökning och är fortfarande inte standard i många andra find -implementeringar, så det är inte alltid tillgängligt.

Kommandotermineringen + i istället för \; optimerar högst exec -satsen genom att inte köra rm -kommandot för varje varje .DS_Store som finns i filsystemet.

Svar

För en sådan maskin som din macbook hittar du inte mycket skillnad i prestanda mellan de två kommandona. Men om du tittar på -exec-versionen kan du se en subtil skillnad:

sudo find / -iname ".file-to-delete" -exec rm {} \; 

Detta innebär att du hittar alla dessa filer med namn ”.file -att radera”. Men denna sökning kan returnera några oönskade falska positiva resultat. När du gör något med sudo bör du vara lite mer försiktig. Fördelen med att använda -exec rm {} är att du kan skicka argument till rm så här:

sudo find / -iname "*~" -exec rm -i {} \; 

I det här exemplet vill jag ta bort de säkerhetskopieringsfiler som emacs gör. Men den där tilde kan finnas i någon obskur fil som jag inte vet om och kan vara viktig. Plus att jag vill bekräfta borttagningen. Så jag sätter alternativet ”-i” på rm-kommandot. Detta ger mig en interaktiv radering .

Du kan också förfina användningen av rm för att ta bort kataloger såväl som filer:

find /usr/local/share/ -iname "useless" -exec rm -r {} \; 

Kort sagt, -exec ger du lite mer kontroll över det faktiska kommandot som tar bort det hittade objektet. Fördelen är att du använder ett verktyg för att hitta filerna, ett annat verktyg för att ta bort dem.Inte alla versioner av sökverktyget har också alternativet -delete. Så bättre att använda varje verktyg för sitt rätta jobb. Detta är unix-filosofin – ett verktyg, ett jobb, använd dem tillsammans för att göra vad du behöver göra.

Kommentarer

  • Se även -ok rm {} \; istället för -exec rm {} \; för interaktiv bekräftelse.

Lämna ett svar

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