Di chuyển số lượng lớn tệp (~ 100 000)


13

Tôi làm việc với các thư mục chứa nhiều tệp, như 100 000 hoặc thậm chí 1 000 000 tệp cho mỗi thư mục. Khi tôi cố gắng di chuyển nội dung của một thư mục vào một thư mục khác, máy tính của tôi luôn bị kẹt. Ngay cả khi quá trình dường như kết thúc, tôi không thể thấy nội dung của bất kỳ thư mục nào vì nautilus dường như bị đóng băng hoàn toàn và tôi phải buộc máy tính của mình khởi động lại. Tôi nhận thấy rằng điều này cũng xảy ra khi tôi cố gắng di chuyển như 10 000 tệp.

Đó có phải là sự cố của máy tính của tôi hay là bình thường khi làm việc với những con số này?

Bất kỳ cách thông minh để thực hiện chuyển tập tin này?


3
Điều gì về việc sử dụng thiết bị đầu cuối ( cp -R SRC/ DEST/)
UniversallyUniqueID

2
@BharadwajRaju: Tùy thuộc vào tệp cp -a có thể tốt hơn vì nó bảo vệ chủ sở hữu, dấu thời gian và quyền. Tôi cũng khuyên dùng rsync vì nó có thể xác minh chuyển và chỉ sao chép các tệp chưa tồn tại.
Michael

Cập nhật: gvfs-copy(từ gvfs-bingói) có thể nhanh hơn cp.
Đại

Bạn có hai câu hỏi ở đây thay vì một. Vui lòng kiểm tra trang Cách hỏi để được hướng dẫn.
Luís de Sousa

Câu trả lời:


19

Có lẽ xem xét sử dụng một phương pháp dòng lệnh thuần túy để chuyển số lượng tệp rất lớn, bạn chắc chắn sẽ thấy quá trình này nhanh hơn đáng kể so với sử dụng gui.

Có nhiều cách khác nhau để thực hiện điều này, nhưng cách sau đây hoạt động nhanh chóng, an toàn và hiệu quả trên hệ thống của tôi:

find . -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Một số giải thích cho lệnh này:

  1. Thư mục đầu vào của bạn là '.' ký tự và đối với lệnh cụ thể này, bạn cần có trong thư mục đó
  2. Thư mục đầu ra của bạn là <destination>ví dụ của tôi. Rõ ràng sửa đổi điều này cho phù hợp với nhu cầu của riêng bạn và bỏ qua dấu ngoặc.
  3. Cú pháp này cho phép tên tệp có dấu cách là phần thưởng :)

Hoán vị vô tận là có thể nhưng điều này sẽ hoạt động tốt và hiệu quả hơn nhiều so với gui. Một hoán vị ví dụ: nếu bạn muốn di chuyển duy nhất file pdf bạn có thể chạy:

find . -iname "*.pdf" -maxdepth 1 -type f -print0 | xargs -0 mv -t <destination>

Sử dụng xargsmở ra nhiều khả năng đặc biệt với sự di chuyển của một số lượng lớn các tệp như vậy. Nhiều, nhiều khả năng ....

Vấn đề tiềm ẩn:

Có ít nhất 2 cạm bẫy tiềm tàng để suy ngẫm, nhờ những người bình luận bên dưới cho những suy nghĩ này:

  1. Thư mục đích của bạn có thể bị hỏng, ở một vị trí không thể truy cập sau đó, bị nhập sai, v.v. mvvẫn sẽ di chuyển các tệp ở đó! Hãy cẩn thận ở đây ...
  2. Nếu -ttùy chọn ( --target-directory) bị thiếu và thư mục đích thực sự là một tệp bạn sẽ di chuyển một tệp và thất bại trên phần còn lại. mvcó 2 cách sử dụng: đổi tên nguồn thành đích hoặc di chuyển nguồn vào thư mục . Một lần nữa hãy cẩn thận ...

2
Sẽ không find . -maxdepth 1 -type f -exec mv -t test {} +làm gì?
muru

@muru: Cảm ơn vì điều đó, tôi đã cắt tỉa thành -name...mảnh ngoại lai nhưng tôi đã để nguyên xargstại chỗ.
andrew.46

2
Tôi không biết ... Mặc dù lệnh rõ ràng là chính xác, nhưng tôi sẽ xem xét việc di chuyển hoàn toàn một chút quá dễ bị lỗi. (Điều gì xảy ra nếu bạn, ví dụ, quên bao gồm -tcờ? Tôi nghĩ rằng tất cả các tệp sẽ được "chuyển" sang một tệp duy nhất được gọi test, dẫn đến mất tất cả các tệp của bạn ngoại trừ một tệp.) Tôi nghĩ rằng tôi thích rsynctheo dõi hơn, nếu tất cả đã đi đúng, a rm. Tuy nhiên, tôi có thể tưởng tượng các tình huống trong đó kiểm tra như vậy không thể được tự động.
Jos

@Jos: Cảm ơn, tôi đã thêm một ghi chú chân trang mô tả khả năng này. Rất vui khi thấy một rsync ví dụ được viết lên như một câu trả lời?
andrew.46

Linux hỗ trợ các danh sách đối số cực kỳ dài, do đó bạn có thể làm được mv dir1/* dir2và chỉ dùng đến find -execnếu có vấn đề hoặc nếu bạn cần tránh các thư mục khớp với toàn cầu của mình. (Mặc dù tùy thuộc vào quy ước đặt tên của bạn, thường *.*sẽ khớp với hầu hết các tệp nhưng không phải hầu hết các thư mục, vì thông thường có một .extensiontệp trên tệp và thường không có .tên trong thư mục)
Peter Cordes

4

Tôi đã có kinh nghiệm tương tự trước đây, đó là bình thường khi xử lý một số lượng lớn các tập tin. Tôi đã có một bộ sưu tập lớn các bảng dữ liệu PDF (các bộ phận điện tử).

Các công cụ GUI kiểm tra một số chi tiết tệp & dữ liệu meta (Biểu tượng / Hình thu nhỏ, Kích thước, ...), đó sẽ là một vấn đề lớn trong trường hợp đó. Ngay cả trong Chế độ xem Biểu tượng và không có hình thu nhỏ, chúng sẽ bị đóng băng vì hầu hết chúng không được thiết kế cho trường hợp cực đoan như vậy. Công cụ GUI cố gắng tải các biểu tượng trình bày cho tất cả các tệp / thư mục trong thư mục ngay cả những mục đó không hiển thị cho người dùng trong phần màn hình hiện tại. Sắp xếp cũng là một phần của vấn đề và không có cách nào để tránh nó.

  • Tôi kết thúc việc chia tách các tệp tệp trên các thư mục riêng biệt dựa trên thương hiệu / mô hình ít hơn 10000 mỗi tệp. Có thể bạn có thể sử dụng ngày (như hầu hết mọi người làm với ảnh / quét) hoặc chữ cái đầu tiên (như trong kho lưu trữ gói Ubuntu )
  • Thay vào đó, việc sử dụng các công cụ CLI sẽ dễ dàng hơn vì chúng chỉ hiển thị những gì bạn đã yêu cầu. Bạn có thể sử dụng locateđể tìm kiếm nhanh thay cho find.
  • Đối với hoạt động di chuyển, sử dụng mvtrong thiết bị đầu cuối (công cụ GUI chậm vì chúng cố cập nhật chế độ xem theo định kỳ).

    Nếu nó nằm trong cùng một phân vùng, lệnh sẽ chỉ thay đổi các con trỏ trong chỉ mục Hệ thống tệp. Nếu không, nó sẽ là hoạt động kép (sao chép và xóa). Điều đó sẽ tốn kém.

Chỉ có một trường hợp tôi có thể giúp, Nếu bạn đang sao chép các tệp đó nhiều lần và chúng không được cập nhật. Như tôi đã làm khi tôi chia sẻ bộ sưu tập của mình với bạn bè, mỗi lần tôi cố gắng sao chép thì phải mất một thập kỷ. (Điều này hữu ích hơn với chỉ các tệp kích thước nhỏ)

  • Tạo một gói duy nhất hoặc một vài gói, như zip không nén / thấp. Khi bạn sao chép nó, nó sẽ nhanh hơn, vì vậy hãy để DMA thực hiện công việc của nó.

3

Nếu bạn đang tìm kiếm một giải pháp mang lại cho bạn những lợi ích của các hoạt động dòng lệnh với cảm giác và tính linh hoạt của GUI được kết hợp, tôi khuyên bạn nên mc( chỉ huy nửa đêm ).

mc lệnh 2 khung nhìn

Đây là một trình quản lý tệp trực quan dựa trên ncurses - bạn có chế độ xem hai ngăn trên các tệp của mình và một menu có sẵn. Sử dụng chuột là có thể, thậm chí hơn ssh. Bạn có thể duyệt qua fs của mình, kiểm tra tệp bằng trình xem tệp, lọc theo tiêu chí đang hoạt động và thực hiện các thao tác sao chép hoặc di chuyển trên dòng lệnh.

Nó là một bản sao của chỉ huy Norton chương trình DOS , vốn phổ biến vào giữa thập niên tám mươi. Nó hoạt động tốt bất cứ khi nào GUI bắt đầu không đáng tin cậy đối với tôi và lý tưởng cho mục đích của bạn.


0

Tôi đã gặp một số vấn đề tương tự - Tôi đang kiểm tra thiết lập RAID của mình và khi thực hiện chuyển khoản lớn (ví dụ: hơn 100.000 tệp và 1-2 TB dữ liệu trong một lần), có vẻ như việc chuyển bắt đầu khá nhanh - giả sử ~ 200MB / giây, sau đó nhanh chóng giảm tốc độ xuống một cao nguyên hợp lý ~ 90-120MB / giây (có thể sau khi tiêu thụ một số bộ nhớ cache flash trên các ổ đĩa). Sau 20-30 phút, hoạt động bắt đầu giảm dần xuống một cao nguyên thấp hơn nhiều ~ 30-40 MB / giây, tệ hơn khi xử lý các tệp nhỏ - thực hiện thao tác 4-5 giờ gần hơn 15 giờ.

Tôi đã dành một chút thời gian để cố gắng chẩn đoán - ví dụ như lỗi ổ đĩa có thể xảy ra. Mặc dù đã thử các công cụ khác nhau - dòng lệnh, nautilus, tôi không thể duy trì thông lượng tốt cho các hoạt động sao chép rất lớn.

Điều làm việc tốt nhất với tôi là sử dụng chỉ huy nửa đêm và bất cứ khi nào việc sao chép bị chậm, tôi sẽ tạm dừng hoạt động cho đến khi đèn ổ cứng tắt sau khi mọi hoạt động chờ xử lý bị tắt - thường là một phút hoặc lâu hơn - sau đó tạm dừng MC lại và nó sẽ quay trở lại với tốc độ khá trong 20-30 phút nữa. Mặc dù khá khó chịu.

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.