Qual è la sintassi find -exec corretta


10

Volevo eliminare i file superiori a 2 MB in una cartella specifica. Quindi ho corso:

find . -size +2M

E ho un elenco di due file

./a/b/c/file1

./a/f/g/file2

Quindi corro:

find . -size +2M -exec rm ;

e ricevo il messaggio di errore Find: missing argument to -exec

Controllo la sintassi nella pagina man e dice -exec command ;

Quindi invece ci provo

find . -size +2M -exec rm {} +

E funziona Capisco che {} lo faccia eseguire il comando come rm file1 file2invece di rm file1; rm file2;.

Allora perché il primo non ha funzionato?

RISPOSTA:

Immagino che ho dovuto RTFM un paio di volte per capire finalmente cosa stava dicendo. Anche se il primo esempio non mostra {}, le parentesi graffe sono richieste in tutti i casi. E poi aggiungi \; o + a seconda del metodo desiderato. Non limitarti a leggere la rubrica. Leggi anche la descrizione. Fatto.

Risposte:


16

Puoi utilizzare uno qualsiasi dei moduli:

find . -size +2M -exec rm {} +

find . -size +2M -exec rm {} \;

Il punto e virgola dovrebbe essere evitato!


10
-exec rm {} \;

puoi usare .. man find

-exec command ;
              Execute command; true if 0 status is returned.  All following arguments to find are taken to be arguments to the  command  until
              an  argument  consisting of `;' is encountered.  The string `{}' is replaced by the current file name being processed everywhere
              it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.  Both of  these
              constructions  might  need  to  be escaped (with a `\') or quoted to protect them from expansion by the shell.  See the EXAMPLES
              section for examples of the use of the -exec option.  The specified command is run once for each matched file.  The  command  is
              executed  in  the  starting directory.   There are unavoidable security problems surrounding use of the -exec action; you should
              use the -execdir option instead.

       -exec command {} +
              This variant of the -exec action runs the specified command on the selected files, but the command line is  built  by  appending
              each  selected file name at the end; the total number of invocations of the command will be much less than the number of matched
              files.  The command line is built in much the same way that xargs builds its command  lines.   Only  one  instance  of  `{}'  is
              allowed within the command.  The command is executed in the starting directory.

1
Ah ok. Immagino che ho dovuto RTFM un paio di volte per capire finalmente cosa stava dicendo. Anche se il primo esempio non mostra {}, le parentesi graffe sono richieste in tutti i casi. E poi aggiungi \; o + a seconda del metodo desiderato. Fatto.
Safado,

2

Per motivi di efficienza, di solito è meglio usare xargs:

$ find /path/to/files -size +2M -print0 | xargs -0 rm

1
Non proprio. Come dice la voce della Guida sul wiki di Greg: Il + (anziché;) alla fine dell'azione -exec dice a find di usare una funzione interna simile a xargs che fa invocare il comando rm solo una volta per ogni blocco di file, anziché una volta per file.
adattamento

Ah, interessante. Sto usando find + xargs da anni e anni e non ho mai saputo dell'operatore +. Grazie per la segnalazione!
EEAA,

Posso consigliare vivamente il wiki di Greg; quest'uomo sa di più su bash e il set di strumenti GNU di quanto io possa mai sperare di imparare; è sicuro di dire che ho imparato di più sull'uso di bash da quando ho iniziato a leggerlo che in tutti gli anni prima di allora.
adattamento

2
Chi è Greg e dove posso trovare la sua wiki?
Safado,

@Safado Immagino sia questo: mywiki.wooledge.org
Enrico Stahn

0

Non userei affatto -exec per questo. find può anche rimuovere i file stessi:

find . -size +2M -delete

(questo è probabilmente un GNUismo però, non so se lo troverai in non-gnu find)


C'è un motivo dietro questo o è semplicemente una preferenza personale?
Safado,

trova solo le chiamate unlink (2) stesso e non deve sborsare nuovi processi per fare la cancellazione. Sarebbe molto più efficiente. È anche molto più leggibile.
stufato il

0

Come documentato, -exec richiede {} come segnaposto per l'output di find.

La guida definitiva per l'uso degli strumenti bash e GNU è qui

Come puoi vedere, mostra esplicitamente il secondo comando che hai usato come esempio.

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.