Jeg prøver å forstå forskjellen mellom disse to kommandoer:
sudo find / -name .DS_Store -delete
og
sudo find / -name ".DS_Store" -exec rm {} \;
Jeg la merke til at -exec ... {}
-metoden foretrekkes. Hvorfor? Hvilken er tryggere / raskere / bedre? Jeg har brukt begge deler på Macbook og alt ser ut til å fungere bra.
Svar
-delete
vil fungere bedre fordi det ikke trenger å gyte en ekstern prosess for hver og alle samsvarende filer.
Det er mulig at du kan se -exec rm {} \;
ofte anbefalt fordi -delete
ikke finnes i alle versjoner av find
. Jeg kan ikke sjekke akkurat nå, men jeg er ganske sikker på at jeg har brukt en find
uten den.
B andre metoder skal være «trygge».
EDIT per kommentar fra @doitmyway: sørg for at du stemmer overens på navnet og deretter slett, ikke omvendt (slett, så samsvar). Ellers blir hver fil slettet, enten den samsvarer eller ikke . Dvs. IKKE gjør dette: find / -delete -name .DS_Store
.
En vanlig metode for å unngå overhead for å gyte en ekstern prosess for hver samsvarende fil er:
find / -name .DS_Store -print0 | xargs -0 rm
(men merk at det også er et portabilitetsproblem: ikke alle versjoner av finne har -print0
!)
Kommentarer
Svar
Forutsatt at .DS_Store
representerer filer og ikke kataloger, vil den mest bærbare, fortsatt raske måten å gjøre det være:
sudo find / -name .DS_Store -exec rm {} +
Den eneste risikoen er at sudo
ikke er tilgjengelig, men den er ganske lav i dag.
-delete
alternativet brukes til å kreve GNU-funn og er fortsatt ikke standard i mange andre find
implementeringer, så er ikke alltid tilgjengelig.
Kommandotermineringen +
i i stedet for \;
optimaliserer exec
-delen veldig ved å ikke kjøre rm
-kommandoen for hver og hver .DS_Store
til stede i filsystemet.
Svar
For en maskin som som din macbook vil du ikke finne stor forskjell i ytelse mellom de to kommandoene. Men hvis du ser på -exec-versjonen, kan du se en subtil forskjell:
sudo find / -iname ".file-to-delete" -exec rm {} \;
Dette betyr at du finner alle filene med navn «.file -å slette». Imidlertid kan dette søket returnere noen uønskede falske positive. Når du gjør noe med sudo, bør du være litt mer forsiktig. Fordelen med å bruke -exec rm {} er at du kan sende argumenter til rm slik:
sudo find / -iname "*~" -exec rm -i {} \;
I dette eksemplet vil jeg fjerne de sikkerhetskopifilene som emacs gjør. Men tilde kan være i en uklar fil som jeg ikke vet om og kan være viktig. Pluss at jeg vil bekrefte slettingen. Så jeg setter alternativet «-i» på rm-kommandoen. Dette vil gi meg en interaktiv sletting .
Du kan også avgrense bruken av rm for å slette kataloger så vel som filer:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
Kort fortalt gir -exec du litt mer kontroll over selve kommandoen som fjerner det funnet elementet. Fordelen er at du bruker ett verktøy for å finne filene, et annet verktøy for å fjerne dem.Ikke alle versjoner av søkeverktøyet har alternativet -delete. Så bedre å bruke hvert verktøy til riktig jobb. Dette er unix-filosofien – ett verktøy, en jobb, bruk dem sammen for å gjøre det du trenger å gjøre.
Kommentarer
- Se også
-ok rm {} \;
i stedet for-exec rm {} \;
for interaktiv bekreftelse.
-delete
-bryteren før-name
sletter det angitte filtreet så jeg antar at jeg må være forsiktig.find
kan du bruke-exec rm {} +
for å fjerne alle matchede filer med enkeltrm
kommando..DS_Store
ikke ' t inneholder noen spesielle tegn i det hele tatt, så anførselstegnene er unødvendige og endrer ingenting i dette tilfellet.;
eller|
eller>
eller<
og « og mange andre som har spesiell betydning for skallet med mindre det er sitert.xargs
tar seg av argumentlistelisten med begrenset størrelse transparent ved å dele den opp i flere påkallinger av kommandoen.