¿Cómo concateno todos los archivos en un directorio determinado en orden de fecha, donde quiero que el archivo más nuevo esté en la parte superior?

¿Cómo concateno todos los archivos en un directorio determinado en orden de fecha, donde quiero que el archivo más nuevo esté en la parte superior?

¿Y con el archivo más antiguo abajo?

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

Respuesta1

Para concatenar archivos utilizas

cat file1 file2 file3 ...

Para obtener una lista de nombres de archivos citados ordenados por tiempo, el más nuevo primero, utilice

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 archivos con espacios, esto no funcionará. My file.htmlSe supondrá que hay dos nombres de archivos: Myy file.html. Puede lscitar los nombres de los archivos y luego usar xargs, que entiende las comillas, 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é desea eliminar exactamente. ¿Qué son los “encabezados redundantes”?

Respuesta2

La forma más sencilla de enumerar archivos en un orden distinto al lexicográfico es con zshclasificatorios globales. Sin zsh, puedes usar ls, peroanalizar la salida de lsestá plagado de peligros.

cat *(om)

Si desea eliminar algunas líneas, use sed, awk o perl. Por ejemplo, para tomar las partes <head>del primer archivo y combinar las <body>partes de los otros archivos, asumiendo 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 reciente (suponiendo que ningún archivo tenga una fecha futura).
  • Luego copie desde el segundo *.htmlarchivo más reciente, 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.

Respuesta3

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

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

información relacionada