Î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
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ă.
-delete
înainte ca-name
să șterge arborele de fișiere specificat , deci cred că trebuie să fiu atent.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.;
sau|
sau>
sau<
și `și multe altele care au o semnificație specială pentru shell, cu excepția cazului în care sunt menționate.xargs
are grijă de problema limitată a listei de argumente în mod transparent, împărțind-o în mai multe invocații ale comenzii.