¿Cómo concatenar todos los archivos en un directorio dado en orden de fecha, donde quiero el archivo más nuevo en la parte superior?


18

¿Y con el archivo más antiguo en la parte inferior?

Además, si hago esto, ¿también es posible eliminar los encabezados redundantes contenidos en cada archivo HTML? Me veo concatenar muchos archivos HTML, y sería bueno reducir un poco el tamaño del archivo final.

Respuestas:


33

Para concatenar archivos que usa

cat file1 file2 file3 ...

Para obtener una lista de nombres de archivos citados ordenados por hora, primero los más nuevos, use

ls -t

Poniendolo todo junto,

cat $(ls -t) > outputfile

Es posible que desee dar algunos argumentos a ls(por ejemplo, *.html).

Pero si tiene nombres de archivo con espacios en ellos, esto no funcionará. My file.htmlse supondrá que son dos nombres de archivo: Myy file.html. Puede hacer una lscita entre los nombres de archivo y luego usar xargs, quién entiende la cita, para pasarle los argumentos cat.

ls -tQ | xargs cat

En cuanto a su segunda pregunta, filtrar partes de archivos no es difícil, pero depende de qué es exactamente lo que desea eliminar. ¿Qué son los "encabezados redundantes"?


Esto no funciona en mi sistema Debian ... Tengo que usarlo cat $(ls -t) > outputfile, de lo contrario catrechaza los nombres de archivo citados
Mike Pennington

1
Mi error. Siempre me atrapan estas cosas. Ver respuesta actualizada.
angus

Ah, por encabezados redundantes me refiero a cosas que normalmente se colocan en algún archivo header.php / footer.php, pero que se guardan por separado cuando se guardan en HTML (y realmente pueden aumentar el tamaño del archivo cuando descargas páginas PHP en masa).
InquilineKea

cat $(ls -t)También es vulnerable a la expansión del nombre de archivo. Si hay un nombre de archivo con una *o ?, o una expresión de paréntesis (por ejemplo file-[old].html); y si el nombre de archivo interpretado como un patrón coincide con otros nombres de archivo; El enfoque producirá una lista incorrecta. set -fabordaría esta deficiencia.
Descalzo IO

ls -Qpuede producir resultados que no son adecuados para xargs. Por ejemplo, se "foo"convierte "\"foo\"", pero xargs no comprende las comillas dobles escapadas dentro de las cadenas entre comillas dobles.
Descalzo IO

2

La forma más fácil de listar archivos en un orden que no sea lexicográfico es con los calificadores zsh glob . Sin zsh, puede usarlo ls, pero analizar la salida de lsestá lleno de peligros .

cat *(om)

Si desea quitar algunas líneas, use sed o awk o perl. Por ejemplo, para tomar <head>del primer archivo y combinar las <body>partes de los otros archivos, suponiendo que las etiquetas <body>y </body>estén solas en una línea en cada archivo:

{
  sed -e '/<\/body>/ q' *.html(om[2])
  sed -e '1,/<body>/ d' -e '/<\/body>/,$ d' *.html(om[3,-1])
  echo '</body>'
  echo '</html>'
} >concatenated.html

Explicación:

  • Primero, concatenated.htmlse crea. Por lo tanto, es el *.htmlarchivo más joven (suponiendo que ningún archivo tenga una fecha en el futuro.
  • Luego copie desde el segundo *.htmlarchivo más joven , pero salga en la </body>línea.
  • Luego copie de los otros archivos, pero omita todo hasta la <body>línea y comience con la </body>línea.
  • Finalmente produzca las últimas etiquetas de cierre.

1

La solución dada por @angus es buena pero tendrá problemas si hay directorios en la carpeta, esto lo solucionará.

cat $(ls -tpa | grep -v / )


Advertencia: esta respuesta también es vulnerable a la expansión del nombre de ruta, como se explica en mi comentario a la respuesta de angus.
Descalzo IO

A menos que se pruebe el estado de salida de cat, un argumento de directorio debe ser intrascendente. cat simplemente emitirá un mensaje a stderr y pasará al siguiente argumento.
Descalzo IO
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.