Qual è l'argomento mancante di -exec?


15

Uso il seguente comando per cancellare una directory, di file e directory di oltre 30 giorni, e spostarli in una directory di archivio che posso eliminare dopo alcune settimane se nessuno chiede i loro file indietro. La directory di destinazione ha sottodirectory per nome utente, così come la directory di archivio.

Questo è il comando che uso:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Ho suggerito una versione modificata di questo per rispondere a una domanda su chiedere a Ubuntu, un altro utente ha modificato il codice per cambiare la fine della linea \;in +quanto è più veloce (e più corretto?). Vedere qui

Tuttavia, l'utilizzo +in questo modo funziona se il -execcomando si trova ls -lhma non nel comando effettivo che utilizzo. Se lo provo, visualizzo +un messaggio di errore:

find: missing argument to '-exec'

Non capisco perché si comporti in questo modo o quale sia il comando corretto. Per favore, non solo pubblicare una correzione di comando, mi piacerebbe capire piuttosto che seguire un suggerimento alla cieca.


Ti riferisci a questa risposta ? Questo potrebbe spiegare perché
Wilf, l'

Grazie @Wilf che ho aggiornato per mostrare su quale risposta è avvenuta la modifica. Il link che hai fornito ha un ulteriore link che lo spiega in un modo che il mio cervello può far fronte.
Arronical


Grazie a @souravc in modo brillantemente ciclico questa domanda è da parte dell'utente che ha modificato il mio comando! Finalmente capisco che +fornisce più argomenti allo stesso comando, ma mvnon ce la faccio !
Arronical

@Arronical mv can, vedi la mia risposta ^^
caos

Risposte:


19

L'utente in quel post può dire che il +segno alla fine di un -execcomando è più veloce, ma non perché.

Supponiamo che il findcomando restituisca i seguenti file:

/path/to/file1
/path/to/file2
/path/to/file3

Il normale -execcomando ( -exec command {} \;) viene eseguito una volta per ogni file corrispondente. Per esempio:

find ... -exec mv {} /target/ \;

esegue:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

Se si utilizza il +segno ( -exec command {} +), il comando viene creato aggiungendo più file corrispondenti alla fine del comando. Per esempio:

find ... -exec mv -t /target/ {} +

esegue:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

Per utilizzare +correttamente il flag, l'argomento da elaborare deve trovarsi alla fine del comando, non nel mezzo. Questo è il motivo per cui nel tuo esempio viene findaggiunto missing argument to '-exec'; manca la chiusura {}.


Mi sono sempre chiesto perché find -execrichieda {}di essere l'ultimo argomento, se usato con +. Qualcuno sa perché è stata presa quella decisione di progettazione, invece di far funzionare costrutti come la riga di comando dell'OP?
Peter Cordes,

11

L'utente ha spiegato la loro modifica ....

Il terminatore di "+" exec è più veloce di "\;"  vedi /ubuntu/558817/what-is-the-difference-between-using-and-in-exec-command;  e la creazione di un file di backup dal file originale è una buona idea

... usando questo link . Penso fondamentalmente invece di utilizzare più comandi, invia tutti i nomi di file a un'istanza di comando, per accelerare le cose. Ecco un esempio da qui :

Usando -exec con un punto e virgola ( find . -exec ls '{}' \;), verrà eseguito

ls file1
ls file2
ls file3

Ma se usi invece un segno più ( find . -exec ls '{}' \+), tutti i nomi dei file verranno passati come argomenti a un singolo comando:

ls file1 file2 file3

Ci sono altri moduli disponibili utilizzando ;e +pure (da qui :)

Pertanto la seguente sintassi di esempio è consentita per il comando find:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

TUTTAVIA, non sono sicuro che funzionerà comunque con il comando move, com'è la sua sintassi mv [OPTION]... SOURCE DEST, a meno che non -tvenga usata l' opzione o simile. Tuttavia dovrebbe funzionare lssenza opzioni extra ecc. In quanto possono capire quando vengono dati più nomi di file. L' +può anche bisogno di essere sfuggito (es \+)


Entrambe le risposte fantastiche, ma devo darlo al caos per essere un po 'più veloce e spiegare i mv -t, entrambi i + 1 però!
Arronical
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.