Làm cách nào để ghép tất cả các tệp trong một thư mục nhất định theo thứ tự ngày, nơi tôi muốn tệp mới nhất ở trên cùng?


18

Và với tập tin cũ nhất ở phía dưới?

Ngoài ra, nếu tôi làm điều này, thì cũng có thể loại bỏ các tiêu đề dư thừa có trong mỗi tệp HTML không? Tôi đang thấy bản thân mình ghép rất nhiều tệp HTML lên và thật tuyệt khi giảm kích thước tệp của tệp cuối cùng một chút.

Câu trả lời:


33

Để nối các tệp bạn sử dụng

cat file1 file2 file3 ...

Để có danh sách tên tệp được trích dẫn được sắp xếp theo thời gian, mới nhất trước tiên, bạn sử dụng

ls -t

Để tất cả chúng cùng nhau,

cat $(ls -t) > outputfile

Bạn có thể muốn đưa ra một số đối số cho ls(ví dụ *.html:).

Nhưng nếu bạn có tên tệp có khoảng trắng trong đó, điều này sẽ không hoạt động. My file.htmlsẽ được coi là hai tên tệp: Myfile.html. Bạn có thể lstrích dẫn tên tập tin, và sau đó sử dụng xargs, người hiểu được trích dẫn, để truyền các đối số cho cat.

ls -tQ | xargs cat

Đối với câu hỏi thứ hai của bạn, việc lọc ra các phần của tệp không khó, nhưng nó phụ thuộc vào chính xác những gì bạn muốn loại bỏ. Các tiêu đề dự phòng của người khác là gì?


Điều này không hoạt động trên hệ thống debian của tôi ... Tôi phải sử dụng cat $(ls -t) > outputfile, nếu không thì cattừ chối tên tệp được trích dẫn
Mike Pennington

1
Lỗi của tôi. Tôi luôn bị cuốn vào những điều này. Xem câu trả lời cập nhật.
angus

Ồ - bởi các tiêu đề dư thừa Tôi có nghĩa là những thứ thường được đặt trong một số tệp header.php / footer.php, nhưng được lưu riêng khi lưu vào HTML (và thực sự có thể tăng kích thước tệp khi bạn tải xuống hàng loạt trang PHP).
InquilineKea

cat $(ls -t)cũng dễ bị mở rộng tên tệp. Nếu có một tên tệp có một *, hoặc ?, hoặc một biểu thức ngoặc (ví dụ file-[old].html); và nếu tên tệp được hiểu là một mẫu khớp với các tên tệp khác; cách tiếp cận sẽ tạo ra một danh sách không chính xác. set -fsẽ giải quyết sự thiếu hụt này.
Bare chân IO

ls -Qcó thể sản xuất đầu ra không phù hợp cho xargs. Ví dụ, "foo"trở thành "\"foo\"", nhưng xargs không hiểu thoát dấu ngoặc kép trong chuỗi trích dẫn kép.
Bare chân IO

2

Cách dễ nhất để liệt kê các tệp theo thứ tự khác với từ điển là với vòng loại toàn cầu zsh . Không có zsh, bạn có thể sử dụng ls, nhưng phân tích cú pháp đầu ra lsđầy nguy hiểm .

cat *(om)

Nếu bạn muốn tước một số dòng, sử dụng sed hoặc awk hoặc perl. Ví dụ: để lấy <head>từ tệp đầu tiên và kết hợp các <body>phần từ các tệp khác, giả sử rằng các thẻ <body></body>thẻ nằm một mình trên một dòng trong mỗi tệp:

{
  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

Giải trình:

  • Đầu tiên, concatenated.htmlđược tạo ra. Do đó, đây là *.htmltệp trẻ nhất (giả sử không có tệp nào có ngày trong tương lai.
  • Sau đó sao chép từ *.htmltệp trẻ thứ hai , nhưng thoát khỏi </body>dòng.
  • Sau đó sao chép từ các tệp khác, nhưng bỏ qua mọi thứ xuống <body>dòng và bắt đầu với </body>dòng.
  • Cuối cùng tạo ra các thẻ đóng cuối cùng.

1

Giải pháp được cung cấp bởi @angus là tốt nhưng sẽ có vấn đề nếu có thư mục trong thư mục này sẽ khắc phục nó.

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


Hãy cẩn thận: Câu trả lời này cũng dễ bị mở rộng tên đường dẫn, như được giải thích trong nhận xét của tôi về câu trả lời của angus.
Bare chân IO

Trừ khi trạng thái thoát của mèo được kiểm tra, đối số thư mục sẽ không quan trọng. con mèo sẽ đơn giản phát ra một thông điệp tới thiết bị lỗi chuẩn và tiến tới cuộc tranh luận tiếp theo.
Bare chân IO
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.