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.
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"?
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.
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.
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.
cat $(ls -t) > outputfile
, caso contrário,cat
rejeita os nomes dos arquivos citadoscat $(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 exemplofile-[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 -f
resolveria essa deficiência.ls -Q
pode produzir uma saída inadequadaxargs
. Por exemplo,"foo"
torna-se"\"foo\""
, mas xargs não entende aspas duplas escapadas em cadeias de caracteres entre aspas duplas.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 dels
é cheio de perigos .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:Explicação:
concatenated.html
é criado. Portanto, é o*.html
arquivo mais novo (assumindo que nenhum arquivo tem uma data no futuro.*.html
arquivo mais jovem , mas saia na</body>
linha.<body>
linha e comece com a</body>
linha.fonte
A solução fornecida pelo @angus é boa, mas terá problemas se houver diretórios na pasta, isso será corrigido.
cat $(ls -tpa | grep -v / )
fonte