Încerc să înțeleg diferența dintre acestea două comenzi:

sudo find / -name .DS_Store -delete 

și

sudo find / -name ".DS_Store" -exec rm {} \; 

Am observat că . De ce? Care dintre ele este mai sigură / mai rapidă / mai bună? Am folosit atât pe Macbook , cât și totul pare să funcționeze bine.

Răspuns

-delete va funcționa mai bine, deoarece nu trebuie să creeze un proces extern pentru fiecare și fiecare fișier potrivit.

Este posibil să vedeți -exec rm {} \; deseori recomandat deoarece -delete nu există în toate versiunile find. Nu pot să verific chiar acum, dar sunt „sigur că am folosit un find fără el.

B alte metode ar trebui să fie „sigure”.

EDIT per comentariu de la @doitmyway: asigurați-vă că vă potriviți pe nume și apoi ștergeți, nu invers (ștergeți, apoi potriviți). În caz contrar, fiecare fișier va fi șters, indiferent dacă se potrivește sau nu . Adică, NU faceți acest lucru: find / -delete -name .DS_Store.

O metodă obișnuită pentru evitarea cheltuielilor generale de generare a unui proces extern pentru fiecare fișier potrivit este:

find / -name .DS_Store -print0 | xargs -0 rm 

(dar rețineți că există și o problemă de portabilitate și aici: nu toate versiunile de căutare au -print0!)

Comentarii

  • Înțeleg. Am ' am citit, de asemenea, că folosind comutatorul -delete înainte ca -name să șterge arborele de fișiere specificat , deci cred că trebuie să fiu atent.
  • Pe find recent puteți folosi -exec rm {} + pentru a elimina toate datele potrivite fișiere cu o singură comandă rm.
  • .DS_Store nu ' t conține deloc caractere speciale, astfel încât ghilimelele nu sunt necesare și nu schimbă nimic în acest caz.
  • Practic, numai spațiul alb (spații, file, poate altele) este singurul lucru care face ca un șir necitatat să fie interpretat ca două argumente separate pentru linia de comandă, dar ' nu este tot ceea ce trebuie să vă pare rău atunci când decideți să citați sau nu. Trebuie să vă faceți griji cu privire la toate metacaracterele shell cum ar fi ; sau | sau > sau < și `și multe altele care au o semnificație specială pentru shell, cu excepția cazului în care sunt menționate.
  • @MarcoMarsala xargs are grijă de problema limitată a listei de argumente în mod transparent, împărțind-o în mai multe invocații ale comenzii.

Răspuns

Presupunând că .DS_Store reprezintă fișiere și nu directoare, cel mai portabil mod rapid de a face acest lucru ar fi:

sudo find / -name .DS_Store -exec rm {} + 

Singurul risc este ca sudo să nu fie disponibil, dar este destul de scăzut în zilele noastre.

-delete opțiunea utilizată pentru a solicita găsirea GNU și este încă nestandardă în multe alte implementări find, deci nu este întotdeauna disponibilă.

Terminarea comenzii + în în locul \; optimizează foarte mult clauza exec prin executarea comenzii rm pentru fiecare și fiecare .DS_Store prezent pe sistemul de fișiere.

Răspuns

Pentru o mașină deoarece Macbook-ul dvs. nu veți găsi o diferență mare în performanță între cele două comenzi. Cu toate acestea, dacă vă uitați la versiunea -exec, puteți vedea o diferență subtilă:

sudo find / -iname ".file-to-delete" -exec rm {} \; 

Acest lucru înseamnă că veți găsi toate acele fișiere cu nume „.file -a sterge”. Cu toate acestea, această căutare ar putea aduce unele pozitive false nedorite. Când faci ceva cu sudo, ar trebui să fii puțin mai atent. Avantajul utilizării -exec rm {} este că puteți transmite argumente către rm astfel:

sudo find / -iname "*~" -exec rm -i {} \; 

În acest exemplu vreau să șterg acele fișiere de rezervă care emacs face. Cu toate acestea, tilde ar putea fi într-un fișier obscur pe care nu-l știu și ar putea fi important. În plus, vreau să confirm ștergerea. Așa că am pus opțiunea „-i” pe comanda rm. Aceasta îmi va oferi o ștergere interactiv .

De asemenea, puteți rafina utilizarea rm pentru a șterge directoare, precum și fișiere:

find /usr/local/share/ -iname "useless" -exec rm -r {} \; 

Pe scurt, -exec oferă aveți un control mai mare asupra comenzii reale care elimină elementul găsit. Avantajul este că utilizați un instrument pentru a găsi fișierele, un alt instrument pentru a le elimina.De asemenea, nu fiecare versiune a utilitarului Find are opțiunea -delete. Deci, mai bine să folosiți fiecare instrument pentru treaba corectă. Aceasta este filosofia Unix – un instrument, o singură treabă, folosiți-le împreună pentru a face ceea ce trebuie să faceți.

Comentarii

  • id = „ecc4fb1268″>

în locul -exec rm {} \; pentru confirmare interactivă.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *