Comment puis-je concaténer tous les fichiers dans un répertoire donné par ordre de date, où je veux le fichier le plus récent en haut?

18

Et avec le fichier le plus ancien en bas?

De plus, si je fais cela, est-il également possible de supprimer les en-têtes redondants contenus dans chaque fichier HTML? Je me vois concaténer un grand nombre de fichiers HTML et ce serait bien de réduire un peu la taille du fichier final.

InquilineKea
la source

Réponses:

33

Pour concaténer des fichiers que vous utilisez

cat file1 file2 file3 ...

Pour obtenir une liste des noms de fichiers cités triés par heure, en commençant par le plus récent, vous utilisez

ls -t

Mettre tous ensemble,

cat $(ls -t) > outputfile

Vous voudrez peut-être donner quelques arguments ls(par exemple, *.html).

Mais si vous avez des noms de fichiers contenant des espaces, cela ne fonctionnera pas. My file.htmlsera supposé être deux noms de fichiers: Myet file.html. Vous pouvez faire lsciter les noms de fichiers, puis utiliser xargs, qui comprend la citation, pour passer les arguments à cat.

ls -tQ | xargs cat

Quant à votre deuxième question, le filtrage de parties de fichiers n'est pas difficile, mais cela dépend de ce que vous souhaitez supprimer. Quels sont les «en-têtes redondants»?

angus
la source
Cela ne fonctionne pas sur mon système Debian ... Je dois utiliser cat $(ls -t) > outputfile, sinon je catrejette les noms de fichiers cités
Mike Pennington
1
Mon erreur. Je me fais toujours prendre sur ces choses. Voir la réponse mise à jour.
angus
Oh - par en-têtes redondants, je veux dire des choses qui sont normalement placées dans un fichier header.php / footer.php, mais qui sont enregistrées séparément lorsqu'elles sont enregistrées en HTML (et peuvent vraiment augmenter la taille du fichier lorsque vous téléchargez en masse des pages PHP).
InquilineKea
cat $(ls -t)est également vulnérable à l'expansion du nom de fichier. S'il y a un nom de fichier avec une expression *, ou ?, ou une parenthèse (par exemple file-[old].html); et si le nom de fichier interprété comme un modèle correspond à d'autres noms de fichiers; l'approche produira une liste incorrecte. set -fcomblerait cette lacune.
Barefoot IO
ls -Qpeut produire une sortie qui ne convient pas xargs. Par exemple, "foo"devient "\"foo\"", mais xargs ne comprend pas les guillemets doubles échappés dans les chaînes entre guillemets doubles.
Barefoot IO
2

Le moyen le plus simple de répertorier les fichiers dans un ordre autre que lexicographique est d' utiliser les qualificateurs zsh glob . Sans zsh, vous pouvez utiliser ls, mais l' analyse de la sortie de lsest lourde de dangers .

cat *(om)

Si vous souhaitez supprimer certaines lignes, utilisez sed ou awk ou perl. Par exemple, pour extraire le <head>du premier fichier et combiner les <body>parties des autres fichiers, en supposant que les balises <body>et </body>sont seules sur une ligne dans chaque fichier:

{
  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

Explication:

  • Tout d'abord, concatenated.htmlest créé. Il s'agit donc du *.htmlfichier le plus jeune (en supposant qu'aucun fichier n'ait de date dans le futur.
  • Copiez ensuite à partir du *.htmlfichier le plus jeune , mais quittez la </body>ligne.
  • Copiez ensuite à partir des autres fichiers, mais sautez tout jusqu'à la <body>ligne et commencez par la </body>ligne.
  • Produisez enfin les dernières balises de fermeture.
Gilles 'SO- arrête d'être méchant'
la source
1

La solution donnée par @angus est bonne mais aura des problèmes s'il y a des répertoires dans le dossier, cela le corrigera.

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

Abdul Rehman Janjua
la source
Mise en garde: Cette réponse est également vulnérable à l'expansion du nom de chemin, comme expliqué dans mon commentaire à la réponse d'angus.
Barefoot IO
À moins que l'état de sortie de cat ne soit testé, un argument de répertoire devrait être sans conséquence. cat émettra simplement un message à stderr et passera à l'argument suivant.
Barefoot IO