2011-04-24 10 views
9

Quiero conectar un resultado encontrado a un nuevo hallazgo. Lo que tengo es:Tuberías Buscar para encontrar

find . -iname "2010-06*" -maxdepth 1 -type d | xargs -0 find '{}' -iname "*.jpg" 

Resultado esperado: Segundo hallazgo recibe una lista de carpetas que empiezan por 2010-06, la segunda de búsqueda devuelve una lista de jpg de contenido dentro de esas carpetas.

Resultado real: "encontrar: ./2010-06 Nueva York \ n: opción desconocida"

Oh maldito. Tengo la sensación de que se trata del formato de la salida que el segundo hallazgo recibe como entrada, pero mi única idea era sufijo -print0 para encontrar primero, sin ningún cambio en absoluto.

¿Alguna idea?

Respuesta

8

Necesita 2 cosas. -print0, y más importante aún -I{} en xargs, de lo contrario, el {} no hace nada.

find . -iname "2010-06*" -maxdepth 1 -type d -print0 | xargs -0 -I{} find '{}' -iname '*.jpg' 
+0

Fantástico. Esto funciona como se esperaba –

+1

¿estás seguro de que esto funciona? maxdepth debe venir antes de -maname – ghostdog74

+0

De 'man find':" -y se supone que el operador se omite. " Por lo tanto, el orden no importa ya que todos son evaluados y todos deben ser verdaderos. –

1

¿Qué tal

find . -iwholename "./2010-06*/*.jpg 

etc?

+0

Debe incluir el "./" inicial en el valor dado a la opción. –

+0

Es '-iwholename', no' -iwholepath' –

+0

Solución mucho más elegante, tienes razón. Aunque lo que no explique a fondo fue que estoy interesado en hacer que las tuberías funcionen, y no específicamente este problema de búsqueda. Gracias sin embargo. :-) –

1

Aunque dijiste que específicamente quieres que este problema de encontrar + canal funcione, es ineficaz al teclear un comando extra find. Como está especificando -maxdepth como 1, no está atravesando subdirectorios. Así que solo use un bucle for con expansión de shell.

for file in *2010-06*/*.jpg 
do 
    echo "$file" 
done 

Si usted quiere encontrar todos los archivos jpg dentro de cada 2010-06 * carpetas de forma recursiva, tampoco hay necesidad de utilizar múltiples finds o xargs

for directory in 2010-06*/ 
do 
    find $directory -iname "*.jpg" -type f 
done 

O simplemente

find 2006-06* -type f -iname "*.jpg"

O mejor aún, si tiene bash 4 y superior

shopt -s globstar 
shopt -s nullglob 
for file in 2010-06*/**/*.jpg 
do 
    echo "$file" 
done 
+1

Esto no coincide con la funcionalidad.El -maxdepth 1 elimina ./abc/2010-06/def/ghi.jpg, pero no ./2010-06/def/ghi.jpg. –

+0

Te sugiero que te hagas una prueba y la descubras. Consulte la página de búsqueda de hombre para saber qué es maxdepth. – ghostdog74

+1

Te sugiero que pruebes este caso de prueba: 'mkdir -p 2010-06/def; toque 2010-06/def/ghi.jpg; para el archivo en * 2010-06 */*. jpg; hacer eco de "$ archivo"; done' Salida: 'bash: no match: * 2010-06 */*. jpg' (con la falla de glob de bash activada) –

6

Uso inútil de xargs.

find 2010-06* -iname "*.jpg" 

Al menos Gnu-hallazgo acepta múltiples caminos que buscar. -maxdepth y escriba -d se asume implícitamente.

Cuestiones relacionadas