Memindahkan file dalam jumlah besar (~ 100.000)

13

Saya bekerja dengan folder yang berisi banyak file, seperti 100.000 atau bahkan 1.000 file per folder. Ketika saya mencoba memindahkan konten folder ke folder lain, komputer saya selalu macet. Bahkan ketika proses tampaknya selesai, saya tidak dapat melihat konten folder apa pun karena nautilus tampaknya benar-benar beku dan saya harus memaksa komputer saya untuk me-restart. Saya perhatikan bahwa ini terjadi juga ketika saya mencoba untuk memindahkan seperti 10.000 file.

Apakah itu masalah pada komputer saya atau apakah normal ketika bekerja dengan angka-angka ini?

Adakah cara cerdas melakukan transfer file ini?

Hyperion
sumber
3
Bagaimana dengan menggunakan terminal ( cp -R SRC/ DEST/)
UniversallyUniqueID
2
@BharadwajRaju: Tergantung pada file cp -a bisa lebih baik karena menjaga pemilik, stempel waktu, dan izin. Saya juga merekomendasikan rsync karena dapat memverifikasi transfer dan hanya menyalin file yang belum ada.
Michael
Pembaruan: gvfs-copy(dari gvfs-binpaket) dapat lebih cepat dari cp.
UniversallyUniqueID
Anda punya dua pertanyaan di sini, bukan satu. Silakan periksa halaman Bagaimana Cara Meminta petunjuk.
Luís de Sousa

Jawaban:

19

Mungkin mempertimbangkan untuk menggunakan metode baris perintah murni untuk mentransfer file dalam jumlah sangat besar, Anda pasti akan menemukan prosesnya jauh lebih cepat daripada menggunakan gui.

Ada banyak cara berbeda untuk mencapai ini, tetapi yang berikut ini bekerja dengan cepat, aman dan efisien pada sistem saya:

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

Beberapa penjelasan untuk perintah ini:

  1. Direktori input Anda adalah '.' karakter dan untuk perintah khusus ini Anda harus berada di direktori itu
  2. Direktori output Anda adalah <destination>dalam contoh saya. Jelas memodifikasi ini sesuai dengan kebutuhan Anda sendiri dan meninggalkan tanda kurung.
  3. Sintaks ini memungkinkan untuk nama file dengan spasi sebagai bonus :)

Permutasi tanpa akhir dimungkinkan tetapi ini harus bekerja dengan baik dan jauh lebih efisien daripada gui. Satu permutasi misalnya: jika Anda ingin pindah hanya file pdf Anda bisa menjalankan:

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

Penggunaan xargsmembuka banyak kemungkinan terutama dengan pergerakan sejumlah besar file. Banyak, banyak kemungkinan ....

Masalah Potensial:

Setidaknya ada 2 potensi jebakan untuk direnungkan, terima kasih kepada para komentator di bawah ini untuk pemikiran-pemikiran ini:

  1. Direktori tujuan Anda mungkin rusak, di lokasi yang tidak terjangkau, salah ketik, dll. mvMasih akan memindahkan file ke sana! Hati-hati di sini ...
  2. Jika -topsi ( --target-directory) hilang dan folder tujuan sebenarnya adalah file, Anda akan memindahkan satu file dan gagal pada sisanya. mvmemiliki 2 kegunaan: ganti nama sumber ke tujuan atau pindahkan sumber ke direktori . Sekali lagi hati-hati ...
andrew.46
sumber
2
Tidak akan find . -maxdepth 1 -type f -exec mv -t test {} +lakukan?
muru
@uru: Terima kasih untuk itu, saya telah memangkas menjadi -name...bagian yang asing tapi saya tetap xargsdi tempat.
andrew.46
2
Saya tidak tahu ... Meskipun perintahnya sudah benar, saya akan menganggap langkah lengkap agak terlalu rentan kesalahan. (Bagaimana jika Anda, misalnya, lupa menyertakan -tflag? Saya pikir semua file akan "dipindahkan" ke satu file tunggal yang disebut test, yang mengakibatkan hilangnya semua file Anda kecuali satu.) Saya pikir saya lebih suka rsyncdiikuti oleh, jika semuanya berjalan dengan benar, a rm. Namun, saya bisa membayangkan skenario di mana pemeriksaan seperti itu tidak dapat otomatis.
Jos
@ Jo: Terima kasih, saya telah menambahkan catatan kaki yang menjelaskan kemungkinan ini. Senang melihat rsync contoh yang ditulis sebagai jawaban?
andrew.46
Linux mendukung daftar argumen yang sangat panjang, sehingga Anda mungkin dapat melakukannya mv dir1/* dir2, dan hanya menggunakan find -execjika ada masalah, atau jika Anda perlu menghindari mencocokkan folder dengan glob Anda. (Meskipun tergantung pada konvensi penamaan Anda, seringkali *.*akan cocok dengan sebagian besar file tetapi tidak sebagian besar direktori, karena itu umum untuk memiliki .extensionpada file, dan umum untuk tidak memiliki .dalam nama direktori)
Peter Cordes
4

Saya memiliki pengalaman yang sama sebelumnya, itu normal ketika berhadapan dengan sejumlah besar file. Saya memiliki banyak koleksi lembar data PDF (komponen elektronik).

Alat GUI memeriksa beberapa detail file & data meta (Ikon / Gambar Kecil, Ukuran, ...), itu akan menjadi masalah besar dalam kasus tersebut. Bahkan di Icon View dan tanpa thumbnail, mereka akan membeku karena kebanyakan dari mereka tidak dirancang untuk case ekstrem seperti itu. Alat GUI mencoba memuat ikon presentasi untuk semua file / folder dalam direktori bahkan item tersebut tidak terlihat oleh pengguna di bagian layar saat ini. Penyortiran juga merupakan bagian dari masalah dan tidak ada cara untuk menghindarinya.

  • Saya akhirnya memisahkan file file pada folder terpisah berdasarkan merek / model masing-masing kurang dari 10.000. Mungkin Anda dapat menggunakan tanggal (seperti yang dilakukan kebanyakan orang dengan foto / pemindaian) atau huruf pertama (seperti dalam repositori paket Ubuntu )
  • Lebih mudah untuk menggunakan alat CLI karena mereka hanya menunjukkan apa yang Anda minta. Anda dapat menggunakan locateuntuk pencarian cepat sebagai pengganti find.
  • Untuk operasi pemindahan, gunakan mvdi terminal (alat GUI lambat karena mereka mencoba memperbarui tampilan secara berkala).

    Jika berada di partisi yang sama, perintah hanya akan mengubah pointer dalam indeks sistem file. Jika tidak, maka itu akan menjadi operasi ganda (salin & hapus). Itu akan mahal.

Hanya ada satu kasus yang bisa saya bantu, Jika Anda menyalin file-file itu beberapa kali dan tidak diperbarui. Seperti yang saya lakukan ketika saya membagikan koleksi saya dengan teman-teman, setiap kali saya mencoba menyalinnya butuh satu dekade. (Ini lebih berguna dengan file ukuran kecil saja)

  • Buat satu paket atau beberapa paket, seperti zip tanpa kompresi / rendah. Ketika Anda menyalinnya, itu akan lebih cepat, jadi biarkan DMA melakukan tugasnya.
user.dz
sumber
3

Jika Anda mencari solusi yang memberi Anda manfaat dari operasi command-line dengan gabungan perasaan dan fleksibilitas GUI, saya sarankan mc( komandan tengah malam ).

mc commander view 2-pane

Ini adalah file manager visual berbasis ncurses - Anda memiliki tampilan dua-pane pada file dan menu yang tersedia. Penggunaan mouse dimungkinkan, bahkan melebihi ssh. Anda dapat menelusuri di sekitar fs Anda, memeriksa file dengan penampil file, memfilter sesuai dengan kriteria on-the-fly dan memiliki salinan atau memindahkan operasi yang dilakukan pada baris perintah.

Ini adalah tiruan dari program komandan Norton Norton yang populer di pertengahan tahun delapan puluhan. Ini bekerja dengan baik setiap kali GUI mulai tidak dapat diandalkan untuk saya, dan ideal untuk tujuan Anda.

emk2203
sumber
0

Saya telah mengalami masalah yang agak mirip - Saya sedang menguji pengaturan RAID saya dan ketika melakukan transfer besar (mis. 100.000 file dan 1-2 TB data dalam sekali jalan) sepertinya transfer mulai cukup cepat - katakanlah ~ 200MB / detik, kemudian dengan cepat melambat ke dataran yang masuk akal ~ 90-120MB / detik (mungkin setelah mengonsumsi beberapa penyimpanan cache flash pada drive). Kemudian setelah 20-30 menit, operasi secara bertahap mulai turun ke dataran yang jauh lebih rendah ~ 30-40MB / detik, lebih buruk ketika berurusan dengan file kecil - mengambil operasi 4-5 jam lebih dekat dengan 15 jam.

Saya menghabiskan beberapa waktu mencoba mendiagnosis - misalnya kemungkinan kesalahan drive. Meskipun mencoba berbagai alat - baris perintah, nautilus, saya tidak bisa mempertahankan throughput yang layak untuk operasi penyalinan yang sangat besar.

Apa yang paling berhasil bagi saya adalah menggunakan komandan tengah malam, dan setiap kali penyalinan menjadi lambat, saya akan menghentikan sementara operasi hingga lampu hard drive padam setelah semua operasi yang tertunda padam - biasanya sekitar satu menit atau lebih - kemudian batalkan jeda MC lagi dan itu akan menembak kembali ke kecepatan yang layak untuk 20-30 menit lagi. Agak menyebalkan.

M Szil
sumber