2012-09-23 20 views
33

No puedo encontrar una forma de imprimir cada nombre de archivo antes de su contenido con cat. Esto es lo que estoy tratando de hacer:mostrar el contenido de todos los archivos con sus nombres de archivo con cat

[email protected]:~/Perl/t$ ls 
1.txt 2.txt 3.txt 
[email protected]:~/Perl/t$ echo " I am " >> 1.txt 
[email protected]:~/Perl/t$ echo " trying " >> 2.txt 
[email protected]:~/Perl/t$ echo " to do this " >> 3.txt 
[email protected]:~/Perl/t$ cat *.* 
I am 
trying 
to do this 
[email protected]:~/Perl/t$ 

En el último comando llegué sólo el texto de esos archivos, pero en realidad quiero que el texto junto con los nombres de los archivos. Me refiero a esto como

Filename:1.txt 
<Data in the file> 

Filename:2.txt 
<Data in that file> 

Filename:3.txt 
<Data in that file > 

Respuesta

54

cat no se imprimirán los nombres de archivo. O bien get the shell to do it o use head o tail en su lugar: imprimen el nombre del archivo cuando pasa varios archivos (no exactamente en el mismo formato). Use tail -n +1 para imprimir el archivo completo (comenzando en la línea 1, las líneas se numeran desde 1).

tail -n +1 -- *.txt 
+1

esto se ve muy simple. ¿Puedo saber por qué lo mencionó? Después de 1 en el comando de cola. porque sin ellos obtuve el mismo resultado. ¿Hay alguna razón oculta? http://pastebin.com/1WgHAUZq –

+3

Al menos para 'tail (GNU coreutils) 8.13', que debería ser' tail -n +1 - * .txt' porque 'tail -n 1' solo genera la última línea de cada archivo. Además, el '-' impide la interpretación como opciones de cualquier nombre de archivo que empiece por '-' –

+8

O' grep^* 'imprimirá el nombre de archivo como el prefijo de cada línea de salida. – tripleee

14
$ for f in *; do echo "Filename: $f"; cat "$f"; done 
Filename: 1.txt 
I am 
Filename: 2.txt 
trying 
Filename: 3.txt 
to do this 
+0

aah! Eso es increíble amigo. Gracias. Código simple. –

+3

No hacks sucios. Sin salida de basura. Autodescriptivo e intuitivo. +1 –

+2

Lo que más me gusta de esta solución es que incluso funciona en las versiones de Linux más depuradas (por ejemplo, en un enrutador con busybox que incluso podría no tener xargs, menos, más, buscar, ... dependiendo de la configuración). ¡Gracias! – NoUsername

34

Esto fue discutido recientemente en Hacker News a través de la entrada de blog 4 unix commands I abuse every day.

El quid de la cuestión era utilizar esto:

more * | cat 

Para conseguir esto:

:::::::::::::: 
jack.txt 
:::::::::::::: 
Once upon a time 
there was a fellow named Jack. 
:::::::::::::: 
lyingryan.txt 
:::::::::::::: 
Now that "trickle down economics" has been 
tested for 30 years and the data shows it 
has been a total failure, candidates 
still claim that cutting taxes for 
billionaires will help the economy. 
:::::::::::::: 
market.txt 
::::::::::::::: 
Jack went to market to sell the family 
cow. 
He came back with a handful of magic beans. 

Cuál es mucho más bonita que un bucle for ... do ... done.

La entrada del blog también menciona muchas alternativas a este enfoque para ser compatible en diferentes unixes, como head -n 99999 * en comparación con head -n 0 * que solo funciona en Linux.

+0

'head -n 99999 *' funcionó para mí en Mac OSX. – rcdmk

9

Puede lograrlo por ejemplo, con

ls -1 *.txt | xargs -I % sh -c "echo % ; cat %" 

simplemente:

  • para cada archivo .txt
  • ejecutar el comando echo filename ; cat filename (el % es un patrón de sustitución definida por -I)
+1

+1 Solución agradable, limpia y universal. – cajwine

+0

@Nemo puede explicar lo que hace -I% sh -c en ese comando – CodeCrack

13
find . -name \*.txt -print -exec cat {} \; 
8

También puede grep uso excesivo un poco lograr que:

grep -r '.*' *.txt 

Para obtener los números de línea que pueda

grep -rn '.*' *.txt 

Por encima de grep sólo se ve para nada. En caso de que no está interesado en las líneas vacías que incluso puede haber simplificado:

grep -r . *txt 

Además -r interruptor grep grep hace para funcionar de forma recursiva, por lo que puede

grep -r . . 

para listar el contenido de todos los archivos en sus directorios actuales.

[EDITAR] Desventaja: es lento, por lo que para una gran cantidad de archivos no lo usaría.

+1

Esto es muy útil para el código fuente línea por línea auditando, escaneando todas las líneas de código para asegurar la presencia de ciertos patrones y al encontrar una línea de código que no también informa el nombre de archivo en la misma línea. –

Cuestiones relacionadas