Bagaimana cara menggabungkan semua file dalam direktori yang diberikan sesuai urutan tanggal, di mana saya ingin file terbaru di atas?

18

Dan dengan file tertua di bawah?

Juga, jika saya melakukan ini, apakah mungkin untuk menghapus header redundan yang terkandung dalam setiap file HTML? Saya melihat diri saya menyatukan banyak file HTML, dan alangkah baiknya untuk mengurangi ukuran file dari file ultimate sedikit.

InquilineKea
sumber

Jawaban:

33

Untuk menggabungkan file yang Anda gunakan

cat file1 file2 file3 ...

Untuk mendapatkan daftar nama file yang dikutip yang diurutkan berdasarkan waktu, yang terbaru lebih dulu, Anda gunakan

ls -t

Menyatukan semuanya,

cat $(ls -t) > outputfile

Anda mungkin ingin memberikan beberapa argumen kepada ls(misalnya, *.html).

Tetapi jika Anda memiliki nama file dengan spasi di dalamnya, ini tidak akan berhasil. My file.htmlakan dianggap dua nama file: Mydan file.html. Anda dapat membuat lskutipan nama file, dan kemudian menggunakan xargs, yang memahami kutipan, untuk meneruskan argumen cat.

ls -tQ | xargs cat

Adapun pertanyaan kedua Anda, memfilter bagian file tidak sulit, tetapi itu tergantung pada apa yang ingin Anda hapus. Apa itu "header yang berlebihan"?

angus
sumber
Ini tidak berfungsi pada sistem debian saya ... Saya harus menggunakan cat $(ls -t) > outputfile, jika tidak, catmenolak nama file yang dikutip
Mike Pennington
1
Kesalahanku. Saya selalu terjebak dengan hal-hal ini. Lihat jawaban yang diperbarui.
angus
Oh - dengan header redundan saya maksudkan hal-hal yang biasanya dimasukkan ke dalam beberapa file header.php / footer.php, tetapi yang disimpan secara terpisah ketika disimpan ke HTML (dan benar-benar dapat meningkatkan ukuran file ketika Anda mengunduh halaman PHP secara massal).
InquilineKea
cat $(ls -t)juga rentan terhadap ekspansi nama file. Jika ada nama file dengan *,, atau ?ekspresi braket (misalnya file-[old].html); dan jika nama file diartikan sebagai suatu pola cocok dengan nama file lainnya; pendekatan akan menghasilkan daftar yang salah. set -fakan mengatasi kekurangan ini.
Barefoot IO
ls -Qdapat menghasilkan output yang tidak sesuai xargs. Misalnya, "foo"menjadi "\"foo\"", tetapi xargs tidak memahami tanda kutip ganda yang lolos dalam string kutipan ganda.
Barefoot IO
2

Cara termudah untuk mendaftarkan file dalam urutan selain leksikografis adalah dengan kualifikasi zsh glob . Tanpa zsh, Anda dapat menggunakan ls, tetapi mengurai output lspenuh dengan bahaya .

cat *(om)

Jika Anda ingin menghilangkan beberapa garis, gunakan sed atau awk atau perl. Misalnya, untuk mengambil <head>dari file pertama dan menggabungkan <body>bagian - bagian dari file lain, dengan asumsi bahwa <body>dan </body>tag sendirian di baris di setiap file:

{
  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

Penjelasan:

  • Pertama, concatenated.htmldibuat. Oleh karena itu *.htmlfile termuda (dengan asumsi tidak ada file memiliki tanggal di masa depan.
  • Kemudian salin dari *.htmlfile termuda kedua , tetapi berhentilah di </body>baris tersebut.
  • Kemudian salin dari file lain, tetapi lewati semuanya ke <body>baris dan mulai dengan </body>baris.
  • Akhirnya menghasilkan tag penutup terakhir.
Gilles 'SANGAT berhenti menjadi jahat'
sumber
1

Solusi yang diberikan oleh @angus baik tetapi akan memiliki masalah jika ada direktori di folder ini yang akan memperbaikinya.

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

Abdul Rehman Janjua
sumber
Peringatan: Jawaban ini juga rentan terhadap ekspansi pathname, seperti yang dijelaskan dalam komentar saya untuk jawaban angus.
Barefoot IO
Kecuali status keluar kucing diuji, argumen direktori harus ngawur. cat hanya akan memancarkan pesan ke stderr dan melanjutkan ke argumen berikutnya.
Barefoot IO