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

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

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

Entonces, por ejemplo, si el resultado de find es /aFile/readmeentonces cat 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 el resultado es solo un archivo y no varios archivos.

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

Respuesta1

Puedes hacer esto findsolo usando la -execacción:

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

{}será reemplazado por los archivos encontrados por findy +nos permitirá leer tantos argumentos como sea posible por invocación de cat, ya que catpuede tomar múltiples argumentos.

Si findno tienes la +extensión estándar o quieres leer los archivos uno por uno:

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

Si desea utilizar alguna de las opciones 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.

Respuesta2

Sustitución de comando

Otra opción es utilizarSustitución de comando. Al empaquetar un comando $()se ejecutará el comando y se reemplazará el comando con su salida.

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

se convertirá

cat ./inhere/file1 ./inhere/file2 ./inhere/file3

Esto es más o menos equivalente a usar el estilo antiguo de ajustar comandos con comillas invertidas:

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, eliminando las nuevas líneas finales. Las nuevas líneas incrustadas no se eliminan, pero pueden eliminarse durante la división de palabras. La sustitución del comando $(cat file)se puede sustituir por el equivalente pero más rápido $(< file).

Cuando se utiliza la antigua forma de sustitución de comillas invertidas, la barra invertida conserva su significado literal, excepto cuando va seguida de $, `o \. La primera comilla invertida que no esté precedida por una barra invertida finaliza la sustitución del comando. Cuando se utiliza el $(command)formulario, todos los caracteres entre paréntesis forman el comando; ninguno recibe un trato especial.

Las sustituciones de comandos pueden estar anidadas. Para anidar cuando se utiliza el formulario con comillas invertidas, escape las comillas internas con barras invertidas.

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

Veresta otra respuestapara ver algunos buenos ejemplos de uso.

Respuesta3

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 más

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

Respuesta4

Usar tubería y xargs

find /* -name pg_hba.conf | xargs cat

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

 sudo find /* -name pg_hba.conf | xargs sudo cat

información relacionada