Sto cercando di capire la differenza tra questi due comandi:
sudo find / -name .DS_Store -delete
e
sudo find / -name ".DS_Store" -exec rm {} \;
Ho notato che -exec ... {}
è preferito. Perché? Qual è il più sicuro / più veloce / migliore? Ho usato entrambi sul mio Macbook e sembra che tutto funzioni bene.
Answer
-delete
funzionerà meglio perché non “t deve generare un processo esterno per ciascuno e ogni file corrispondente.
È possibile che -exec rm {} \;
spesso sia consigliato perché -delete
non esiste in tutte le versioni di find
. Non posso “controllare adesso ma sono abbastanza sicuro di” aver usato un find
senza di esso.
B altri metodi dovrebbero essere “sicuri”.
EDIT per commento da @doitmyway: assicurati di abbinare sul nome e quindi elimina, non viceversa (elimina, quindi abbina). Altrimenti ogni file verrà eliminato, indipendentemente dal fatto che corrisponda o meno . Vale a dire, NON eseguire questo: find / -delete -name .DS_Store
.
Un metodo comune per evitare il sovraccarico di generare un processo esterno per ogni file corrispondente è:
find / -name .DS_Store -print0 | xargs -0 rm
(ma nota che anche qui cè un problema di portabilità: non tutte le versioni di find hanno -print0
!)
Commenti
Risposta
Supponendo che .DS_Store
rappresenti file e non directory, il modo più portatile ma veloce per farlo sarebbe:
sudo find / -name .DS_Store -exec rm {} +
Lunico rischio è che sudo
non sia disponibile, ma oggigiorno è piuttosto basso.
Il -delete
opzione utilizzata per richiedere GNU find ed è ancora non standard in molte altre implementazioni find
, quindi non è sempre disponibile.
La terminazione del comando +
in invece di \;
ottimizza notevolmente la clausola exec
non eseguendo il comando rm
per ogni e ogni .DS_Store
presente nel file system.
Risposta
Per una macchina come come il tuo macbook non troverai molta differenza di prestazioni tra i due comandi. Tuttavia, se guardi la versione -exec puoi vedere una sottile differenza:
sudo find / -iname ".file-to-delete" -exec rm {} \;
Ciò significa che troverai tutti quei file con nome “.file -cancellare”. Tuttavia, questa ricerca potrebbe restituire alcuni falsi positivi indesiderati. Quando fai qualcosa con sudo dovresti stare un po più attento. Il vantaggio dellutilizzo di -exec rm {} è che puoi passare argomenti a rm in questo modo:
sudo find / -iname "*~" -exec rm -i {} \;
In questo esempio voglio rimuovere quei file di backup che emacs fa. Tuttavia quella tilde potrebbe essere in qualche file oscuro che non conosco e potrebbe essere importante. Inoltre voglio confermare leliminazione. Quindi metto lopzione “-i” sul comando rm. Questo mi darà una cancellazione interattiva .
Inoltre puoi raffinare luso di rm per eliminare directory e file:
find /usr/local/share/ -iname "useless" -exec rm -r {} \;
In breve, -exec fornisce hai un po più di controllo sul comando effettivo che rimuove lelemento trovato.Il vantaggio è che usi uno strumento per trovare i file, un altro strumento per rimuoverli.Inoltre, non tutte le versioni dellutilità di ricerca hanno lopzione -delete. Quindi è meglio usare ogni strumento per il suo lavoro corretto. Questa è la filosofia di unix: uno strumento, un lavoro, usali insieme per fare ciò che devi fare.
Commenti
- Vedi anche
-ok rm {} \;
al posto di-exec rm {} \;
per la conferma interattiva.
-delete
switch prima che-name
elimini lalbero dei file specificato , quindi immagino di dover stare attento.find
puoi utilizzare-exec rm {} +
per rimuovere tutte le corrispondenze file con un singolo comandorm
..DS_Store
non ' t contenere caratteri speciali, quindi le virgolette non sono necessarie e in questo caso non cambiano nulla.;
o|
o>
o<
and “e molti altri che hanno un significato speciale per la shell a meno che non vengano citati.xargs
si prende cura del problema dellelenco di argomenti di dimensioni limitate in modo trasparente suddividendolo in più invocazioni del comando.