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


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.