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

17

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 um monte de arquivos HTML, e seria bom reduzir um pouco o tamanho do arquivo final.

    
por InquilineKea 16.06.2012 / 09:32

3 respostas

30

Para concatenar arquivos que você usa

cat file1 file2 file3 ...

Para obter uma lista de nomes de arquivos citados por hora, o mais novo primeiro, você usa

ls -t

Colocando tudo junto,

cat $(ls -t) > outputfile

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

Mas se você tiver nomes de arquivos com espaços, isso não funcionará. My file.html será considerado como dois nomes de arquivos: My e file.html . Você pode fazer com que ls cite os nomes dos arquivos e, em seguida, use xargs , que entende as citações, para passar os argumentos para cat .

ls -tQ | xargs cat

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

    
por 16.06.2012 / 10:40
2

A maneira mais fácil de listar arquivos em uma ordem diferente de lexicográfica é com zsh qualificadores a>. Sem zsh, você pode usar ls , mas analisar a saída de ls está repleta de perigos .

cat *(om)

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

{
  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 arquivo *.html mais novo (supondo que nenhum arquivo tenha uma data no futuro.
  • Em seguida, copie do segundo arquivo mais recente *.html , mas saia na linha </body> .
  • Em seguida, copie dos outros arquivos, mas pule tudo para baixo na linha <body> e comece com a linha </body> .
  • Finalmente, produza as últimas tags de fechamento.
por 17.06.2012 / 03:33
1

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

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

    
por 20.02.2016 / 16:41