Saya memiliki file teks yang berisi daftar direktori dengan jalur absolutnya
$ cat DirectoriesToCopy.txt
/data/Dir1
/data/Dir2
Saya ingin menggunakan rsync untuk menyalin semua direktori ini mempertahankan jalur absolutnya ke lokasi lain.
Saya mencoba perintah rsync berikut, tetapi tidak berhasil
rsync -avr --include-from=DirectoriesToCopy.txt --exclude='*/' --exclude='/*' / /media/MyDestination/
Apa yang salah di sini?
/data/Dir1
dan/data/Dir2
memasukkan kontennya ke/media/MyDestination/Dir1
dan/media/MyDestination/Dir2
? Atau Anda ingin memasukkan/data
bagian itu? Seberapa besar daftar ini, apakah terlalu besar untuk hanya mendaftarkan entri-entri pada baris perintah? Bagaimanapun,--exclude
pernyataan Anda mencegah rekursi./media/MyDestination/data/Dir2/
. Saya menambahkan --exclude untuk mencegah direktori dan file lain di / dari disalin.rsync -av $(cat DirectotiesToCopy.txt) /media/MyDestination/
Jawaban:
Gunakan perintah berikut:
Anda perlu memasukkan / data / secara eksplisit, Anda juga bisa menambahkannya ke daftar di file. Kemudian kecualikan semua direktori lain (urutan penting dengan menyertakan / tidak termasuk).
Perhatikan bahwa penggunaan Anda
-r
berlebihan seperti yang termasuk dalam-a
.EDIT: Anda juga dapat mencapai hasil yang sama dengan:
Bukan rsync yang memaksa Anda untuk melakukan hal-hal sulit hanya dengan menyalin beberapa direktori, itu hanya memberi Anda banyak cara untuk melakukan hal yang sama; dalam beberapa kasus akan menyertakan / mengecualikan cara mungkin lebih cocok, di sini saya akan melakukan hal - relatif di atas (tanpa
--relative
Anda akan berakhir dengan/media/MyDestination/Dir1
dan/media/MyDestination/Dir2
, dengan--relative
seluruh jalur sumber disalin ke tujuan).sumber
rsync -av --relative $(cat DirectotiesToCopy.txt) /media/MyDestination/
--relative
hanyalah pilihan lain.Jangan gunakan
--include
atau--filter
variasi, karena itu hanya akan membingungkan hal-hal. Sebaliknya, gunakan--files-from=_filename_
. (Jika ya, pastikan Anda melakukan banyak pengujian.)Buat daftar direktori dalam file, satu direktori / file per baris.
Gunakan rsync
--files-from=
dengan file di atas.Gunakan
--relative
/-R
opsi untuk memastikan nama path sumber disalin di akhir tujuan.Bahkan jika Anda memiliki
-a
opsi, sertakan juga-r
. Dari halaman manual:Perintah lengkap:
(file dalam list_of_files.txt harus relatif atau ditemukan di dir level atas )
(jika DEBUG diatur, rsync hanya mencetak apa yang mungkin telah disalin.)
sumber
--include-from
juga akan berfungsi, tetapi apa yang saya katakan-r
sebagian besar tidak relevan.The pengguna rsync memperingatkan tentang skenario ini (bagian “Sertakan / mengecualikan aturan pola”):
Dalam kasus Anda, saya pikir pendekatan sederhana akan preprocess daftar direktori untuk menyertakan sehingga setiap kali Anda memasukkan
/path/to/foo
, Anda juga mencakup semua direktori induk (/path/to
,/path
,/
), dan juga termasuk subdirektori dari direktori asli (/path/to/foo/***
), dan setelah semua ini memiliki aturan yang mengecualikan semua yang sebelumnya tidak terdaftar (*
).sumber