Como faço para concatenar todos os arquivos de um determinado diretório em ordem de data, onde quero o arquivo mais novo no topo?

Como faço para concatenar todos os arquivos de um determinado diretório em ordem de data, onde quero o arquivo mais novo no topo?

E com o arquivo mais antigo embaixo?

Além disso, se eu fizer isso, também será possível remover os cabeçalhos redundantes contidos em cada arquivo HTML? Estou me vendo concatenando muitos arquivos HTML e seria bom reduzir um pouco o tamanho do arquivo final.

Responder1

Para concatenar arquivos que você usa

cat file1 file2 file3 ...

Para obter uma lista de nomes de arquivos citados, classificados por hora, os mais recentes primeiro, você usa

ls -t

Juntando tudo,

cat $(ls -t) > outputfile

Você pode querer fornecer alguns argumentos para ls(por exemplo, *.html).

Mas se você tiver nomes de arquivos com espaços, isso não funcionará. My file.htmlserá assumido como sendo dois nomes de arquivos: Mye file.html. Você pode lscitar os nomes dos arquivos e, em seguida, usar xargs, quem entende as aspas, para passar os argumentos para cat.

ls -tQ | xargs cat

Quanto à sua segunda pergunta, filtrar partes dos arquivos não é difícil, mas depende exatamente do que você deseja remover. O que são os “cabeçalhos redundantes”?

Responder2

A maneira mais fácil de listar arquivos em uma ordem diferente da lexicográfica é com zsheliminatórias globais. Sem zsh, você pode usar ls, masanalisar a saída de lsestá repleto de perigos.

cat *(om)

Se você quiser remover algumas linhas, use sed ou awk ou perl. Por exemplo, para pegar o <head>do primeiro arquivo e combinar as <body>partes dos outros arquivos, assumindo que as <body>tags </body>e estão sozinhas em uma linha em cada arquivo:

{
  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

Explicação:

  • Primeiro, concatenated.htmlé criado. É, portanto, o *.htmlarquivo mais recente (assumindo que nenhum arquivo tenha uma data no futuro.
  • Em seguida, copie do segundo *.htmlarquivo mais novo, mas saia na </body>linha.
  • Em seguida, copie dos outros arquivos, mas pule tudo até a <body>linha e começando pela </body>linha.
  • Finalmente produza as últimas tags de fechamento.

Responder3

A solução dada por @angus é boa, mas terá problemas se houver diretórios na pasta, isso resolverá o problema.

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

informação relacionada