Jak połączyć wszystkie pliki w danym katalogu w kolejności od daty, w której chcę najnowszy plik na górze?

18

A z najstarszym plikiem na dole?

Ponadto, jeśli to zrobię, czy mogę również usunąć zbędne nagłówki zawarte w każdym pliku HTML? Widzę, że łączę wiele plików HTML i fajnie byłoby trochę zmniejszyć rozmiar ostatecznego pliku.

InquilineKea
źródło

Odpowiedzi:

33

Do łączenia używanych plików

cat file1 file2 file3 ...

Aby uzyskać listę cytowanych nazw plików posortowaną według czasu, najpierw użyj najnowszej

ls -t

Kładąc wszystko razem,

cat $(ls -t) > outputfile

Możesz podać kilka argumentów ls(np *.html.).

Ale jeśli masz nazwy plików ze spacjami, to nie zadziała. My file.htmlzakłada się, że są to dwie nazwy plików: Myi file.html. Możesz zrobić lscytowanie nazw plików, a następnie użyć xargs, kto rozumie cytowanie, aby przekazać argumenty cat.

ls -tQ | xargs cat

Jeśli chodzi o twoje drugie pytanie, odfiltrowanie części plików nie jest trudne, ale zależy to od tego, co dokładnie chcesz usunąć. Jakie są „zbędne nagłówki”?

angus
źródło
To nie działa na systemie Debian ... Mam do użytku cat $(ls -t) > outputfile, w przeciwnym razie catodrzuca podane nazwy plików
Mike Pennington
1
Mój błąd. Zawsze mnie to łapie. Zobacz zaktualizowaną odpowiedź.
angus
Och - przez redundantne nagłówki mam na myśli rzeczy, które normalnie są umieszczane w pliku header.php / footer.php, ale które są zapisywane osobno po zapisaniu w HTML (i naprawdę mogą zwiększyć rozmiar pliku podczas masowego pobierania stron PHP).
InquilineKea
cat $(ls -t)jest również podatny na rozszerzenie nazw plików. Jeśli istnieje nazwa pliku z wyrażeniem *, lub ?, lub wyrażeniem w nawiasie (np. file-[old].html); a jeśli nazwa pliku interpretowana jako wzorzec pasuje do innych nazw plików; podejście spowoduje niepoprawną listę. set -frozwiązałby ten problem.
Boso IO
ls -Qmoże wytwarzać produkt, który nie jest odpowiedni xargs. Na przykład "foo"staje się "\"foo\"", ale xargs nie rozpoznaje podwójnych cudzysłowów w ciągach cudzysłowów.
Boso IO
2

Najłatwiejszym sposobem wyświetlania plików w kolejności innej niż leksykograficzna jest użycie kwalifikatorów globu zsh . Bez zsh możesz używać ls, ale parsowanie wyjścia lsjest obarczone niebezpieczeństwami .

cat *(om)

Jeśli chcesz usunąć niektóre linie, użyj sed, awk lub perl. Na przykład, aby pobrać <head>pierwszy plik i połączyć <body>części z innych plików, zakładając, że znaczniki <body>i </body>są same w jednym wierszu w każdym pliku:

{
  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

Wyjaśnienie:

  • Najpierw concatenated.htmljest tworzony. Jest to zatem najmłodszy *.htmlplik (zakładając, że żaden plik nie ma daty w przyszłości.
  • Następnie skopiuj z drugiego najmłodszego *.htmlpliku, ale wyjdź z </body>linii.
  • Następnie skopiuj z innych plików, ale pomiń wszystko do <body>linii i zaczynając od </body>linii.
  • Na koniec wyprodukuj ostatnie znaczniki zamykające.
Gilles „SO- przestań być zły”
źródło
1

Rozwiązanie podane przez @angus jest dobre, ale będzie miało problemy, jeśli w folderze znajdują się katalogi, to to naprawi.

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

Abdul Rehman Janjua
źródło
Zastrzeżenie: ta odpowiedź jest również podatna na rozszerzenie nazwy ścieżki, jak wyjaśniono w moim komentarzu do odpowiedzi angusa.
Boso IO
O ile nie zostanie przetestowany status wyjścia kota, argument katalogu powinien być nieistotny. cat po prostu wyśle ​​wiadomość do stderr i przejdzie do następnego argumentu.
Boso IO