trova - exec rm vs -delete


260

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 il execmetodo è preferito. Perché? Quale è più sicuro / più veloce / migliore? Ho usato entrambi sul mio Macbook e tutto sembra funzionare bene.

Risposte:


245

-delete funzionerà meglio perché non deve generare un processo esterno per ogni file corrispondente.

È possibile che tu possa vedere -exec rm {} \;spesso consigliato perché -deletenon esiste in tutte le versioni di find. Non posso controllare in questo momento ma sono abbastanza sicuro di averne usato uno findsenza.

Entrambi i metodi dovrebbero essere "sicuri".

MODIFICA per commento da @doitmyway: assicurati di abbinare il nome e quindi elimina, non viceversa (elimina, quindi abbina). In caso contrario, tutti i file verranno eliminati, che corrispondano o meno . Vale a dire, NON fare 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 qui c'è un problema di portabilità: non tutte le versioni di find hanno -print0!)


2
Vedo. Ho anche letto che l'uso -deletedell'opzione prima -nameelimina l'albero dei file specificato, quindi credo di dover fare attenzione.
Cipolla,

8
Di recente findè possibile utilizzare -exec rm {} +per rimuovere tutti i file corrispondenti con un singolo rmcomando.
Jimmij,

3
.DS_Storenon contiene alcun carattere speciale, quindi le virgolette non sono necessarie e in questo caso non cambiano nulla.
Celada,

1
Fondamentalmente solo gli spazi bianchi (spazi, tabulazioni, forse altri) è l'unica cosa che fa interpretare una stringa non quotata come due argomenti separati della riga di comando, ma non è tutto ciò di cui ti devi scusare quando decidi se citare o meno. Devi preoccuparti di tutti i metacaratteri della shell come ;o |o >o <e `` e di molti altri che hanno un significato speciale per la shell se non citati.
Celada,

1
@MarcoMarsala xargssi occupa in modo trasparente del problema dell'elenco di argomenti di dimensioni limitate suddividendolo in più invocazioni del comando.
Celada,

27

Supponendo che .DS_Storerappresentino i file e non le directory, il modo più portatile e veloce per farlo sarebbe:

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

L'unico rischio è che sudonon sia disponibile ma al giorno d'oggi è piuttosto basso.

L' -deleteopzione utilizzata per richiedere GNU find ed è ancora non standard in molte altre findimplementazioni, quindi non è sempre disponibile.

La terminazione del comando +invece di \;ottimizzare al execmassimo la clausola non eseguendo il rmcomando per tutti i .DS_Storepresenti sul file system.


16

Per una macchina come il tuo macbook non troverai molte differenze nelle 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 il nome ".file-to-delete". Tuttavia, questa ricerca potrebbe restituire alcuni falsi positivi indesiderati. Quando fai qualcosa con sudo dovresti stare un po 'più attento. Il vantaggio di usare -exec rm {} è che puoi passare argomenti a rm in questo modo:

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

In questo esempio, desidero rimuovere i file di backup creati da Emacs. Tuttavia, quella tilde potrebbe essere in un file oscuro che non conosco e potrebbe essere importante. Inoltre voglio confermare l'eliminazione. Quindi ho messo l'opzione '-i' sul comando rm. Questo mi darà una cancellazione interattiva.

Inoltre è possibile perfezionare l'utilizzo di rm per eliminare directory e file:

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

In breve, -exec ti dà un po 'più di controllo sul comando effettivo che rimuove l'elemento trovato. Il vantaggio è che usi uno strumento per trovare i file, un altro strumento per rimuoverli. Inoltre, non tutte le versioni dell'utilità find hanno l'opzione -delete. Quindi è meglio usare ogni strumento per il suo corretto lavoro. Questa è la filosofia unix: uno strumento, un lavoro, usali insieme per fare ciò che devi fare.


3
Vedi anche -ok rm {} \;al posto di -exec rm {} \;per la conferma interattiva.
Kusalananda
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.