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.
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"?
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.
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.
cat $(ls -t) > outputfile
, jika tidak,cat
menolak nama file yang dikutipcat $(ls -t)
juga rentan terhadap ekspansi nama file. Jika ada nama file dengan*
,, atau?
ekspresi braket (misalnyafile-[old].html
); dan jika nama file diartikan sebagai suatu pola cocok dengan nama file lainnya; pendekatan akan menghasilkan daftar yang salah.set -f
akan mengatasi kekurangan ini.ls -Q
dapat menghasilkan output yang tidak sesuaixargs
. Misalnya,"foo"
menjadi"\"foo\""
, tetapi xargs tidak memahami tanda kutip ganda yang lolos dalam string kutipan ganda.Cara termudah untuk mendaftarkan file dalam urutan selain leksikografis adalah dengan kualifikasi zsh glob . Tanpa zsh, Anda dapat menggunakan
ls
, tetapi mengurai outputls
penuh dengan bahaya .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:Penjelasan:
concatenated.html
dibuat. Oleh karena itu*.html
file termuda (dengan asumsi tidak ada file memiliki tanggal di masa depan.*.html
file termuda kedua , tetapi berhentilah di</body>
baris tersebut.<body>
baris dan mulai dengan</body>
baris.sumber
Solusi yang diberikan oleh @angus baik tetapi akan memiliki masalah jika ada direktori di folder ini yang akan memperbaikinya.
cat $(ls -tpa | grep -v / )
sumber