unix - todos - cat varios archivos pero incluye nombre de archivo como encabezados
mover varios archivos en linux (17)
Me gustaría concatenar una serie de archivos de texto en un archivo grande en la terminal. Sé que puedo hacer esto usando el comando cat. Sin embargo, me gustaría que el nombre de archivo de cada archivo preceda al "volcado de datos" para ese archivo. Alguien sabe cómo hacer esto?
lo que tengo actualmente
file1.txt = bluemoongoodbeer
file2.txt = awesomepossum
file3.txt = hownowbrowncow
cat file1.txt file2.txt file3.txt
salida deseada:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Aquí es una forma muy simple. Dijiste que querías cat, lo que implica que quieres ver el archivo completo. Pero también necesita el nombre de archivo impreso.
Prueba esto
head -n99999999 *
o head -n99999999 file1.txt file2.txt file3.txt
Espero que ayude
Así es como normalmente manejo el formato de esa manera:
for i in *; do echo "$i"; echo ; cat "$i"; echo ; done ;
Generalmente canalizo al gato en un grep para obtener información específica.
Estaba buscando lo mismo, y encontré esto para sugerir:
tail -n +1 file1.txt file2.txt file3.txt
Salida:
==> file1.txt <==
<contents of file1.txt>
==> file2.txt <==
<contents of file2.txt>
==> file3.txt <==
<contents of file3.txt>
Si solo hay un archivo, el encabezado no se imprimirá. Si usa utilidades de GNU, puede usar -v
para imprimir siempre un encabezado.
Este método imprimirá el nombre del archivo y luego los contenidos del archivo:
tail -f file1.txt file2.txt
Salida:
==> file1.txt <==
contents of file1.txt ...
contents of file1.txt ...
==> file2.txt <==
contents of file2.txt ...
contents of file2.txt ...
Esto debería funcionar:
for filename in file1.txt file2.txt file3.txt; do
echo "$filename"
cat "$filename"
done > output.txt
o hacer esto para todos los archivos de texto recursivamente:
find . -type f -name ''*.txt'' -print | while read filename; do
echo "$filename"
cat "$filename"
done > output.txt
Esto debería hacer el truco también:
find . -type f -print -exec cat {} /;
Medio:
find = linux `find` command finds filenames, see `man find` for more info
. = in current directory
-type f = only files, not directories
-print = show found file
-exec = additionally execute another linux command
cat = linux `cat` command, see `man cat`, displays file contents
{} = placeholder for the currently found filename
/; = tell `find` command that it ends now here
Además, puede combinar búsquedas a través de operadores booleanos como -and
-or
. find -ls
es bueno, también.
Me gusta esta opcion
for x in $(ls ./*.php); do echo $x; cat $x | grep -i ''menuItem''; done
La salida se ve así:
./debug-things.php
./Facebook.Pixel.Code.php
./footer.trusted.seller.items.php
./GoogleAnalytics.php
./JivositeCode.php
./Live-Messenger.php
./mPopex.php
./NOTIFICATIONS-box.php
./reviewPopUp_Frame.php
$(''#top-nav-scroller-pos-<?=$active**MenuItem**;?>'').addClass(''active'');
gotTo**MenuItem**();
./Reviews-Frames-PopUps.php
./social.media.login.btns.php
./social-side-bar.php
./staticWalletsAlerst.php
./tmp-fix.php
./top-nav-scroller.php
$active**MenuItem** = ''0'';
$active**MenuItem** = ''1'';
$active**MenuItem** = ''2'';
$active**MenuItem** = ''3'';
./Waiting-Overlay.php
./Yandex.Metrika.php
Para resolver estas tareas suelo usar el siguiente comando:
$ cat file{1..3}.txt >> result.txt
Es una forma muy conveniente de concatenar archivos si la cantidad de archivos es bastante grande.
Si desea que el resultado tenga el mismo formato que su salida deseada, puede probar:
for file in `ls file{1..3}.txt`; /
do echo $file | cut -d ''.'' -f 1; /
cat $file ; done;
Resultado:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Puede colocar echo -e
antes y después del corte para que tenga el espacio entre las líneas también:
$ for file in `ls file{1..3}.txt`; do echo $file | cut -d ''.'' -f 1; echo -e; cat $file; echo -e ; done;
Resultado:
file1
bluemoongoodbeer
file2
awesomepossum
file3
hownowbrowncow
Si quieres reemplazar esos feos ==> <== con otra cosa
tail -n +1 *.txt | sed -e ''s/==>//n###/g'' -e ''s/<==/###/g'' >> "files.txt"
explicación:
tail -n +1 *.txt
: genera todos los archivos en la carpeta con encabezado
sed -e ''s/==>//n###/g'' -e ''s/<==/###/g''
- replace ==>
con nueva línea + ### y <==
con sólo ###
>> "files.txt"
- >> "files.txt"
todo a un archivo
Si te gustan los colores, prueba esto:
for i in *; do echo; echo $''/e[33;1m''$i$''/e[0m''; cat $i; done | less -R
o:
tail -n +1 * | grep -e $ -e ''==.*''
o: (con el paquete ''multitail'' instalado)
multitail *
Tenía una serie de archivos que terminaban en stats.txt que quería concatenar con los nombres de archivo.
Hice lo siguiente y cuando hay más de un archivo, el comando "más" incluye el nombre del archivo como encabezado.
more *stats.txt > stats.txt
o para un caso general
more FILES_TO_CONCAT > OUTPUT_FILE
Usé grep para algo similar:
grep "" *.txt
No le da un ''encabezado'', sino que prefija cada línea con el nombre del archivo.
puedes usar este simple comando en lugar de usar un bucle for,
ls -ltr | awk ''{print $9}'' | xargs head
find . -type f -exec cat {} /; -print
find . -type f -print0 | xargs -0 -I % sh -c ''echo %; cat %''
Esto imprimirá el nombre completo del archivo (incluida la ruta), y luego el contenido del archivo. También es muy flexible, ya que puede usar -name "expr" para el comando de búsqueda y ejecutar tantos comandos como desee en los archivos.
- AIX 7.1 ksh
... pegándonos a quienes ya han mencionado que Head trabaja para algunos de nosotros:
$ r head
head file*.txt
==> file1.txt <==
xxx
111
==> file2.txt <==
yyy
222
nyuk nyuk nyuk
==> file3.txt <==
zzz
$
Mi necesidad es leer la primera línea; como se indicó, si desea más de 10 líneas, deberá agregar opciones (encabezado -9999, etc.).
Perdón por publicar un comentario derivado; No tengo suficientes credenciales para comentar / agregar al comentario de alguien.