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

  • ser jeg. Jeg ' har også læst, at brug af -delete switch før -name sletter det angivne filtræ så jeg antager, at jeg skal være forsigtig.
  • På den seneste find kan du bruge -exec rm {} + til at fjerne alle matchede filer med enkelt rm kommando.
  • .DS_Store betyder ikke ' t indeholder overhovedet specialtegn, så citaterne er unødvendige og ændrer intet i dette tilfælde.
  • Dybest set er kun hvidt mellemrum (mellemrum, faner, måske andre) det eneste, der får en ikke-citeret streng til at blive fortolket som to separate kommandolinjeargumenter, men at ' ikke er alt, hvad du er ked af, når du beslutter dig for at citere eller ej. Du skal bekymre dig om alle shell-metategn som ; eller | eller > eller < og “ og mange andre, der har særlig betydning for skallen, medmindre de er citeret.
  • @MarcoMarsala xargs tager sig af argumentlistelisten i begrænset størrelse gennemsigtigt ved at opdele den i flere påkald af kommandoen.

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.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *