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

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

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 / )

Связанный контент