And with the oldest file on bottom?
Also, if I do this, is it also possible to strip out the redundant headers contained within each HTML file? I'm seeing myself concatenate a lot of HTML files up, and it would be nice to reduce the file size of the ultimate file a bit.
решение1
To concatenate files you use
cat file1 file2 file3 ...
To get a list of quoted filenames sorted by time, newest first, you use
ls -t
Собирая все это вместе,
cat $(ls -t) > outputfile
Возможно, вы захотите привести некоторые аргументы ls
(например, *.html
).
Но если у вас есть имена файлов с пробелами, это не сработает. My file.html
будет считаться, что это два имени файлов: My
и file.html
. Вы можете ls
заключить в кавычки имена файлов, а затем использовать xargs
, который понимает кавычки, чтобы передать аргументы в cat
.
ls -tQ | xargs cat
Что касается вашего второго вопроса, отфильтровывать части файлов несложно, но это зависит от того, что именно вы хотите удалить. Что такое «избыточные заголовки»?
решение2
Самый простой способ перечислить файлы в порядке, отличном от лексикографического, — использовать zshквалификаторы glob. Без zsh можно использовать ls
, ноанализ вывода ls
чреват опасностями.
cat *(om)
Если вы хотите удалить некоторые строки, используйте sed или awk или perl. Например, чтобы взять <head>
из первого файла и объединить <body>
части из других файлов, предполагая, что теги <body>
и </body>
находятся поодиночке на строке в каждом файле:
{
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
Объяснение:
- Сначала
concatenated.html
создается. Следовательно, это самый молодой*.html
файл (при условии, что ни один файл не имеет даты в будущем). - Затем скопируйте из второго по старшинству
*.html
файла, но остановитесь на</body>
строке. - Затем скопируйте из других файлов, но пропустите все до строки
<body>
и начните со</body>
строки. - Наконец, создайте последние закрывающие теги.
решение3
Решение, предложенное @angus, хорошее, но если в папке есть каталоги, возникнут проблемы. Это решение исправит ситуацию.
cat $(ls -tpa | grep -v / )