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.
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.
Odpowiedzi:
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”?
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.
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.
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:
concatenated.htmljest tworzony. Jest to zatem najmłodszy *.htmlplik (zakładając, że żaden plik nie ma daty w przyszłości.*.htmlpliku, ale wyjdź z </body>linii.<body>linii i zaczynając od </body>linii.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 / )
cat $(ls -t) > outputfile, w przeciwnym raziecatodrzuca podane nazwy plików