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
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.
-delete
-omkopplaren innan-name
raderas det angivna filträdet så jag antar att jag måste vara försiktig.find
kan du använda-exec rm {} +
för att ta bort alla matchade filer med enstakarm
kommando..DS_Store
inte ' t innehåller några specialtecken alls, så citaten är onödiga och ändrar ingenting i det här fallet.;
eller|
eller>
eller<
och ” och många andra som har speciell betydelse för skalet såvida det inte citeras.xargs
tar hand om argumentlistans problem med begränsad storlek transparent genom att dela upp det i flera anrop av kommandot.