menyalin direktori rsync konten non-rekursif

8

Saya mencoba menyalin isi dari serangkaian direktori secara non-rekursif ke sistem remote lain.

/dirA/dir1/file
/dirA/dir2/file
/dirA/dir3/file

dir1, dir2, dan dir3 berisi banyak direktori yang saya tidak ingin disalin. Salin pada host jarak jauh ke / dirB yang mempertahankan struktur direktori yang sama.

Saya mencoba:

rsync /dirA/*/ host:/dirB/
rsync /dirA/   host:/dirB/

Tetapi mereka tidak melakukan apa yang saya inginkan.

Felipe Alvarez
sumber

Jawaban:

18

rsync memungkinkan Anda menentukan pola yang memicu masuknya atau pengecualian file dan direktori. Saya pikir Anda ingin menggunakan sesuatu seperti ini:

rsync -a -f '- /*/*/' /dirA/ host:/dirB/

Penjelasan:

  • -a memicu mode arsip yang mengaktifkan rekursi dan pelestarian "tautan simbolik, perangkat, atribut, izin, kepemilikan, dll.", menurut man rsync.
  • -f kependekan dari --filter=, yang menambahkan aturan penyaringan file.
    • Polanya ada di dalam tanda kutip tunggal sehingga shell tidak memperluas wildcard; tanda kutip ganda akan bekerja sama baiknya dalam hal ini.
    • - berarti ini adalah pola kecualikan.
    • Yang memimpin / berarti polanya harus dimulai dari dirA/ (rsync "transfer-root").
    • Itu */* bagian dari pola mengacu pada apa pun di dalam subdirektori.
    • Trailing / membatasi pengecualian pada direktori. File di dalam subdirektori dari dirA/ tidak terpengaruh.

Jadi pada akhirnya, rsync menyalin tidak lebih dari satu level ke bawah (dan juga tidak membuat direktori level kedua).

PleaseStand
sumber
2
Sangat bagus! Saya bisa menggunakannya -f '- /*/' untuk membatasi hanya file level atas. Saya juga harus menentukan -f '- .*' untuk mengecualikan file dot, karena saya menyinkronkan direktori home.
haridsv
4

Solusi di atas (oleh PleaseStand) tidak berfungsi untuk saya karena beberapa alasan. Ini berhasil meskipun:

rsync -avc --no-r ./source/* ./destination/

Ada juga alternatif ini:

rsync -avc --exclude " / "./source/ ./tujuan/

Andrei Pokrovsky
sumber
0

Salah satu "fitur" dari rsync adalah bagaimana direktori diurai.

rsync /dirA/ host:/dirB/ dan rsync /dirA host:/dirB secara teoritis harus setara.

Karena tidak ingin mendorong kekambuhan, Anda ingin menghindari -r, -a yang selain hal-hal lain menyiratkan -r.

Saya masih belum selesai dengan penelitian, tetapi ini adalah jawaban awal saya.

killermist
sumber