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

  • Ik begrijp het. Ik ' heb ook gelezen dat het gebruik van de -delete schakelaar voordat -name de opgegeven bestandsstructuur verwijdert , dus ik denk dat ik voorzichtig moet zijn.
  • Op recente find kun je -exec rm {} + gebruiken om alle overeenkomende bestanden met één rm commando.
  • .DS_Store doet niet ' t bevatten helemaal geen speciale tekens, dus de aanhalingstekens zijn niet nodig en veranderen in dit geval niets.
  • In feite is alleen witruimte (spaties, tabs, misschien andere) het enige dat ervoor zorgt dat een tekenreeks zonder aanhalingstekens wordt geïnterpreteerd als twee aparte commandoregelargumenten, maar dat ' is niet het enige waar je spijt van hoeft te hebben als je besluit om al dan niet te citeren. Je moet je zorgen maken over alle shell-metatekens zoals ; of | of > of < en “ en vele andere die een speciale betekenis hebben voor de shell, tenzij geciteerd.
  • @MarcoMarsala xargs lost het probleem van de argumentlijst met beperkte omvang transparant op door het op te splitsen in meerdere aanroepen van het commando.

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.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *