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

  • Capisco. ' ho anche letto che utilizzando -delete switch prima che -name elimini lalbero dei file specificato , quindi immagino di dover stare attento.
  • Negli ultimi find puoi utilizzare -exec rm {} + per rimuovere tutte le corrispondenze file con un singolo comando rm.
  • .DS_Store non ' t contenere caratteri speciali, quindi le virgolette non sono necessarie e in questo caso non cambiano nulla.
  • Fondamentalmente solo gli spazi bianchi (spazi, tabulazioni, forse altri) sono lunica cosa che fa sì che una stringa non quotata venga interpretata come due argomenti separati della riga di comando, ma questo ' non è tutto ciò di cui ti devi pentire quando decidi se citare o meno. Devi preoccuparti di tutti i metacaratteri della shell come ; o | o > o < and “e molti altri che hanno un significato speciale per la shell a meno che non vengano citati.
  • @MarcoMarsala xargs si prende cura del problema dellelenco di argomenti di dimensioni limitate in modo trasparente suddividendolo in più invocazioni del comando.

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *