Come si genera il nome del file nel comando find mentre si utilizza -exec?


33

Uso la seguente riga per trovare tutte le sottodirectory del PWD ed eseguirle svnadmin verifysu ogni directory (so già che sono repository Subversion)

find ./* -maxdepth 0 -exec svnadmin verify {} \;

Funziona bene, a parte il fatto che l'output è simile al seguente:

* Verifying repository metadata ...
* Verifying metadata at revision 1 ...
* Verifying metadata at revision 2 ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 9 ...
* Verifying metadata at revision 10 ...
* Verifying metadata at revision 12 ...
* Verifying metadata at revision 14 ...
* Verifying metadata at revision 15 ...
* Verifying metadata at revision 18 ...
* Verifying metadata at revision 20 ...
* Verifying metadata at revision 22 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.
* Verified revision 10.
* Verified revision 11.
* Verified revision 12.
* Verified revision 13.
* Verified revision 14.
* Verified revision 15.
* Verified revision 16.
* Verified revision 17.
* Verified revision 18.
* Verified revision 19.
* Verified revision 20.
* Verified revision 21.
* Verified revision 22.
* Verified revision 23.
* Verified revision 0.
* Verifying repository metadata ...
* Verifying metadata at revision 4 ...
* Verifying metadata at revision 5 ...
* Verifying metadata at revision 6 ...
* Verifying metadata at revision 7 ...
* Verifying metadata at revision 9 ...
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
* Verified revision 3.
* Verified revision 4.
* Verified revision 5.
* Verified revision 6.
* Verified revision 7.
* Verified revision 8.
* Verified revision 9.

Vorrei davvero findstampare il nome del file prima di eseguire il svnadmin verifycomando, per semplificare la registrazione.

Ho provato a spremere un po ' lslì dentro ma rinforzato, come dovrei farlo (preferibilmente semplicemente)?

Risposte:


36

aggiungi semplicemente -printfun'opzione prima

find -printf '%p' -exec command \;

4
Bello, ho cambiato '%p'in '%p\n'modo che il nome preceda l'output di verifica sulla propria riga.
Arronical,

17
@Arronical se questo è il formato che desideri, potresti sostituire il (formattato) -printf '%p\n'con il più semplice-print
steeldriver

4
find -name <a_name> -print -exec command {} \;
Toliveira,

14

Se non vuoi fare ricorso, non ha senso utilizzarlo find. È molto più semplice farlo direttamente nella shell:

for d in */; do echo "$d"; svnadmin verify "$d"; done

La for d in */troverà tutte le directory (gli */assicura solo directory e nessun file si trovano); il echo "$d"stamperà il nome della directory; la svnadmin verify "$d"controllerà il directory.

Questo può essere eseguito direttamente dalla riga di comando o dall'interno di uno script senza cambiare il formato.


1
Questo sembra un modo migliore per raggiungere il mio obiettivo, ma ho dovuto dare la risposta a Fiximan solo perché il mio titolo e la mia domanda fanno findcosì tanto riferimento . Grazie per aver migliorato le mie conoscenze!
Arronical,

Ciò richiede l'utilizzo di un glob. Globbing è sicuramente utile e potente, ma nella mia esperienza personale la sintassi è più difficile da impostare, e spesso finisce per aver bisogno di altre cose come dotglobe globstarin bash, che crea uno script più lungo e complicato. Tendo a salvare i globs per compiti complicati, mentre findla sintassi è più facile da mettere insieme al volo semplicemente mettendo insieme un mucchio di filtri e comandi in una riga.
user5359531

@ user5359531 qui non sono necessari né globstar né dotglob (a meno che tu non sappia di avere file nascosti e di volerli effettivamente). Questa è ovviamente una questione di opinione, ma tu sei la prima persona che abbia mai incontrato che considera il formato piuttosto ottuso di findpiù semplice. Preferisco sempre i globs findperché non li trovo solo molto più semplici, ma sono anche più sicuri quando si tratta di nomi di file arbitrari che vengono passati ad altri programmi.
terdon,

6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Ho aggiunto -type dse si tratta solo di directory.


Vorrei citare {}, almeno insvnadmin verify {}
kos

Grazie per la pronta risposta. Quindi in questo comando si -execgenera una shell figlio, in cui vengono eseguiti i 2 comandi, usando ;come fine riga?
Arronical,

5

Prova questo:

for f in * ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Se vuoi solo le directory (grazie alla nota di @kos):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done

Bello, ma questo elaborerà anche i file: for f in */elaborerà solo le directory
kos

Funzionerà solo in una sceneggiatura? O posso emetterlo dalla riga di comando?
Arronical,

1
@Arronical funzionerà anche come riga di comando
Maythux,

2
  • Utilizzare . -maxdepth 1invece di ./*, è necessario solo il primo livello nella struttura delle cartelle
  • Usa -type d, hai solo bisogno di cartelle
  • Usa ! -name ".", non hai bisogno.
  • Utilizzare -execper avviare una shell
  • Utilizzare sh -cper avviare i comandi all'interno della shell

Il tuo comando

find . -maxdepth 1 -type d ! -name "." -exec sh -c 'echo "{}"; svnadmin verify "{}"' \;

o più corto

  • Utilizzare -prunese il file è una directory, non scendere in esso

Il tuo comando

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 

-prunesembra interessante. Ho usato ./* -maxdepth 0per evitare il ritorno .dal comando find. Non provoca alcun errore critico, ma preferisco non averlo nel mio output.
Arronical,

1

findha flag di opzione per la stampa, che sono già menzionati in altre risposte. Se esaminiamo il problema dalla prospettiva dell'esecuzione di più comandi per lo stesso file attualmente elaborato, findconsente l'utilizzo di più -execistruzioni. Ciò significa che potremmo optare per l'utilizzo di:

find ./* -maxdepth 0 -exec echo {} \; -exec svnadmin verify {} \; 

Anche in questo caso, si noti che questo approccio è applicabile non solo di stampa con echo, printfo altre utilità, ma anche altri comandi.


0

Può essere utile collegare l' findoutput al readloop:

find . | while read d; do echo "=== ${d}: ==="; svnadmin verify ${d}; done

Ti consente di eseguire sequenze di comandi composte più complicate con nomi di file restituiti da find, come in questo lsesempio di fantasia :

find . | while read f; do echo ${f} | figlet -k; done

-1

Questo stamperà ricorsivamente il nome e il contenuto dei soli file.

find . -type f -printf '\n\n%p:\n' -exec cat {} \;
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.