Mostrar contenidos de muchos archivos

19

Desde la línea de comandos, ¿cuál es la forma más fácil de mostrar el contenido de varios archivos? Mi directorio se ve a continuación.

./WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b
./xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM
./GZnATXO1e5Hh3Bz1bhgJjjwheIjjZqtnXR0hfOyj
./mWz7ehBNoTZmtDh8JG6sxw2lMJFwIovPzxDGECUY
./JN65F5v3RL2ilHPqNSx9N9D4lvVpqpbJ9lASd8TJ
./At9PS4y4nTiXUO0Z0USnbYkTPBla1msQRpwuruqE
./YiPyMZPCaUDZTiTczAvWII9bJrUqLXCFtH2pXEA2
./JoakdlbRFPwAvWp1d4n8RvMoyMeizCoiriL2Sn2U
./wFPWZUus8Yu7UtESGABLCoqDg36cT90USO0xuyUr
./qseI9PgV1EJfZCDyGGeVytajqG7JeX0r7eA5S1JW
./zgFJpNgXyCsaVh38aCuMGuzHwIbwSNB6rQDdh27x
./.htaccess

Ahora me gustaría ver el contenido de todos los archivos excepto .htaccess. Podría parecerse a algo como:

WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b:
Contents of file WtCgikkCFHmmuXQXp0FkZjVrnJSU64Jb9WSyZ52b.

xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM:
Contents of file xdIwVHnHY7dnuM9zcPDYQGZFdoVORPyMVD2IzjgM.

[...]

Creo que esto debería ser posible con una combinación de find, xargs y cat, pero no he descubierto cómo. ¡Gracias por tu tiempo!

Znarkus
fuente
stackoverflow.com/questions/5917413/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

30

Los dos comandos estándar heade tailimprimen un encabezado con el nombre del archivo si les pasa más de un argumento de archivo. Para imprimir todo el archivo, use tail -n +1(imprimir desde la primera línea en adelante, es decir, todo).

Aquí, parece que desea ver todos los archivos, excepto el único cuyo nombre comienza con un punto. Los archivos de puntos están "ocultos" en Unix: no aparecen en la salida predeterminada lso en una coincidencia de comodines. Por lo tanto, la coincidencia de todos los archivos no ocultos se realiza con solo *.

tail -n +1 *

(Estrictamente hablando, tail -n +1 -- *es necesario en caso de que uno de los nombres de archivo comience con a -.)

Gilles 'SO- deja de ser malvado'
fuente
Corto y dulce, gracias! ¿Sabes dónde puedo leer sobre el --modificador?
Znarkus
2
@ Znarkus: --significar el final de las opciones es una convención que la mayoría de los comandos obedecen. Por ejemplo, tail -n +1 -- -f -gdice taileso -fy -gson archivos para leer (operandos) y no opciones. Es la directriz 10 en la directriz de sintaxis de la utilidad POSIX (un documento destinado a escritores de utilidades). No tengo una sugerencia de lectura destinada a usuarios finales, esperaría un buen tutorial de Unix para cubrirlo en algún momento.
Gilles 'SO- deja de ser malvado'
Sólo una observación, debido a que muchas otras respuestas proponen utilizar find, pero luego utilizan algún ejecutivo con el formato de impresión: Una forma sencilla de utilizar findy tailes: find . -type f -print0 -name "*" | xargs -0 tail -n +1 -- ( -print0y xargs -0, y el-- asegurar que el comando también funciona con nombres de archivo con espacios o comenzar con -)
IanH
14

Puedes hacerlo todo en uno con find:

$ find . -type f -not -name .htaccess -printf "\n%p\n" -exec cat {} \;

Eso dice find que busque todos los archivos ( -type f) en el directorio actual ( .) excepto ( -not) uno llamado .htaccess( -name .htaccess). Luego imprime ( -printf) una nueva línea seguida del nombre del archivo ( %p), y luego se ejecuta caten el archivo ( -exec cat {} \;). Eso te dará resultados como:

test/test3
Line 1

test/test2
Line 1

test/test1
Line 1
Line 2
Line 3

Si hace esto a menudo, puede valer la pena incluirlo en un script de shell o una función; Tengo uno llamado catsque hace exactamente eso:

#!/bin/bash
for filename; do
    echo "\033[32;1m$filename\033[0m"
    cat "$filename"
    echo
done

Recorre cada argumento de nombre de archivo, imprime el nombre de archivo (en negrita verde) y luego captura el archivo:

Captura de pantalla de ejemplo

Entonces, el comando sería:

$ find . -type f -not -name .htaccess -exec cats {} \+
Michael Mrozek
fuente
El otro era más corto, así que acepté eso. Excelente respuesta, gracias!
Znarkus
6

Para mostrar el contenido de todos los archivos en la carpeta actual, intente:

grep -vI "\x00" -- *

y similar, pero recursivamente:

grep -vIr "\x00" -- .

El formato sería: filename: content.

Para tener un formato similar al sugerido, sería:

grep -rvl "\x00" -- * | while read file; do printf "\n\n#### $file ####\n"; cat $file; done

Notas al margen:

  • El uso de NUL ( \x00) en los ejemplos anteriores evita la visualización de archivos binarios (que en -Irealidad está funcionando, pero aún tenemos que usar algún patrón).
  • Usando comodín ( *), automáticamente ignora los archivos ocultos como .htaccess.

Vea también: grep: muestre el nombre de archivo una vez, luego muestre el contexto con números de línea en Unix SE

kenorb
fuente
2
Por grep -r ^lo general es suficiente.
catpnosis
2

Puedes usar esto:

cat $(find Directory/ -not -name *.htaccess)
Oskar
fuente
1

Si desea afinar y no perder demasiado tiempo con las tuberías, busque y todo (aunque es la cadena de herramientas más poderosa que pueda encontrar)

solo intenta usar un bucle for, cat, etc.

tiktak
fuente
0

Si desea imprimirlo también, use recursivamente (para archivos con extensión .sql, por ejemplo):

find -name "*.sql" -exec cat {} \; > all.sql
Andrade
fuente