¿Cómo puedo imprimir contenido en lugar del nombre del archivo usando el comando linux find?

10

Tengo miles de archivos UNL llamados algo así cbs_cdr_vou_20180624_603_126_239457.unl. Quería imprimir todas las líneas de esos archivos usando el siguiente comando. pero me da solo nombres de archivo. No necesito nombres de archivo, solo necesito contenido de esos archivos.

find -type f -name 'cbs_cdr_vou_20180615*.unl'  > /home/fifa/cbs/test.txt

Salida de corriente:

./cbs_cdr_vou_20180615_603_129_152023.unl
./cbs_cdr_vou_20180615_603_128_219001.unl
./cbs_cdr_vou_20180615_602_113_215712.unl
./cbs_cdr_vou_20180615_602_120_160466.unl
./cbs_cdr_vou_20180615_603_125_174428.unl
./cbs_cdr_vou_20180615_601_101_152369.unl
./cbs_cdr_vou_20180615_603_133_193306.unl

Rendimiento esperado:

8801865252020|200200|20180613100325|;
8801837463298|200200|20180613111209|;
8801845136955|200200|20180613133708|;
8801845205889|200200|20180613141140|;
8801837612072|200200|20180613141525|;
8801877103875|200200|20180613183008|;
8801877167964|200200|20180613191607|;
8801845437651|200200|20180613200415|;
8801845437651|200200|20180613221625|;
8801839460670|200200|20180613235936|;

Tenga en cuenta que, para el comando cat, recibo un error -bash: /bin/logger: Argument list too long, por eso quería usarlo en findlugar del catcomando.

Rezuan
fuente
Aún necesitas usar cat.
Ignacio Vazquez-Abrams
¡Si! ¿Me puede decir cómo puedo hacer eso? @ IgnacioVazquez-Abrams
Rezuan

Respuestas:

28

La findutilidad trata con nombres de ruta. Si no se menciona ninguna acción específica en el findcomando para los nombres de ruta encontrados, la acción predeterminada es generarlos.

Puede realizar una acción en los nombres de ruta encontrados, como ejecutar cat, agregando -execal findcomando:

find . -type f -name 'cbs_cdr_vou_20180615*.unl' -exec cat {} + >/home/fifa/cbs/test.txt

Esto encontraría todos los archivos regulares en o debajo del directorio actual, cuyos nombres coinciden con el patrón dado. Para lotes tan grandes de estos como sea posible, catse llamaría para concatenar el contenido de los archivos.

La salida iría a /home/fifa/cbs/test.txt.

Relacionado:

Kusalananda
fuente
1
Trabajar como se esperaba y el tiempo de ejecución es muy rápido, lo cual es realmente genial. Muchas gracias.
Rezuan
12

La salida de findresultará con los nombres de archivo relevantes.
Puede canalizar ( |) la salida a la xargs catque realizará el catcomando en cada archivo.

p.ej:

find -type f -name 'cbs_cdr_vou_20180615*.unl' | xargs cat  > /home/fifa/cbs/test.txt

Otra opción será usar -exec cat

find -type f -name 'cbs_cdr_vou_20180615*.unl'  -exec cat {} \;  > /home/fifa/cbs/test.txt
Yaron
fuente
44
Ambos comandos están funcionando bien. Pero un poco más lento que la orden de Kusalananda . Supongo que el tiempo de ejecución varía -exec cat {} \;y -exec -cat {} +. Por cierto, muchas gracias Yaron.
Rezuan
xargs es vulnerable a espacios en nombres de ruta encontrados; -exec cat {} no es
jez
2
find -print0 | xargs -0no es vulnerable a espacios / comillas / etc.
esponjoso
1
@Rezuan: -exec cat {} \;ejecuta cat por separado para cada archivo en lugar de agruparlos como xargs. No lo use a menos que lo desee explícitamente (por ejemplo, un comando que solo funcione para un archivo a la vez), o si necesita portabilidad a un sistema sin -exec ... +y sin -print0/ xargs -0. Sin embargo, estoy un poco sorprendido de que find|xargssea ​​mucho más lento que eso -exec cat {} +. ¿Tiene muy pocos archivos en total, por lo que la sobrecarga de inicio es una gran parte del costo? ¿O solo cronometraste la xargsversión mientras tu caché de disco estaba fría?
Peter Cordes
1
@PeterCordes gracias por la explicación. Era para el caché del disco, me di cuenta más tarde.
Rezuan