Apa cara paling efisien untuk memindahkan sejumlah besar file yang berada di satu direktori?

11

CentOS 5.x

Saya minta maaf jika ini pertanyaan berulang. Saya telah melihat banyak pertanyaan serupa (mengenai menghapus file) tetapi tidak persis skenario yang sama.

Saya memiliki direktori yang berisi ratusan ribu file (mungkin lebih dari satu juta) dan sebagai perbaikan jangka pendek untuk masalah yang berbeda, saya perlu memindahkan file-file ini ke lokasi lain.

Untuk keperluan diskusi, katakanlah file-file ini awalnya berada /home/foo/bulk/dan saya ingin memindahkannya/home/foo2/bulk2/

Jika saya mencoba, mv /home/foo/bulk/* /home/foo2/bulk2/ saya mendapatkan kesalahan "terlalu banyak argumen".

Tn. Google memberi tahu saya bahwa alternatif untuk menghapus file secara massal adalah menjalankan find. Sesuatu seperti: find . -name "*.pdf" -maxdepth 1 -print0 | xargs -0 rm

Itu akan baik-baik saja jika saya menghapus hal-hal tetapi dalam kasus ini saya ingin memindahkan file ... Jika saya mengetik sesuatu seperti find . -name "*" -maxdepth 1 -print0 | xargs -0 mv /home/foo2/bulk2/bash mengeluh tentang file yang tidak menjadi direktori.

Apa perintah terbaik untuk digunakan di sini untuk memindahkan file secara massal dari satu direktori ke direktori lainnya?

Mike B
sumber

Jawaban:

16

Mengambil keuntungan dari GNU mv's -tpilihan untuk menentukan target direktori, bukan mengandalkan argumen terakhir:

find . -name "*" -maxdepth 1 -exec mv -t /home/foo2/bulk2 {} +

Jika Anda menggunakan sistem tanpa opsi, Anda bisa menggunakan shell perantara untuk mendapatkan argumen dalam urutan yang benar ( find … -exec … +tidak mendukung menempatkan argumen tambahan setelah daftar file).

find . -name "*" -maxdepth 1 -exec sh -c 'mv "$@" "$0"' /home/foo2/bulk2 {} +
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Anda dapat menggunakan find ... -exec sh -c 'blah "$ @" blah' sh {} + "(" shell trick ") untuk menangani masalah seputar pemesanan argumen. Ada beberapa contohnya di findutils ( info) dokumentasi; cari "sh -c".
James Youngman
5

Pertimbangkan mvdirektori induk alih-alih file:

mv /home/foo/bulk /home/foo2/bulk2 && mkdir /home/foo/bulk

(Tapi itu bisa menimbulkan masalah jika /home/foo/bulkharus ada setiap saat.)

scott
sumber
1
Saya akan menambahkan itu, kalau-kalau direktori tujuan Anda ada, pindahkan file dalam direktori tujuan ke direktori sumber Anda (yang besar) dan ganti nama direktori.
sbenitezb
Terima kasih - saran bagus. Dalam hal ini, direktori harus ada setiap saat. Ide bagus.
Mike B
Saya harus mengakui bahwa saya tidak mengerti apa jawaban ini. Mengapa mkdir? Dan bagaimana dengan dir 'yang ada di setiap saat' atau tidak? Mengapa ini mempercepat?
Monica Heddneck
Saya tahu komentar ini berumur satu tahun, tetapi yang terakhir berumur lima tahun, jadi saya pikir saya mungkin juga menjawab ... Dua pertanyaan pertama Anda berkorelasi. Ini mkdirkarena seluruh folder dan semua yang ada di dalamnya akan dipindahkan ke direktori lain dan tidak ada lagi di direktori lama. Ini memastikan bahwa direktori lama masih ada. Namun, ini tidak akan cukup jika ada layanan yang terus berjalan yang bergantung pada direktori pertama yang selalu ada, karena dipindahkan dan kemudian dibuat kembali. Itu tidak membuat apa pun lebih cepat, hanya lebih sederhana dengan memberikan sedikit argumen.
Lucas Leblanc
0

Hanya untuk variasi, saya suka menggunakan cpio untuk beberapa kasus seperti ini.

find tmp |cpio -v  -p --make-directories --sparse tmp2
Arthur Ulfeldt
sumber
1
Jika sumber dan tujuan berada pada sistem file yang sama maka pendekatan ini bisa sangat tidak efisien (menyalin tidak perlu). Juga selalu lebih baik untuk menggunakan -print0dan -0opsi.
pabouk
0

Dengan GNU mv:

find . -mindepth 1 -exec mv -t /tmp {} +

Pada sistem seperti OS X yang tidak memiliki mv -ttetapi memiliki -print0dan xargs -0:

find . -mindepth 1 -print0|xargs -0 -I, mv , /tmp

Atau jika nama file tidak mengandung spasi, tanda kutip, garis miring terbalik, atau baris baru (dengan OS X xargs) atau tanda kutip, garis miring terbalik, atau baris baru (dengan GNU xargs):

ls|xargs -I, mv , /tmp
Lri
sumber
-3

Untuk waktu tertentu, coba yang berikut ini:

find . -name "*" -type f -mtime +7 -exec mv -t /folder/to/transfer/files {} +
jean
sumber