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.
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»?
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.
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.
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.
cat $(ls -t) > outputfile
, sinon jecat
rejette les noms de fichiers citéscat $(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 exemplefile-[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 -f
comblerait cette lacune.ls -Q
peut produire une sortie qui ne convient pasxargs
. Par exemple,"foo"
devient"\"foo\""
, mais xargs ne comprend pas les guillemets doubles échappés dans les chaînes entre guillemets doubles.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 dels
est lourde de dangers .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:Explication:
concatenated.html
est créé. Il s'agit donc du*.html
fichier le plus jeune (en supposant qu'aucun fichier n'ait de date dans le futur.*.html
fichier le plus jeune , mais quittez la</body>
ligne.<body>
ligne et commencez par la</body>
ligne.la source
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 / )
la source