Ik probeer het verschil tussen deze twee commandos:
sudo find / -name .DS_Store -delete
en
sudo find / -name ".DS_Store" -exec rm {} \;
Ik heb gemerkt dat de -exec ... {}
-methode heeft de voorkeur. Waarom? Welke is veiliger / sneller / beter? Ik heb beide gebruikt op mijn Macbook en alles lijkt goed te werken.
Answer
-delete
zal beter presteren omdat het niet voor elk een extern proces hoeft te genereren en elk overeenkomend bestand.
Het is mogelijk dat -exec rm {} \;
vaak wordt aanbevolen omdat -delete
niet bestaat in alle versies van find
. Ik kan het nu niet controleren, maar ik ben er vrij zeker van dat ik een find
heb gebruikt zonder.
B beide methoden zouden “veilig” moeten zijn.
BEWERK per opmerking van @doitmyway: zorg ervoor dat u overeenkomt op de naam en dan delete, niet andersom (delete, then match). Anders wordt elk bestand verwijderd, ongeacht of het overeenkomt of niet . Dat wil zeggen, doe dit NIET: find / -delete -name .DS_Store
.
Een veelgebruikte methode om de overhead van het uitzetten van een extern proces voor elk overeenkomend bestand te vermijden is:
find / -name .DS_Store -print0 | xargs -0 rm
(maar merk op dat er ook hier een overdraagbaarheidsprobleem is: niet alle versies van find hebben -print0
!)
Reacties
Antwoord
Ervan uitgaande dat .DS_Store
bestanden vertegenwoordigen en geen mappen, is de meest draagbare en toch snelle manier om dit te doen:
sudo find / -name .DS_Store -exec rm {} +
Het enige risico is dat sudo
niet beschikbaar is, maar het is tegenwoordig vrij laag.
De -delete
optie die wordt gebruikt om GNU-zoekactie te eisen en is nog steeds niet standaard in veel andere find
implementaties, dus is niet altijd beschikbaar.
De opdrachtbeëindiging +
in in plaats van \;
optimaliseert de exec
-clausule in hoge mate door de rm
-opdracht niet voor elke en elke .DS_Store
aanwezig in het bestandssysteem.
Antwoord
Voor een machine zoals als je macbook zul je niet veel verschil in prestaties tussen de twee commandos vinden. Als je echter naar de -exec-versie kijkt, zie je een subtiel verschil:
sudo find / -iname ".file-to-delete" -exec rm {} \;
Dit betekent dat je al die bestanden zult vinden met de naam “.file -verwijderen”. Deze zoekopdracht kan echter enkele ongewenste false positives opleveren. Als je iets met sudo doet, moet je wat voorzichtiger zijn. Het voordeel van het gebruik van -exec rm {} is dat je als volgt argumenten aan rm kunt doorgeven:
sudo find / -iname "*~" -exec rm -i {} \;
In dit voorbeeld wil ik die back-upbestanden verwijderen die emacs maakt. Die tilde kan echter in een of ander obscuur bestand staan waarvan ik niets weet en kan belangrijk zijn. Bovendien wil ik het verwijderen bevestigen. Dus heb ik de optie “-i” op de opdracht rm gezet. Dit geeft me een interactieve verwijdering .
Ook kunt u het gebruik van rm verfijnen om zowel mappen als bestanden te verwijderen:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
In het kort geeft de -exec je hebt wat meer controle over het eigenlijke commando dat het gevonden item verwijdert.Het voordeel is dat je één tool gebruikt om de bestanden te vinden, een andere tool om ze te verwijderen.Ook heeft niet elke versie van het zoekprogramma de optie -delete. Het is dus beter om elke tool te gebruiken voor zijn juiste taak. Dit is de Unix-filosofie – één tool, één taak, gebruik ze samen om te doen wat je moet doen.
Reacties
- Zie ook
-ok rm {} \;
in plaats van-exec rm {} \;
voor interactieve bevestiging.
-delete
schakelaar voordat-name
de opgegeven bestandsstructuur verwijdert , dus ik denk dat ik voorzichtig moet zijn.find
kun je-exec rm {} +
gebruiken om alle overeenkomende bestanden met éénrm
commando..DS_Store
doet niet ' t bevatten helemaal geen speciale tekens, dus de aanhalingstekens zijn niet nodig en veranderen in dit geval niets.;
of|
of>
of<
en “ en vele andere die een speciale betekenis hebben voor de shell, tenzij geciteerd.xargs
lost het probleem van de argumentlijst met beperkte omvang transparant op door het op te splitsen in meerdere aanroepen van het commando.