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

  • ser jeg. Jeg ' har også lest at bruk av -delete -bryteren før -name sletter det angitte filtreet så jeg antar at jeg må være forsiktig.
  • På nylig find kan du bruke -exec rm {} + for å fjerne alle matchede filer med enkelt rm 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.
  • I utgangspunktet er bare hvitt mellomrom (mellomrom, faner, kanskje andre) det eneste som får en ikke sitert streng til å tolkes som to separate kommandolinjeargumenter, men at ' ikke er alt du trenger å beklage når du bestemmer deg for å sitere eller ikke. Du må bekymre deg for alle shell-metategn som ; eller | eller > eller < og « og mange andre som har spesiell betydning for skallet med mindre det er sitert.
  • @MarcoMarsala xargs tar seg av argumentlistelisten med begrenset størrelse transparent ved å dele den opp i flere påkallinger av kommandoen.

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.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *