Saya memiliki direktori besar yang berisi subdirektori dan file yang ingin saya salin secara rekursif.
Apakah ada cara untuk mengatakan cp
bahwa ia harus melakukan operasi penyalinan sesuai ukuran file, sehingga file terkecil disalin terlebih dahulu?
Jawaban:
Ini melakukan seluruh pekerjaan dalam satu jalan - di semua direktori anak, semua dalam satu aliran tanpa masalah nama file. Ini akan menyalin dari terkecil ke terbesar setiap file yang Anda miliki. Anda harus melakukannya
mkdir ${DESTINATION}
jika belum ada.Kamu tahu apa? Apa yang tidak dilakukan adalah direktori anak kosong . Saya bisa melakukan beberapa pengalihan atas pipa itu, tapi itu hanya kondisi perlombaan yang menunggu untuk terjadi. Sederhana mungkin yang terbaik. Jadi lakukan saja ini setelahnya:
Atau, karena Gilles membuat poin yang sangat bagus dalam jawabannya untuk menjaga izin direktori, saya harus mencoba juga. Saya pikir ini akan melakukannya:
Saya bersedia bertaruh itu lebih cepat daripada
mkdir
itu.sumber
Berikut adalah metode cepat dan kotor menggunakan
rsync
. Untuk contoh ini saya menganggap apa pun di bawah 10 MB menjadi "kecil".Transfer pertama hanya file kecil:
rsync -a --max-size=10m srcdir dstdir
Kemudian transfer file yang tersisa. File kecil yang sebelumnya ditransfer tidak akan disalin ulang kecuali jika diubah.
rsync -a srcdir dstdir
Dari
man 1 rsync
Tentu saja, urutan transfer file per file tidak sepenuhnya terkecil hingga terbesar, tapi saya pikir itu mungkin solusi paling sederhana yang memenuhi semangat kebutuhan Anda.
sumber
--copy-dest=DIR
dan / atau--compare-dest=DIR
saya pikir. Saya hanya tahu karena saya harus menambahkan--hard-dereference
diritar
setelah memposting jawaban saya sendiri karena saya kehilangan tautan. Saya pikirrsync
sebenarnya berperilaku lebih spesifik untuk sistem file lokal dengan yang lain - saya dulu menggunakannya dengan kunci USB dan itu akan membanjiri bus kecuali saya menetapkan batas bandwidth. Saya pikir saya harus menggunakan salah satu dari yang lain sebagai gantinya.Tidak
cp
secara langsung, itu jauh di luar kemampuannya. Tetapi Anda dapat mengatur untuk memanggilcp
file dalam urutan yang benar.Zsh dengan mudah memungkinkan pengurutan file berdasarkan ukuran dengan kualifikasi glob . Berikut cuplikan zsh yang menyalin file dengan urutan ukuran yang meningkat dari bawah
/path/to/source-directory
ke bawah/path/to/destination-directory
.Alih-alih loop, Anda dapat menggunakan
zcp
fungsi ini. Namun Anda harus membuat direktori tujuan terlebih dahulu, yang dapat dilakukan di oneliner samar.Ini tidak mempertahankan kepemilikan direktori sumber. Jika Anda menginginkannya, Anda harus mendaftar program penyalinan yang sesuai seperti
cpio
ataupax
. Jika Anda melakukannya, Anda tidak perlu meneleponcp
atauzcp
menambahkan.sumber
Saya tidak berpikir ada cara
cp -r
untuk melakukan ini secara langsung. Karena ini mungkin periode waktu yang tidak ditentukan sebelum Anda mendapatkan wizardlyfind
/awk
solusi, berikut ini skrip perl cepat:Gunakan ini:
./whatever.pl /src/path /dest/path
Argumen harus keduanya menjadi jalur absolut ;
~
, atau apa pun yang shell mengembang ke jalur absolut baik-baik saja.Jika Anda menambahkan argumen ketiga (apa pun, kecuali literal
0
), alih-alih menyalinnya akan mencetak ke standar laporan apa yang akan dilakukan, dengan ukuran file dalam byte yang ditambahkan, misalnya,Perhatikan ini dalam urutan menurut ukuran.
The
cp
perintah pada baris 34 adalah perintah shell literal, sehingga Anda dapat melakukan apapun yang Anda inginkan dengan switch (saya hanya menggunakan-a
untuk melestarikan semua sifat-sifat).File::Find
danFile::Basename
keduanya adalah modul inti, yaitu mereka tersedia di semua instalasi perl.sumber
cp - copy smallest files first?
tetapi judul postingannya hanyacopy smallest files first?
Pokoknya, opsi tidak pernah sakit adalah filosofi saya, tetapi tetap saja, Anda dan David adalah satu-satunya yang digunakancp
dan hanya Anda yang melakukannya.cp
adalah karena ini adalah cara paling sederhana untuk mempertahankan karakteristik file * nix di perl (cross-platform oriented). Alasan bilah browser Anda mengatakancp -
karena fitur SE (IMO goofy) di mana tag yang paling populer muncul muncul diawali dengan judul sebenarnya.pearl
keluar dari kayu di sekitar sini.Pilihan lain adalah menggunakan cp dengan output dari du:
Ini masih bisa dilakukan pada satu baris, tetapi saya membaginya sehingga Anda dapat membacanya
sumber