Jeg prøver at forstå forskellen mellem disse to kommandoer:
sudo find / -name .DS_Store -delete
og
sudo find / -name ".DS_Store" -exec rm {} \;
Jeg bemærkede, at -exec ... {}
metode foretrækkes. Hvorfor? Hvilken er sikrere / hurtigere / bedre? Jeg har brugt begge dele på min Macbook og alt ser ud til at fungere godt.
Svar
-delete
klarer sig bedre, fordi det ikke behøver at gyde en ekstern proces for hver og hver matchet fil.
Det er muligt, at du muligvis ser -exec rm {} \;
, der ofte anbefales, fordi -delete
ikke findes i alle versioner af find
. Jeg kan ikke tjekke lige nu, men jeg er ret sikker på, at jeg har brugt en find
uden den.
B andre metoder skal være “sikre”.
REDIGER pr. kommentar fra @doitmyway: Sørg for at matche på navnet og derefter slet, ikke omvendt (slet, og match derefter). Ellers slettes hver fil, uanset om den matcher eller ikke . Det vil sige IKKE gør dette: find / -delete -name .DS_Store
.
En almindelig metode til at undgå omkostningerne ved gydning af en ekstern proces for hver matchet fil er:
find / -name .DS_Store -print0 | xargs -0 rm
(men bemærk, at der også er et portabilitetsproblem: ikke alle versioner af find har -print0
!)
Kommentarer
Svar
Forudsat at .DS_Store
repræsenterer filer og ikke mapper, er den mest bærbare, stadig hurtige måde at gøre det på:
sudo find / -name .DS_Store -exec rm {} +
Den eneste risiko er, at sudo
ikke er tilgængelig, men den er ganske lav i dag.
-delete
-indstilling, der bruges til at kræve GNU-søgning og er stadig ikke standard i mange andre find
-implementeringer, så den er ikke altid tilgængelig.
Kommandoterminering +
i i stedet for \;
optimerer stærkt exec
-sætningen ved ikke at køre kommandoen rm
for hver og hver .DS_Store
til stede i filsystemet.
Svar
For en sådan maskine som din macbook finder du ikke meget forskel i ydeevne mellem de to kommandoer. Men hvis du ser på -exec-versionen, kan du se en subtil forskel:
sudo find / -iname ".file-to-delete" -exec rm {} \;
Dette betyder, at du finder alle disse filer med navn “.fil -til at slette “. Denne søgning kan dog returnere nogle uønskede falske positive. Når du laver noget med sudo, skal du være lidt mere forsigtig. Fordelen ved at bruge -exec rm {} er, at du kan videregive argumenter til rm som denne:
sudo find / -iname "*~" -exec rm -i {} \;
I dette eksempel vil jeg fjerne de sikkerhedskopifiler, der emacs gør. Men denne tilde kunne være i en uklar fil, som jeg ikke kender til og kunne være vigtig. Plus, jeg vil bekræfte sletningen. Så jeg sætter muligheden “-i” på rm-kommandoen. Dette giver mig en interaktiv sletning .
Du kan også forfine brugen af rm til at slette mapper såvel som filer:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
Kort sagt giver -exec du lidt mere kontrol over den faktiske kommando, der fjerner det fundne element. Fordelen er, at du bruger et værktøj til at finde filerne, et andet værktøj til at fjerne dem.Ikke alle versioner af søgeværktøjet har også -delete-indstillingen. Så bedre at bruge hvert værktøj til det rette job. Dette er unix-filosofien – et værktøj, et job, brug dem sammen til at gøre, hvad du skal gøre.
Kommentarer
- Se også
-ok rm {} \;
i stedet for-exec rm {} \;
til interaktiv bekræftelse.
-delete
switch før-name
sletter det angivne filtræ så jeg antager, at jeg skal være forsigtig.find
kan du bruge-exec rm {} +
til at fjerne alle matchede filer med enkeltrm
kommando..DS_Store
betyder ikke ' t indeholder overhovedet specialtegn, så citaterne er unødvendige og ændrer intet i dette tilfælde.;
eller|
eller>
eller<
og “ og mange andre, der har særlig betydning for skallen, medmindre de er citeret.xargs
tager sig af argumentlistelisten i begrænset størrelse gennemsigtigt ved at opdele den i flere påkald af kommandoen.