Come si esegue l'output del nome file nel comando find mentre si utilizza -exec?

21

Io uso la seguente riga per trovare tutte le sottodirectory del PWD ed eseguire svnadmin verify su ogni directory (so già che sono repository di Subversion)

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

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

* 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.

Mi piacerebbe molto find per stampare il nome del file prima di eseguire il comando svnadmin verify , per semplificare la registrazione.

Ho provato a spremere un po 'di ls ma li ho modificati, come dovrei farlo (preferibilmente semplicemente)? ​​

    
posta Arronical 22.07.2015 - 13:48

7 risposte

25

aggiungi semplicemente un'opzione -printf prima

find -printf '%p' -exec command \;
    
risposta data Fiximan 22.07.2015 - 13:59
12

Se non vuoi recurse, non ha senso usare find . È molto più semplice farlo direttamente nella shell:

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

Il for d in */ troverà tutte le directory (il */ garantisce solo le directory e nessun file trovato); il echo "$d" stamperà il nome della directory; il svnadmin verify "$d" controllerà la directory.

Questo può essere eseguito direttamente dalla riga di comando o da uno script senza modifiche nel formato.

    
risposta data terdon 22.07.2015 - 14:14
6
find ./* -maxdepth 0 -type d -exec bash -c 'echo "{}"; svnadmin verify "{}"' \;

Ho aggiunto -type d se si tratta solo di directory.

    
risposta data 7171u 22.07.2015 - 13:53
5

Prova questo:

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

Se vuoi solo le directory (grazie a @kos note):

for f in */ ; do echo  -n "${f}:"; svnadmin verify "${f}"; done
    
risposta data Maythux 22.07.2015 - 13:59
2
  • Utilizza . -maxdepth 1 anziché ./* , hai bisogno solo del primo livello nella struttura delle cartelle
  • Utilizza -type d , hai bisogno solo delle cartelle
  • Utilizza ! -name "." , non è necessario .
  • Utilizza -exec per avviare una shell
  • Utilizza sh -c per avviare i comandi all'interno della shell

Il tuo comando

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

o più breve

  • Utilizza -prune se il file è una directory, non scendere in essa

Il tuo comando

find . -mindepth 1 -prune -exec sh -c 'echo "{}"; svnadmin verify "{}"' \; 
    
risposta data A.B. 22.07.2015 - 14:18
0

Potrebbe essere utile canalizzare l'output find in read loop:

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

Ti permette di eseguire una sequenza di comandi composta più complicata con nomi di file restituiti da find , come in questo esempio di fantasia ls :

find . | while read f; do echo ${f} | figlet -k; done
    
risposta data Ves 09.06.2017 - 16:54
0

find ha flag di opzione per la stampa, che sono già menzionati in altre risposte. Se consideriamo il problema sotto forma di prospettiva di esecuzione di più comandi per lo stesso file attualmente elaborato, find consente di utilizzare più istruzioni -exec . Ciò significa che potremmo scegliere di utilizzare:

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

Ancora una volta, si noti che questo approccio è applicabile non solo alla stampa con echo , printf o altre utilità, ma anche ad altri comandi.

    
risposta data Sergiy Kolodyazhnyy 28.05.2018 - 01:49

Leggi altre domande sui tag