Как объединить все файлы в указанном каталоге в порядке даты, где я хочу, чтобы самый новый файл находился сверху?


18

А с самым старым файлом внизу?

Кроме того, если я сделаю это, можно ли удалить лишние заголовки, содержащиеся в каждом файле HTML? Я вижу, как объединяю много HTML-файлов, и было бы неплохо немного уменьшить размер конечного файла.

Ответы:


33

Для объединения файлов, которые вы используете

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

Что касается вашего второго вопроса, отфильтровать части файлов не сложно, но это зависит от того, что именно вы хотите удалить. Что такое «избыточные заголовки»?


Это не работает в моей системе Debian ... Я должен использовать cat $(ls -t) > outputfile, в противном случае catотвергать процитированные имена файлов
Майк Пеннингтон

1
Моя ошибка. Я всегда ловлюсь на этих вещах. Смотрите обновленный ответ.
ангус

Да, под избыточными заголовками я подразумеваю вещи, которые обычно помещаются в некоторый файл header.php / footer.php, но которые сохраняются отдельно при сохранении в HTML (и могут действительно увеличить размер файла, когда вы массово загружаете страницы PHP).
InquilineKea

cat $(ls -t)также уязвим для расширения имени файла. Если есть имя файла с выражением *, или ?, или выражение в скобках (например file-[old].html); и если имя файла, интерпретируемое как образец, совпадает с другими именами файла; подход приведет к неправильному списку. set -fбудет решать этот недостаток.
Босиком IO

ls -Qможет производить вывод, который не подходит для xargs. Например, "foo"становится "\"foo\"", но xargs не понимает экранированные двойные кавычки в строках с двойными кавычками.
Босиком IO

2

Самый простой способ перечисления файлов в порядке, отличном от лексикографического, - это с помощью квалификаторов глобуса 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>строки.
  • Наконец, создайте последние закрывающие теги.

1

Решение, данное @angus, хорошо, но будет иметь проблемы, если в папке есть каталоги, это исправит это.

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


Предостережение: Этот ответ также уязвим для расширения имени пути, как объяснено в моем комментарии к ответу ангуса.
Босиком IO

Если состояние выхода cat не проверено, аргумент каталога должен быть несущественным. cat просто отправит сообщение в stderr и перейдет к следующему аргументу.
Босиком IO
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.