Primero, comprenda que la tubería "|" los comandos de enlaces canalizan la salida del primero al segundo como un argumento. Sus dos códigos de shell canalizan la salida del comando de búsqueda a otros comandos (grep y xargs). Veamos esos comandos uno tras otro:
Primer comando:buscar
find es un programa para "buscar archivos en una jerarquía de directorios" (esa es la explicación de la página de manual de find). La sintaxis es (en este caso)
find <search directory> <search pattern> <action>
En ambos casos el directorio de búsqueda es . (ese es el directorio actual). Tenga en cuenta que no solo busca en el directorio actual, sino también en todos sus subdirectorios (la jerarquía de directorios).
El patrón de búsqueda acepta las opciones -name (lo que significa que busca archivos cuyo nombre coincida con el patrón dado como argumento para esta opción) o -iname (igual que el nombre pero no distingue entre mayúsculas y minúsculas), entre otras.
El patrón de acción puede ser -print0 (imprime el nombre de archivo exacto, incluida su posición en el directorio de búsqueda dado, es decir, la ruta relativa o absoluta al archivo) o -exec (ejecuta el comando dado en el archivo o archivos), el comando es terminará con ";" y cada instancia de "{}" se reemplazará por el nombre del archivo).
Es decir, el primer código de shell (primera parte, a la izquierda de la tubería)
find . -iname \*.jpg -print0
busca todos los archivos que terminan en ".jpg" en la jerarquía de directorios actual e imprime sus rutas y nombres. El segundo (primera parte)
find . -name '*' -exec file {} \;
encuentra todos los archivos en la jerarquía de directorios actual y los ejecuta
file <filename>
en ellos. Archivo es otro comando que determina e imprime el tipo de archivo (eche un vistazo a la página de manual para obtener más detalles, archivo de manual).
Segundo comando:xargs
xargs es un comando que "construye y ejecuta líneas de comando desde la entrada estándar" (man xargs), es decir, desde la salida de búsqueda que se canaliza a xargs. El comando que construye y ejecuta es en este caso
cp -v {} /home/joachim/neu2"
La opción -I{} define la cadena de reemplazo, es decir, cada instancia de {} en el comando debe ser reemplazada por la entrada que obtiene del archivo (es decir, los nombres de archivo). La opción -0 define que los elementos de entrada no terminan (separados) por espacios en blanco o líneas nuevas, sino solo por un carácter nulo. Esto parece ser necesario cuando se usa y la forma estándar de tratar con la salida de búsqueda como entrada xargs.
El comando que se compila y ejecuta es, por supuesto, el comando de copia con la opción -v (detallado) y copia cada uno de los nombres de archivo que obtiene de la búsqueda en el directorio.
Tercer comando:grep
grep filtra su entrada dando solo aquellas líneas o cadenas que coinciden con un patrón de salida particular. La opción -o le dice a grep que imprima solo la cadena coincidente, no la línea completa (ver man grep), -P le dice que interprete el siguiente patrón como un patrón perl regexp. En perl regex, ^ es el comienzo de la línea, .+ es cualquier cadena arbitraria, esta arbitraria debe ir seguida de dos puntos, un espacio, una cantidad de caracteres alfanuméricos (en perl regex denotados como \w+), un espacio y la cadena "imagen". Esencialmente, este comando grep filtra la salida del archivo para generar solo los nombres de archivo que son archivos de imagen. (Lea sobre perl regex, por ejemplo, aquí:http://www.comp.leeds.ac.uk/Perl/matching.html )
El comando que realmente querías
Ahora lo que quiere hacer es (1) tomar la salida del segundo comando de shell (que enumera los archivos de imagen), (2) ponerlo en la forma adecuada y (3) canalizarlo al comando xargs desde el primer comando de shell línea (que luego construye y ejecuta el comando de copia que desea). Entonces, esta vez tenemos un comando de shell de tres (en realidad cuatro) etapas con dos conductos. No es un problema. Ya tenemos las etapas (1) y (3) (aunque en la etapa (3) debemos omitir la opción -0 porque la entrada ya no encuentra la salida; la necesitamos para tratar las nuevas líneas como separadores de elementos).
Aún falta la etapa (2). Sugiero usar el comando de corte para esto. cut cambia las cadenas y las divide en diferentes campos (separados por un carácter delimitador en la cadena original) que luego se pueden reorganizar. Elegiré ":" como el carácter delimitador (esto finaliza el nombre del archivo en la salida grep, opción -d':') y le diré que nos proporcione solo el primer campo (opción -f1, esencial:imprima solo el nombre del archivo, no la parte que viene después del ":"), es decir, la etapa (2) sería
cut -d':' -f1
Y el comando completo que querías será:
find . -name '*' -exec file {} \; | grep -o -P '^.+: \w+ image' | cut -d':' -f1 | xargs -I{} cp -v {} /home/joachim/neu2
Tenga en cuenta que puede encontrar todas las páginas man, por ejemplo, aquí:http://www.linuxmanpages.com