Saya memiliki jutaan gambar di server cloud ubuntu saya. Ketika saya memindahkan folder lengkap yang berisi 12 juta gambar menggunakan mv
perintah, itu terjadi hampir secara instan. Namun, ketika saya mv
hanya gambar (bukan folder) maka dibutuhkan waktu. Apakah ada cara untuk memindahkan semua gambar secepat folder?
Inilah yang terjadi:
folder src memiliki 12 juta gambar dan saya memindahkan ini ke folder dst menggunakan
$ mv src ../dst
Terjadi segera
Di dalam folder src saya melakukan ini untuk memindahkan:
find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/ {} +
Ini membutuhkan waktu.
Apakah ada cara untuk mempercepat proses kedua?
dst
ada di partisi sedangkan../../dst
yang lain.{}
argumen di mana nama file akan diperluas.find
.find ... -exec mv -t ../../dst/ {} \;
akan memanggilmv
sekali per file;find ... -exec mv -t ../../dest {} +
akan jauh lebih cepat, menyalin sebanyak mungkin file per panggilan, tetapi masih tidak secepat memindahkan direktori itu sendiri seperti dijelaskan oleh dadexix86 .Jawaban:
TL; DR : Tidak
Untuk jumlah file yang lebih kecil, Anda tidak perlu
find
tetapi, bahkan dalam kasus yang disederhanakan dan lebih kecil ini, jika Anda mauini akan membutuhkan lebih banyak waktu daripada memindahkan seluruh direktori sekaligus.
Mengapa? Intinya adalah memahami apa yang
mv
dilakukan.Secara singkat,
mv
memindahkan angka (yang mengidentifikasi direktori, atau file) dari inode (direktori yang mengandungnya) ke yang lain, dan indeks ini diperbarui dalam jurnal sistem file atau FAT (jika sistem file diimplementasikan sedemikian rupa).Jika sumber dan tujuan berada pada sistem file yang sama, tidak ada pergerakan data yang sebenarnya, itu hanya mengubah posisi, titik di mana mereka dilampirkan.
Jadi, ketika Anda
mv
satu direktori, Anda melakukan operasi ini satu kali .Tetapi ketika Anda memindahkan 1 juta file, Anda melakukan operasi ini 1 juta kali .
Untuk memberi Anda contoh praktis, Anda memiliki pohon dengan banyak cabang. Secara khusus, ada satu simpul di mana 1 juta cabang dilampirkan.
Untuk memotong cabang-cabang ini dan memindahkannya ke tempat lain, Anda dapat memotong masing-masingnya, sehingga Anda membuat 1 juta potongan, atau Anda memotong tepat sebelum node, sehingga hanya membuat satu potongan (ini adalah perbedaan antara memindahkan file dan direktori).
sumber
mv
pada sistem file yang sama hanyalah menulis ulang entri TOC.mv *.jpg
kemungkinan gagal untuk 12 juta file yang mengapa ia menggunakan find. Kebanyakan Unix, Linux termasuk saya percaya (kecuali seseorang mengubahnya dalam 5-10 tahun terakhir) memiliki panjang maksimum terbatas dari baris perintah. Saya pikir itu 64K untuk Linux untuk waktu yang lama. Batas yang sama berlaku untuk variabel lingkungan, saya cukup yakin.Masih lambat karena, seperti disebutkan, sistem file harus menghubungkan kembali setiap nama file ke lokasi barunya.
Namun, Anda dapat mempercepatnya dari apa yang Anda miliki sekarang.
Perintah find Anda menjalankan exec sekali untuk setiap file. Jadi itu meluncurkan
mv
perintah 12 juta kali untuk 12 juta file. Ini dapat ditingkatkan dengan dua cara.Tambahkan nilai tambah di akhir:
find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/ +
Periksa halaman manual untuk memastikan itu didukung di versi Anda
find
. Efeknya harus menjalankan serangkaianmv
perintah dengan nama file sebanyak yang sesuai pada setiap baris perintah.Gunakan
find
danxargs
bersama - sama.find -maxdepth 1 -name '*.jpg' -print0 | xargs -0 mv -t ../../dst/
The
-print0
akan menggunakan NUL, alias nol byte untuk memisahkan nama file. Ini plusxargs -0
memperbaiki masalah yangxargs
seharusnya ada dengan spasi dalam nama file. Thexargs
perintah akan membaca daftar nama file darifind
perintah dan menjalankanmv
perintah pada banyak nama file sebagai muat.sumber
Kebingungan Anda berasal dari abstraksi sistem file yang membuat Anda percaya bahwa folder berisi file dan folder lain dengan cara seperti pohon. Ini sebenarnya tidak benar: semua file dan direktori dalam sistem file terletak pada level yang sama dan diidentifikasi dengan beberapa jenis, tergantung pada implementasi. Direktori hanyalah file khusus yang berisi daftar file lain.
Ketika Anda "memindahkan" file di dalam sistem file, file yang sebenarnya tidak pergi ke mana pun. Sebaliknya, daftar di dalam direktori diperbarui untuk mencerminkan perubahan.
mv src ../dst
memindahkan entri daftar tunggal dari direktori.
ke direktori../dst
, jadi itu cepat.find -maxdepth 1 -name '*.jpg' -exec mv -t ../../dst/
harus memindahkan jutaan entri, jadi lebih lambat. Mungkin berpotensi dipercepat jika Anda memanggilmv
hanya sekali dan tidak sekali per file, danmv
perintah itu sendiri dapat dioptimalkan untuk memindahkan beberapa entri direktori dalam satu langkah, tetapi tidak ada cara untuk membuatnya secepat ketika Anda memindahkan direktori tunggal .sumber
Jawaban yang disederhanakan
Memindahkan file yang dilakukan adalah 3 langkah:
proses ini sama untuk file atau folder.
dan jelas melakukan ini untuk 1 file adalah 100 lebih cepat daripada melakukannya untuk 100 file.
man link
adalah add ()man unlink
adalah remove ()mv
hanya menggunakan dua perintah di atas dan menambahkan tanda centang di antara untuk mencegah hilangnya data.sumber