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

18

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

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

InquilineKea
источник

Ответы:

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