Saya memiliki sejuta gambar yang membutuhkan ruang disk 30GB yang perlu dipindahkan dari satu direktori lokal ke direktori lokal lainnya.
Apa cara paling efisien untuk melakukan ini? Menggunakan mv
? Menggunakan cp
? Menggunakan rsync
? Sesuatu yang lain
Saya perlu mengambil ini:
/path/to/old-img-dir/*
00000000.jpg
--------.jpg ## nearly 1M of them! ##
ZZZZZZZZ.jpg
dan pindahkan ke sini:
/path/to/new/img/dir/
mv
, kinerja-bijaksana, jika direktori sumber dan target berada di sistem file yang sama.Jawaban:
rsync
akan menjadi pilihan yang buruk karena tidak banyak pekerjaan latar belakang klien / server yang menyumbang sistem lokal maupun remote.mv
mungkin merupakan pilihan terbaik. Jika memungkinkan, Anda harus mencobamv directory_old directory_new
daripadamv directory_old/* directory_new/
. Dengan cara ini, Anda memindahkan satu hal, bukan satu juta hal.sumber
mv
jika kita berbicara tentang jutaan.mv
perbarui informasi inode agarmv directory_old directory_new
bekerja lebih cepat daripadamv directory_old/* directory_new
find -print0
denganxargs -0
memungkinkan Anda menggunakan spasi dalam nama.xargs -r
tidak akan berjalanmv
kecuali ada sesuatu yang dipindahkan. (mv
akan mengeluh jika tidak ada file sumber yang diberikan).mv -t
memungkinkan Anda untuk menentukan tujuan pertama dan kemudian file sumber, yang dibutuhkan olehxargs
.Ngomong-ngomong, saya akan bertanya pada diri sendiri apakah saya benar-benar harus memindahkan sejumlah besar file sekaligus. Pemrosesan batch dilebih-lebihkan. Saya mencoba untuk tidak mengumpulkan pekerjaan dalam jumlah besar jika saya dapat memproses sesuatu pada saat itu dihasilkan.
sumber
Jika dua direktori berada pada sistem file yang sama, gunakan
mv
pada DIREKTORI dan bukan isi direktori.Jika mereka berada di dua sistem file yang berbeda, gunakan rsync:
rsync -av /source/directory/ /destination
Perhatikan trailing
/
pada sumbernya. Ini berarti akan menyalin ISI direktori dan bukan direktori itu sendiri. Jika Anda/
mematikannya, itu masih akan menyalin file tetapi mereka akan duduk di direktori bernama/destination/directory
. Dengan /, file-file itu hanya akan masuk/destination
rsync
akan mempertahankan kepemilikan file jika Anda menjalankannya sebagai root atau jika file tersebut milik Anda. Itu juga akan mempertahankanmtime
masing-masing file individu.sumber
rsync
tampaknya menjalankan lingkaran di sekitarmv
. Terima kasih atas tipnya!Ketika Anda menggunakan 'cp' setiap file melakukan buka-baca-tutup-buka-tulis-tutup. Tar menggunakan proses berbeda untuk membaca dan menulis serta banyak tapak untuk beroperasi pada banyak file sekaligus. Bahkan pada satu kotak CPU, aplikasi multithread lebih cepat.
sumber
tar c | tar x
Anda mendapatkan biaya O (total_size) daripada O (file_count).Karena kedua directory_old dan directory_new berada pada sistem file yang sama, Anda dapat menggunakan
cp -l
alih-alihmv
sebagai opsi.cp -l
akan membuat tautan keras ke file asli. Ketika Anda selesai dengan 'pindah' dan Anda puas dengan hasilnya maka Anda dapat menghapus file-file ini dari directory_old. dalam hal kecepatan, ini akan sama dengan 'mv' saat pertama kali Anda membuat tautan dan kemudian Anda menghapus yang asli. Tetapi pendekatan ini memungkinkan Anda untuk memulai dari awal jika ini masuk akalsumber
Itu tergantung (tm). Jika sistem file Anda adalah copy-on-write, maka salin (
cp
ataursync
, misalnya) harus sebanding dengan suatu langkah. Tetapi untuk kasus yang paling umum, move (mv
) akan menjadi yang tercepat, karena hanya dapat beralih di sekitar potongan data yang menggambarkan di mana file ditempatkan (catatan: ini terlalu disederhanakan).Jadi, pada instalasi Linux rata-rata Anda, saya akan gunakan
mv
.EDIT: @ Frédéric Hamidi memiliki poin bagus dalam komentar: Ini hanya valid jika keduanya berada pada sistem file dan disk yang sama. Jika tidak, data akan tetap disalin.
sumber
Untuk menyalin setidaknya ~ 10k file (tidak ada direktori), cp mengeluh dengan:
Opsi terbaik adalah Rsync:
Dan itu dilakukan dengan sangat cepat!
sumber
Jika Anda memiliki ruang kosong, arsipkan file tersebut ke dalam satu file .tar (tanpa kompresi lebih cepat), kemudian pindahkan file itu dan batalkan arsipnya.
sumber
Sifat tujuan akan menentukan cara paling efisien untuk melakukan tugas ini. Mari kita asumsikan Anda berada pada sistem lokal, Anda
PWD
adalah/
sekarang. dan/a
berisi jutaan gambar. Tugas kami adalah memindahkan semua gambar/b
, sambil mempertahankan semua struktur sub-direktori. Mari kita juga mengasumsikan/a
dan/b
me-mount poin untuk dua partisi berbeda, masing-masing pada disk yang terhubung secara lokal. Kami ingin melakukan tugas ini dengan tarpipe. Ini mungkin memakan waktu, jadi pastikan Anda menggunakanscreen
,tmux
atau Anda menjalankan ini sebagai proses latar belakang.Itu akan menyalin semua file dan direktori
/a
ke/b
, jadi sekarang Anda harus membersihkan/a
setelah Anda mengkonfirmasi selesai tanpa kesalahan.sumber