А с самым старым файлом внизу?
Кроме того, если я сделаю это, можно ли удалить лишние заголовки, содержащиеся в каждом файле HTML? Я вижу, как объединяю много HTML-файлов, и было бы неплохо немного уменьшить размер конечного файла.
А с самым старым файлом внизу?
Кроме того, если я сделаю это, можно ли удалить лишние заголовки, содержащиеся в каждом файле HTML? Я вижу, как объединяю много HTML-файлов, и было бы неплохо немного уменьшить размер конечного файла.
Ответы:
Для объединения файлов, которые вы используете
cat file1 file2 file3 ...
Чтобы получить список именованных файлов, отсортированных по времени, сначала самое новое, используйте
ls -t
Собираем все вместе,
cat $(ls -t) > outputfile
Возможно, вы захотите привести некоторые аргументы ls
(например, *.html
).
Но если у вас есть имена файлов с пробелами, это не будет работать. My file.html
предполагается, что будут два имени файла: My
и file.html
. Вы можете сделать ls
кавычки имен файлов, а затем использовать xargs
, кто понимает цитирование, для передачи аргументов cat
.
ls -tQ | xargs cat
Что касается вашего второго вопроса, отфильтровать части файлов не сложно, но это зависит от того, что именно вы хотите удалить. Что такое «избыточные заголовки»?
cat $(ls -t)
также уязвим для расширения имени файла. Если есть имя файла с выражением *
, или ?
, или выражение в скобках (например file-[old].html
); и если имя файла, интерпретируемое как образец, совпадает с другими именами файла; подход приведет к неправильному списку. set -f
будет решать этот недостаток.
ls -Q
может производить вывод, который не подходит для xargs
. Например, "foo"
становится "\"foo\""
, но xargs не понимает экранированные двойные кавычки в строках с двойными кавычками.
Самый простой способ перечисления файлов в порядке, отличном от лексикографического, - это с помощью квалификаторов глобуса zsh . Без 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>
строки.Решение, данное @angus, хорошо, но будет иметь проблемы, если в папке есть каталоги, это исправит это.
cat $(ls -tpa | grep -v / )
cat $(ls -t) > outputfile
, в противном случаеcat
отвергать процитированные имена файлов