Come eseguo find con GNU xargs per attraversare una serie di directory?


0
$ echo {a,b,c}.h d e.h |xargs -IA find A -name '*.h'
find: `a.h b.h c.h d e.h': No such file or directory
$ echo -e a.h\\nb.h c.h d e.h |xargs -IA find A -name '*.h'
a.h
find: `b.h c.h d e.h': No such file or directory

Il problema è che -Iimplica che xargs assumerà che gli argomenti siano delimitati da newline. Non sono sicuro del perché. Immagino di poter risolvere questo problema con sed, ma mi chiedo se esiste un trucco o un linguaggio xargs che non conosco e che le persone usano per risolvere questo problema.

Sto cercando una soluzione che funzioni anche su OS X. Su OS X il parametro xargs -J sembra funzionare bene. La manpage afferma che questa opzione controllerà solo dove sono posizionati gli argomenti per l'eseguibile, che è esattamente quello che voglio.

Risposte:


0

Hmm. Ti servono pipe e xargs? Sembra che tutto ciò di cui il tuo esempio ha davvero bisogno sia il finde il echo.

Immagino che questo sia un pezzo di un puzzle più grande, quindi potrebbe non funzionare nel contesto di ciò che stai facendo, ma il tuo esempio potrebbe essere scritto come:

$ find `echo {a,b,c}.h d e.h` -name '*.h'

$ find $(echo {a,b,c}.h d e.h) -name '*.h'

... che, sul mio sistema, porta a findcontrollare ogni argomento singolarmente:

find: `a.h': No such file or directory
find: `b.h': No such file or directory
find: `c.h': No such file or directory
find: `d': No such file or directory
find: `e.h': No such file or directory

Non ho una macchina OSX con cui testare, e questi potrebbero essere specifici per Bash.


Il mio intento originale era quello di avere l'elenco di directory e file provenienti da stdin. Avrò a che fare con una delle soluzioni alternative. Sono ancora curioso di sapere perché, tuttavia, implica la delimitazione da parte di newline.
Wilhelmtell,

dagli tempo, qualcun altro potrebbe avere una vera risposta per te. ho pensato che forse avevi bisogno dell'espansione, non dello stdin.
Quack Quixote

0

Perché non solo find {a,b,c}.h d e.h -name '*.h'?


vedere il suo commento sulla mia risposta; ha bisogno dell'elenco degli argomenti proveniente da Stdin. (buona semplificazione della mia risposta, almeno nell'esempio find+ echocaso.)
Quack Quixote

Ok, se hai bisogno dell'elenco proveniente da stdin, allora devi provare a fare una delle seguenti operazioni: 1. Non usare spazi nei nomi delle directory e poi reindirizzare le cose sed -e 's/\s+/\n/g'; 2. Trovare un modo per separare i nomi delle directory in entrata da newline o null, quindi utilizzare xargs --null find ...o while read x; do ... ; done.
Ryan Thompson,

0

hai provato l'opzione -d di xargs?

justin@eee:~$ echo {a,b,c}.h d e.h |xargs -d ' ' -n1  -IA echo foo A
foo a.h
foo b.h
foo c.h
foo d
foo e.h

o anche più semplice,

justin@eee:~$ for x in $(echo {a,b,c}.h d e.h);do echo foo $x;done
foo a.h
foo b.h
foo c.h
foo d
foo e.h

-Iimplica ignorare -d. Inoltre, -dprende esattamente un carattere come argomento. Non puoi avere spazi bianchi arbitrari come delimitatore. Cioè, in termini di regex è / / ma non puoi fare / \ s / o persino / \ s + /.
Wilhelmtell,

funziona bene per me, vedi il mio commento. Se questo non è ancora quello che vuoi, dovrai dare un esempio migliore che mostra cosa stai davvero cercando di fare.
user23307

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.