Apa cara tercepat untuk memindahkan satu juta gambar dari satu direktori ke direktori lain di Linux?

14

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/
Ryan
sumber
5
Saya tidak berpikir Anda dapat mengalahkan mv, kinerja-bijaksana, jika direktori sumber dan target berada di sistem file yang sama.
Frédéric Hamidi

Jawaban:

26

rsync akan menjadi pilihan yang buruk karena tidak banyak pekerjaan latar belakang klien / server yang menyumbang sistem lokal maupun remote.

mvmungkin merupakan pilihan terbaik. Jika memungkinkan, Anda harus mencoba mv directory_old directory_newdaripada mv directory_old/* directory_new/. Dengan cara ini, Anda memindahkan satu hal, bukan satu juta hal.

Richard
sumber
6
Memberi +1 pada saran untuk memindahkan direktori alih-alih file.
Ex Umbris
4
Plus, ekspansi wildcard kemungkinan akan mematahkan argumen maksimal yang didukung oleh mvjika kita berbicara tentang jutaan.
slhck
6
rsync menangani transfer pada media penyimpanan lokal dengan baik. Ini memaksa hal-hal seperti - Whole-file (menghapus implementasi algoritma delta xfer) dan mencegah hal-hal lain seperti - kompresi yang tidak memiliki tujuan dalam transfer lokal. Jika direktori berada pada sistem file yang berbeda, 'mv' tidak akan memberikan kinerja apa pun. Jika mereka berada di sistem file yang sama, maka cukup 'direktori' seperti yang dikatakan orang-orang ini.
UtahJarhead
Jika ada banyak gambar, menggunakan wildcard shell sederhana akan meluap baris perintah maksimum.
Raúl Salinas-Monteagudo
1
Pindah antar disk masih akan memindahkan semua data. Pada disk yang sama, mvperbarui informasi inode agar mv directory_old directory_newbekerja lebih cepat daripadamv directory_old/* directory_new
Anshul
14
find src_image_dir/ -type f -name '*.jpg' -print0 | xargs -0r mv -t dst_image_dir/ 
  • Ini tidak akan meluap ekspansi argumen.
  • Anda dapat menentukan ekstensi file, jika Anda mau. (-nama ...)
  • find -print0dengan xargs -0memungkinkan Anda menggunakan spasi dalam nama.
  • xargs -rtidak akan berjalan mvkecuali ada sesuatu yang dipindahkan. ( mvakan mengeluh jika tidak ada file sumber yang diberikan).
  • Sintaks mv -tmemungkinkan Anda untuk menentukan tujuan pertama dan kemudian file sumber, yang dibutuhkan oleh xargs.
  • Memindahkan seluruh direktori tentu saja jauh lebih cepat, karena ini terjadi dalam waktu yang konstan terlepas dari jumlah file yang terkandung di dalamnya, tetapi:
    • direktori sumber akan hilang untuk sebagian kecil waktu dan mungkin membuat Anda masalah;
    • jika proses menggunakan direktori saat ini sebagai direktori keluaran (berbeda dengan selalu merujuk ke path lengkap dari lokasi yang tidak bergerak), Anda harus menjalankannya kembali. (seperti yang Anda lakukan dengan rotasi log ).

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.

Raúl Salinas-Monteagudo
sumber
Ini berfungsi cukup baik untuk memindahkan file antar sistem file pada server yang sama. Cukup baik sehingga saya tidak repot mencari solusi di rsync. Tentu butuh satu atau dua jam, tetapi berhasil. Satu hal yang perlu diperhatikan, jika Anda memberi cari nama direktori alih-alih "." - pastikan untuk menggunakan trailing slash pada perintah find, jika tidak direktori akan dibuat ulang di tujuan perintah mv.
Speeddymon
7

Jika dua direktori berada pada sistem file yang sama, gunakan mvpada 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

rsyncakan mempertahankan kepemilikan file jika Anda menjalankannya sebagai root atau jika file tersebut milik Anda. Itu juga akan mempertahankan mtimemasing-masing file individu.

Utah Jarhead
sumber
2
Untuk menyalin folder besar dari satu hard drive ke hard drive yang berbeda, rsynctampaknya menjalankan lingkaran di sekitar mv. Terima kasih atas tipnya!
leo-the-manic
2
tar cf - dir1 | (cd dir2; tar xf -)

tar cf - dir1 | ssh remote_host "( cd /path/to/dir2; tar xf - )"

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.

maholt
sumber
2
Meskipun ini mungkin menjawab pertanyaan, itu akan menjadi jawaban yang lebih baik jika Anda bisa memberikan beberapa penjelasan mengapa ia melakukannya.
DavidPostill
1
Jika mereka ada di mesin lokal, kemungkinan mereka berada di sistem file yang sama. Dengan menggunakan tar c | tar xAnda mendapatkan biaya O (total_size) daripada O (file_count).
Raúl Salinas-Monteagudo
1

Karena kedua directory_old dan directory_new berada pada sistem file yang sama, Anda dapat menggunakan cp -lalih-alih mvsebagai opsi. cp -lakan 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 akal

Serge
sumber
0

Itu tergantung (tm). Jika sistem file Anda adalah copy-on-write, maka salin ( cpatau rsync, 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.

carlpett
sumber
0

Untuk menyalin setidaknya ~ 10k file (tidak ada direktori), cp mengeluh dengan:

tidak dapat mengeksekusi / bin / cp: Daftar argumen terlalu panjang

Opsi terbaik adalah Rsync:

target sumber rsync

Dan itu dilakukan dengan sangat cepat!

Nico
sumber
0

Jika Anda memiliki ruang kosong, arsipkan file tersebut ke dalam satu file .tar (tanpa kompresi lebih cepat), kemudian pindahkan file itu dan batalkan arsipnya.

endolit
sumber
0

Sifat tujuan akan menentukan cara paling efisien untuk melakukan tugas ini. Mari kita asumsikan Anda berada pada sistem lokal, Anda PWDadalah /sekarang. dan /aberisi jutaan gambar. Tugas kami adalah memindahkan semua gambar /b, sambil mempertahankan semua struktur sub-direktori. Mari kita juga mengasumsikan /adan /bme-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 menggunakan screen, tmuxatau Anda menjalankan ini sebagai proses latar belakang.

tar -C /a -cf . | tar -C /b -xf -

Itu akan menyalin semua file dan direktori /ake /b, jadi sekarang Anda harus membersihkan /asetelah Anda mengkonfirmasi selesai tanpa kesalahan.

JM Becker
sumber