Cách tốt nhất để liệt kê 100 tệp đầu tiên trong một thư mục được sắp xếp theo thời gian


12

Điều gì sẽ là cách tốt nhất để liệt kê 100 tệp đầu tiên trong một thư mục được sắp xếp theo dấu thời gian đã tạo (đầu tiên cũ nhất). Thư mục khá lớn (khoảng 100000 tệp).

ls đường ống đến đầu mất một thời gian dài để hoàn thành.

Biên tập:

  • Hệ thống tập tin là ext3.
  • việc giới hạn số lượng tệp trong thư mục là không đáng, vì đây sẽ là thao tác "dọn dẹp" hiếm hoi và các tệp được tạo bởi phần mềm bên thứ 3.
  • Sử dụng thời gian sửa đổi tệp , thay vì thời gian tạo cung cấp và giải pháp chấp nhận được.


1
Nếu đó là thao tác dọn dẹp, có thể điều bạn muốn chỉ là find -mtime +<number of days> -deletedọn sạch tất cả các tệp cũ hơn một độ tuổi nhất định. Điều đó có nghĩa là không có loại là cần thiết.
Mikel

Câu trả lời:


14

Bạn nói rằng " ls lên đầu mất một thời gian dài để hoàn thành".

Nguyên nhân của việc này không phải ls, mà là số lượng tệp trong thư mục của bạn. Nếu bạn có 100.000 tệp trong một thư mục, mọi cách giải quyết vấn đề này sẽ phải lấy thông tin về tất cả 100.000 tệp trước khi có thể nghĩ đến việc sắp xếp chúng hoặc in bất kỳ đầu ra nào.

Nếu mất quá nhiều thời gian, giải pháp thực sự là phân chia các tệp trên nhiều thư mục.

Nếu bạn không thể truyền bá các tệp qua một số thư mục, có cách nào để bạn có thể thu hẹp số lượng tệp cần xem xét không? ví dụ: nếu tên tệp bao gồm một ngày, có thể bạn có thể bao gồm ký tự đại diện để hệ thống không phải sắp xếp 100.000 tệp. Hoặc có thể chúng được đánh số liên tục? (Điều này có thể hoặc không thể giúp đỡ, nhưng đáng để thử.)

Bao nhiêu lần bạn đang cố gắng để làm điều này? Có lẽ nó đáng để lưu / lưu trữ đầu ra để sử dụng lại .


Bây giờ, một câu hỏi.

Bạn có phải chắc là bạn có nghĩa là "thời gian sáng tạo" chứ không phải "thay đổi thời gian" ? Hầu hết các công cụ chỉ có thể hiển thị "thay đổi thời gian", không phải "thời gian tạo".

Có được "thời gian tạo" là một điều rất mới, đòi hỏi một hệ thống tập tin ext4 và một số công cụ không dễ cài đặt.


Nếu bạn muốn thay đổi thời gian

Thay đổi thời gian (viết tắt là ctime) có nghĩa là thời gian các thuộc tính của tệp thay đổi lần cuối.

ls -c sắp xếp theo ctime.

Bạn muốn đầu ra theo thứ tự tăng dần, không giảm dần, vì vậy bạn cần đảo ngược đầu ra với -r tùy chọn.

Vì vậy, bạn có thể làm điều đó như thế này:

ls -cr | head -n 100

Một giải pháp dài hơn cho cùng một vấn đề bằng cách sử dụng stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

nhưng nó chạy chậm hơn ls -crtrên hệ thống của tôi.


Nếu bạn muốn thời gian sửa đổi

Thời gian sửa đổi (viết tắt là mtime) có nghĩa là thời gian nội dung của tệp thay đổi lần cuối.

ls -t sắp xếp theo mtime.

Thay đổi ls -crthành ls -tr(tùy chọn tốt nhất) hoặc thay đổi stat -c $'%Z\t%n'thành stat -c $'%Y\t%n'.


Nếu bạn cần thời gian sáng tạo

(viết tắt của crtime)

Cái này khó hơn.

Đầu tiên, đảm bảo thư mục nằm trên một hệ thống tệp được định dạng bằng ext4. Bạn có thể sử dụng tune2fs -l <device name>để kiểm tra điều này.

Sau đó, có một statđịnh dạng mới được gọi %W, có thể giúp bạn ở đây. Để có được nó, bạn sẽ phải tải xuống một phiên bản GNU Coreutils được phát hành vào tháng 10 năm 2010 hoặc sau đó, giải nén nó, biên dịch nó và cài đặt nó.

Sau đó, tùy thuộc vào kernel của bạn, cái này có thể hoạt động (chưa thử nó).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Xem thêm:


Nếu bạn gặp lỗi về "'$\t'

Các '$\t'ký hiệu đòi hỏi bashhay zsh: nó sẽ không làm việc trong dashhoặc shtrên Ubuntu. Nếu bạn thực sự cần sử dụng các shell đó, bạn sẽ cần thay đổi bất kỳ \tthành Ctrl+ V, Tabvà loại bỏ hàng đầu $ngay trước khi trích dẫn mở đầu.


Có thể anh ta không thể chạy ext4. Tôi chạy Ubuntu 10.04 trên tất cả các máy của mình, nhưng chạy JFS trên một số ổ đĩa. AFAIK JFS không hỗ trợ tem thời gian tạo.
jwernerny

Thật. Chúng tôi biết rằng nó không được hỗ trợ trên ext3 và nó được hỗ trợ trên ext4. Một tìm kiếm nhanh cho thấy nó có thể hoạt động với zfs hoặc FreeBSD ufs, nhưng cả hai đều không phổ biến trên Ubuntu! Không chắc chắn về jfs hoặc xfs hoặc bất cứ điều gì khác. Sẽ rất vui khi nghe thêm nếu bạn có thể tìm thấy thông tin / liên kết.
Mikel

Cảm ơn bạn vì câu trả lời rất toàn diện đó và lời nhắc nhở tinh tế để viết những câu hỏi cụ thể hơn;) "Tìm" hóa ra là người chiến thắng về hiệu suất, loại fs hóa ra là ext3.

2

Một cách khác nếu phát hiện ra việc làm hôm nay có thể liên quan đến các vấn đề hiệu suất của bạn:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

Về lý thuyết, điều đó sẽ bắt đầu nhanh hơn rất nhiều nhưng tôi đoán nó phụ thuộc vào độ trễ đến từ đâu. Nó có thể chỉ mất lsmột thời gian dài để sắp xếp các tập tin.


Tôi nghi ngờ điều đó. headthực sự thoát ra ngay khi nó đã đọc đủ đầu vào. Hãy thử chạy cả với timeở phía trước. Các headphiên bản là nhanh hơn nhiều trên hệ thống của tôi anyway.
Mikel
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.