Tìm tập tin / thư mục cũ nhất trong hệ thống tập tin lên đến 50 TB


8

Tôi cần tìm các tệp cũ nhất với các thư mục được liên kết của chúng trong hệ thống tệp 90 TB lên đến 50 TB và sau đó di chuyển chúng sang hệ thống tệp khác. Họ phải giữ lại cấu trúc thư mục của mình vì đó là những gì xác định các tệp là gì. Vì thế -

cấp thứ nhất / cấp thứ hai / cấp thứ ba / (tệp)

là cấu trúc. Tôi cần di chuyển toàn bộ cấu trúc đó - không có bất cứ thứ gì trong các thư mục cấp cao nhất nhưng không có chúng tôi không thể xác định được tệp đó thuộc về tất cả các tệp mà tôi đang tìm kiếm có cùng tên. Khi quá trình hoàn tất, tôi sẽ còn khoảng 40 TB trong hệ thống tệp gốc và hầu như không còn gì trong hệ thống tệp mới vì các tệp cũ nhất trong bản gốc hiện đang ở đó.

Cảm ơn!

Câu trả lời:


9

Với các công cụ GNU và rsync, bạn có thể làm:

export LC_ALL=C # force tools to regard those file paths as arrays
                # of bytes (as they are in effect) and not do fancy
                # sorting (and use English for error/warning messages 
                # as an undesired side effect).

find . -type f -printf '%T@/%s/%p\0' | # print mtime/size/path
  sort -zn | # numerical sort, oldest first
  awk -v RS='\0' -v ORS='\0' -F / -v max=50e12 '
    {total_size += $2}
    total_size > max {exit}
    {
      sub("^[^/]*/[^/]*/", "") # remove mtime/size/
      print # path
    }' |
  rsync -nv -aHAX0 --files-from=- --remove-source-files . /dest/dir/

(chưa được kiểm tra. Đây -nlà cho chạy khô. Hủy bỏ nếu hạnh phúc).

Lưu ý rằng chúng tôi đang tính toán kích thước tệp tích lũy dựa trên kích thước tệp ( %s, thay thế %bcho việc sử dụng đĩa trong các cung (và thay đổi thành total_size += $2 * 512) và bỏ qua các liên kết cứng. Các tệp đó, khi được sao chép vào hệ thống tệp đích, cùng với các thư mục có chứa chúng sẽ có khả năng kết thúc bằng cách sử dụng hơn 50TB (trừ khi có nén hệ thống tệp hoặc sao chép khi phát).


1
Câu trả lời tốt hơn câu trả lời của tôi (mặc dù tôi đã thêm một total_size > max { exit 0 }tập lệnh awk)
symcbean 13/03/2017

@symcbean, điểm tốt! Tôi đã thêm nó ngay bây giờ. Cảm ơn.
Stéphane Chazelas

Trông thật tuyệt !! Mặc dù vậy, có một câu hỏi - Tôi giả sử rằng phần "max = 50e12" của câu lệnh awk đang ra lệnh cho hệ thống rằng chúng tôi muốn 50 TB vì vậy dựa trên các thư mục bổ sung (vì có hai tệp cho mỗi tệp) nếu tôi cần có thể giảm rằng "50" đến "49" và bằng 49 TB?
J Telep

1
@JTelep, đó là ký hiệu khoa học. 50e12 gấp 50 lần sức mạnh của 12 so với 50TB (không phải 50TiB, mà bạn cần 50 * 2^40). Bạn cũng có thể thay đổi nó thành total_size += $2 + overheadnơi overheadđược xác định là chi phí phát sinh bởi các thư mục đó. Xem thêm %kthay vì %sđể sử dụng đĩa trong KiB.
Stéphane Chazelas

2

Lệnh 'ls' có phần sáng tạo với dấu thời gian - vì vậy phân tích cú pháp chúng có thể là một nỗi đau. Có lẽ sẽ dễ dàng hơn nhiều để thực hiện điều này trong một ngôn ngữ thực hiện stat (). Một số phiên bản của Unix có chỉ số dòng lệnh - trên hộp RH gần đó:

 find ${BASEDIR} -type f -exec stat --format="%y %b %n" {} \; | sort | less

Nhưng điều này sẽ chạy như một con chó với một số lượng lớn các tập tin.

Tài liệu về GNU awk bao gồm một phần mở rộng ví dụ cung cấp các hàm hệ thống tệp, nhưng bạn sẽ cần thực hiện một số công việc để xây dựng và duy trì điều này.

Viết một chương trình từ đầu bằng PHP, C hoặc Perl (hoặc go, ruby ​​hoặc nhiều ngôn ngữ khác) sẽ đơn giản nhưng vượt quá phạm vi của một bài đăng ở đây.


1
Lưu ý rằng GNU statđã được thêm vào rất lâu sau khi GNU find-printflệnh (có thể thực hiện tương tự như GNU statvới giao diện tốt hơn nhiều).
Stéphane Chazelas
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.