¿Cómo utilizar el comando "cat" en la salida del comando "find"?

13

Quiero redirigir la salida del findcomando al catcomando para poder imprimir los datos del archivo dado.

Entonces, por ejemplo, si la salida de find es, /aFile/readmeentonces el gato debe interpretarse como cat ./aFile/readme. ¿Cómo puedo hacer eso al instante?

¿Tengo que usar tuberías?

Probé versiones de esto:

cat | find ./inhere -size 1033c 2> /dev/null

Pero supongo que esto está completamente mal? Por supuesto, estoy seguro de que la salida es solo un archivo y no múltiples archivos.

Entonces, ¿cómo puedo hacer eso? Busqué en Google y no pude encontrar una solución, probablemente porque no busqué bien: P

Eksapsy
fuente

Respuestas:

21

Puedes hacerlo findsolo usando la -execacción:

find /location -size 1033c -exec cat {} +

{}se expandirá a los archivos encontrados y +nos permitirá leer tantos argumentos como sea posible por invocación cat, ya que cat puede tomar múltiples argumentos.

Si findno tiene la +extensión o desea leer los archivos uno por uno:

find /location -size 1033c -exec cat {} \;

Si desea utilizar alguna opción de cat, haga:

find /location -size 1033c -exec cat -n {} +
find /location -size 1033c -exec cat -n {} \;

Aquí estoy usando la -nopción para obtener los números de línea.

heemayl
fuente
Entonces, si estoy en lo correcto: {} es como una variable en la que se almacena la salida del comando find y después del signo "+" ¿se supone que debes escribir los parámetros cat? No ? Editar: Muy bien, editaste tu publicación y ahora acabas de responder mi pregunta: ¡P Thanx man! Resuelto!
Eksapsy
@ general656 Revisa mis ediciones ..
heemayl
1
El hecho de que no supiera sobre catla -nopción me sorprende. Me encanta leer preguntas al azar.
mazunki
0

Sustitución de comando

Otra opción es usar la sustitución de comandos . Al ajustar un comando, $()se ejecutará el comando y se reemplazará con su salida.

cat $(find ./inhere -size 1033c 2> /dev/null)

se convertirá

cat ./inhere/file1 .inhere/file3

Esto es más o menos equivalente a usar el estilo anterior de comandos de ajuste con ticks de retroceso:

cat `find ./inhere -size 1033c 2> /dev/null`

Más detalles de los documentos vinculados anteriormente

Bash realiza la expansión ejecutando el comando en un entorno de subshell y reemplazando la sustitución del comando con la salida estándar del comando, con cualquier nueva línea final eliminada. Las líneas nuevas incrustadas no se eliminan, pero pueden eliminarse durante la división de palabras. La sustitución del comando $(cat file)se puede reemplazar por el equivalente pero más rápido $(< file).

Cuando se utiliza la forma backquote viejo estilo de sustitución, la barra invertida conserva su significado literal excepto cuando es seguida por $, `o \. La primera comilla inversa no precedida por una barra diagonal inversa finaliza la sustitución del comando. Cuando se usa el $(command)formulario, todos los caracteres entre paréntesis forman el comando; ninguno es tratado especialmente.

Las sustituciones de comandos pueden estar anidadas. Para anidar al usar el formulario con comillas invertidas, escape de las comillas internas con barras diagonales inversas.

Si la sustitución aparece entre comillas dobles, la división de palabras y la expansión de nombre de archivo no se realizan en los resultados.

Vea esta otra respuesta para algunos buenos ejemplos de uso.

WhiteHotLoveTiger
fuente
Tenga en cuenta que si findencuentra demasiados archivos, esto generaría un error de "lista de argumentos demasiado larga" al intentar invocar cat. También tendría problemas para manejar nombres de archivos que contienen caracteres de espacios en blanco y posiblemente también nombres de archivos que contengan caracteres globales de nombre de archivo.
Kusalananda
-1

Esto imprimirá el nombre y el contenido de los archivos de texto (ascii) solo de forma recursiva.

find . -type f -exec grep -Iq . {} \; -print | xargs awk 'FNR==1{print FILENAME ":" $0; }'

Un intento mas

find . -type f -exec grep -Iq . {} \; -printf "\n%p:" -exec cat {} \;
Adlinge prasante
fuente
-2

Usa tubos y xargs

find /* -name pg_hba.conf | xargs cat

Si falla debido a la falta de permisos, puede usar sudo para asegurarse de que tiene permiso para ejecutar el comando find en el directorio que está buscando.

 sudo find /* -name pg_hba.conf | xargs sudo cat
App Work
fuente
1
Y si alguien ha creado un archivo llamado /tmp/ /dev/urandom /pg_hba.conf, eso permitirá que root descargue todo el contenido /dev/urandom. Peor probablemente se puede hacer dependiendo del contexto. xargscasi nunca debe usarse sin, -0si es que lo hace. También sudo xargssería mejor que xargs sudo. Y /*sería mejor como /.
Stéphane Chazelas
1
El OP quiere usar cat para imprimir el contenido del archivo en stdout. Entonces el propósito es servido por cat. La pregunta es cómo usar cat desde el comando out out of find para imprimir el contenido del archivo, no cómo usar sudo o find. El comando anterior resuelve la pregunta. Sí, xargs -0 fue lo único constructivo que apuntaste. Pero no mostró el uso. Intenta no ser grosero.
App Work
Lo siento si eso pareció grosero. Esa no era la intención. Quería señalar las limitaciones. Su respuesta muestra malas prácticas ( find|xargssin -0realmente debería estar prohibido), de ahí el voto negativo . La salida de findfuera -print0no es procesable de manera confiable. -print0No es estándar. Habiendo dicho eso, el estándar sudo find / -name pg_hba.conf -exec cat {} +también podría hacerte volcar el contenido de /dev/urandom(por ejemplo, si alguien creó un enlace simbólico a partir /tmp/pg_hba.confde él y no hay una forma fácil de evitarlo que al menos no tenga una condición de carrera).
Stéphane Chazelas
1
No usemos sudo"por si acaso", ¿de acuerdo?
lindhe
Bueno, es mejor que corrersudo rm -rf /
devinbost