Як з'єднати всі файли в даному каталозі за порядком дати, де я хочу отримати найновіший файл зверху?


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
Моя помилка. Я завжди потрапляю на ці речі. Дивіться оновлену відповідь.
— angus

О, під надмірними заголовками я маю на увазі речі, які зазвичай містяться у якомусь файлі 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 / )


Caveat: Ця відповідь також вразлива для розширення імені шляху, як пояснено в моєму коментарі до відповіді angus.
— Босоніж IO

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