Como concatenar todos os arquivos em um determinado diretório em ordem de data, onde quero o arquivo mais recente por cima?

18

E com o arquivo mais antigo na parte inferior?

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

InquilineKea
fonte

Respostas:

33

Para concatenar arquivos que você usa

cat file1 file2 file3 ...

Para obter uma lista dos nomes de arquivos citados, classificados por hora, primeiro os mais novos, use

ls -t

Juntando tudo,

cat $(ls -t) > outputfile

Você pode dar 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 xargs, usar quem entende a citação para passar os argumentos cat.

ls -tQ | xargs cat

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

angus
fonte
Isto não está funcionando no meu sistema debian ... eu tenho que usar cat $(ls -t) > outputfile, caso contrário, catrejeita os nomes dos arquivos citados
Mike Pennington
11
Meu erro. Eu sempre pego essas coisas. Veja a resposta atualizada.
Angus
Ah - por cabeçalhos redundantes, quero dizer coisas que normalmente são colocadas em algum arquivo header.php / footer.php, mas que são salvas separadamente quando salvas em HTML (e podem realmente aumentar o tamanho do arquivo quando você faz o download em massa de páginas PHP).
InquilineKea
cat $(ls -t)também é vulnerável à expansão do nome do arquivo. Se houver um nome de arquivo com uma expressão *, ou ?, ou entre colchetes (por exemplo file-[old].html); e se o nome do arquivo interpretado como um padrão corresponder a outros nomes de arquivos; a abordagem produzirá uma lista incorreta. set -fresolveria essa deficiência.
Barefoot IO
ls -Qpode produzir uma saída inadequada xargs. Por exemplo, "foo"torna-se "\"foo\"", mas xargs não entende aspas duplas escapadas em cadeias de caracteres entre aspas duplas.
Barefoot IO
2

A maneira mais fácil de listar arquivos em um pedido que não seja lexicográfico é com os qualificadores do zsh glob . Sem o zsh, você pode usar ls, mas analisar a saída de lsé cheio de perigos .

cat *(om)

Se você deseja remover algumas linhas, use sed ou awk ou perl. Por exemplo, para pegar o <head>arquivo do primeiro arquivo e combinar as <body>partes dos outros arquivos, assumindo que as tags <body>e </body>estejam 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 novo (assumindo que nenhum arquivo tem uma data no futuro.
  • Em seguida, copie do segundo *.htmlarquivo mais jovem , mas saia na </body>linha.
  • Em seguida, copie dos outros arquivos, mas pule tudo até a <body>linha e comece com a </body>linha.
  • Por fim, produza as últimas tags de fechamento.
Gilles 'SO- parar de ser mau'
fonte
1

A solução fornecida pelo @angus é boa, mas terá problemas se houver diretórios na pasta, isso será corrigido.

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

Abdul Rehman Janjua
fonte
Advertência: Essa resposta também é vulnerável à expansão do nome do caminho, conforme explicado no meu comentário à resposta do angus.
Barefoot IO
A menos que o status de saída do gato seja testado, um argumento de diretório deve ser inconseqüente. O gato simplesmente emitirá uma mensagem para stderr e prosseguirá para o próximo argumento.
Barefoot IO