Xóa tất cả trừ 1000 tệp ngẫu nhiên trong một thư mục


13

Tôi để một tập lệnh tạo dữ liệu chạy quá lâu bây giờ có hơn 200.000 tệp mà tôi cần giảm xuống còn khoảng 1000. Từ dòng lệnh Linux, có một cách dễ dàng để xóa tất cả trừ 1000 tệp này, trong đó các tệp sẽ được giữ lại sẽ không phụ thuộc vào tên tệp hoặc bất kỳ thuộc tính nào khác?


Có phải quá trình tạo ra các tệp có một đặc điểm liên quan đến từng tệp trước đó không? Nếu vậy, hơn là chọn ngẫu nhiên sẽ rất quan trọng để có được một mẫu đại diện. Nếu quá trình tạo các tệp ngẫu nhiên, bạn có thể xóa mọi thứ sau 1000 đầu tiên
fixer1234

Câu trả lời:


15

Xóa tất cả trừ 1000 tệp ngẫu nhiên trong một thư mục

Mã số:

find /path/to/dir -type f -print0 | sort -zR | tail -zn +1001 | xargs -0 rm

Giải trình:

  1. Liệt kê tất cả các file trong /path/to/dirvới find;
    • print0: use \0( null character ) làm dấu phân cách dòng; vì vậy, đường dẫn tệp chứa dấu cách / dòng mới không phá vỡ tập lệnh
  2. Xáo trộn danh sách tập tin với sort;
    • -z: sử dụng \0(ký tự null) làm dấu phân cách, thay vì \n(một dòng mới)
    • -R: thứ tự ngẫu nhiên
  3. Tách 1000 dòng đầu tiên khỏi danh sách ngẫu nhiên với tail;
    • -z: coi danh sách là không phân cách (giống như với sort)
    • -n +1001: hiển thị các dòng bắt đầu từ 1001 (nghĩa là bỏ qua 1000 dòng đầu tiên)
  4. xargs -0 rm - loại bỏ các tập tin còn lại;
    • -0: không phân cách, một lần nữa

Tại sao nó tốt hơn giải pháp của quixotic *:

  1. Hoạt động với tên tệp chứa dấu cách / dòng mới.
  2. Không cố tạo bất kỳ thư mục nào (có thể đã tồn tại, btw.)
  3. Không di chuyển bất kỳ tệp nào, thậm chí không chạm vào 1000 "tệp may mắn" bên cạnh việc liệt kê chúng find.
  4. Tránh thiếu một tập tin trong trường hợp đầu ra findkhông kết thúc bằng \n(dòng mới) vì một số lý do.

* - tín dụng cho quixotic cho | sort -R | head -1000, đã cho tôi một điểm khởi đầu.


Chạy trên CentOS 6 tôi đã gặp lỗi về toán hạng không hợp lệ. May mắn thay, tôi không quan tâm đến không gian trong các filepath vì vậy loại bỏ các toán hạng đó có hiệu quả với tôifind . -type f | sort -R | tail -n +1001 | xargs rm
brad

@brad Bạn có thể cung cấp các thông báo lỗi và phiên bản của bạn findkhông? Tôi sẽ cố gắng cải thiện câu trả lời của mình, chỉ cần một số đầu vào để làm việc.
Rld.

3
tail: invalid option -- 'z'phiên bản đuôi tôi có là 8.4
brad

Tôi sẽ thêm --no-run-if-blank vào xargs để tránh lỗi nếu không có tệp (sau khi chạy hai lần cho ví dụ)
từ

1

Sử dụng một thư mục tạm thời, sau đó findtất cả các tệp của bạn, chọn ngẫu nhiên danh sách sortvà di chuyển 1000 danh sách hàng đầu vào thư mục tạm thời. Xóa phần còn lại, sau đó di chuyển các tập tin trở lại từ thư mục tạm thời.

$ mkdir ../tmp-dir
$ find . -type f | sort -R | head -1000 | xargs -I "I" mv I ../tmp-dir/
$ rm ./*
$ mv ../tmp-dir/* .

Nếu xargsphàn nàn về chiều dài dòng, sử dụng một số nhỏ hơn với headvà lặp lại các lệnh khi cần thiết (ví dụ, thay đổi -1000đến -500và chạy nó hai lần, hoặc thay đổi -200và chạy nó 5 lần.)

Nó cũng sẽ không xử lý tên tệp bao gồm khoảng trắng; như @ câu trả lời rld của chương trình, bạn có thể sử dụng find's -print0luận, các -zđối số sorthead, và -0với xargsđể đảm bảo xử lý tên tập tin thích hợp.

Cuối cùng, nếu tmp-dirđã tồn tại, bạn nên thay thế một tên thư mục không tồn tại.


Điều này sẽ thất bại nếu bất kỳ tên tệp được liệt kê bởi findbao gồm một khoảng trắng.
Rld.

0

Đối với người dùng mac, kịch bản sau đây nên làm.

find . -type f -print0 | tr '\0' '\n' | sort -R | tail -n +10000 | tr '\n' '\0' | xargs -0 rm

trsẽ cho phép sắp xếp và đuôi để làm việc trên danh sách \nthay vì \0.


-2

Cách dễ nhất có thể là rm -rf thư mục, sau đó chạy lại tập lệnh tạo dữ liệu trong khi đảm bảo không chạy quá lâu.


Đó không phải là những gì OP yêu cầu. Có lẽ làm như vậy là không khả thi.
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.