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.html
será assumido como sendo dois nomes de arquivos: My
e file.html
. Você pode ls
citar 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 ls
está 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*.html
arquivo mais recente (assumindo que nenhum arquivo tenha uma data no futuro. - Em seguida, copie do segundo
*.html
arquivo 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 / )