Cara rsync over ssh ketika nama direktori memiliki spasi


71

Saya mencoba rsync dari satu server ke yang lain. Server memiliki struktur direktori yang sama tetapi saya mengalami kesulitan mendapatkan server remote untuk mengenali nama path di remote ketika ada ruang di dalamnya.

Berikut detailnya

Direktori lokal adalah

mnt/xlses/split/v2/name with space

Direktori jarak jauh adalah

mnt/xlses/split/v2/name with space

Saya sudah mencoba semua yang saya dapat temukan upaya terbaru itu

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/"name with space"

ketika menjalankan hal pertama yang dilaporkan adalah membuat direktori baru

Saya menyela dan melihat ada direktori baru

mnt/xlses/split/v2/name

semua file saya ada di direktori itu

Saya mengharapkan mereka masuk

mnt/xlses/split/v2/name with space

Jawaban:


8

Mencoba

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space root@myserver.com:/mnt/xlses/split/v2/

Saya melepas garis miring /dari jalur direktori sumber. Ini akan membuat rsyncmenyalin direktori dan semua isinya, yang berarti rsyncakan khawatir tentang mendapatkan nama yang benar pada host jarak jauh (yang akan) alih-alih Anda.


9
Ini tidak berhasil untuk saya, tetapi jawaban oleh johnLate berhasil.
Adriaan Tijsseling

Ini tidak menjelaskan bagaimana menangani ruang di sisi yang jauh.
ckujau

ini tidak berfungsi, seperti yang disebutkan.
Lizardx

128

Mencoba

rsync --protect-args --size-only -avzPe ssh  "/mnt/xlses/split/v2/name with space/ "root@myserver.com:/mnt/xlses/split/v2/name with space"

Dari man rsync:

-s, --protect-args

Opsi ini mengirimkan semua nama file dan sebagian besar opsi ke rsync jarak jauh tanpa mengizinkan shell jauh untuk menafsirkannya. Ini berarti spasi tidak dibagi dalam nama, dan setiap karakter khusus non-wildcard tidak diterjemahkan (seperti ~, $,;, &, dll.). Wildcard diperluas pada host jarak jauh oleh rsync (bukan shell yang melakukannya). [...]


13
Ini tidak berfungsi untuk Mac.
Matt Alexander

8
Bekerja pada Mac jika Anda menginstal rsync versi terbaru menggunakan home-brew.
Adriaan Tijsseling

4
Lihat apakah itu ada di versi rsync Anda dengan menjalankan man rsyncdan mencari ( /s) untuk "--protect". Untuk menginstal dengan homebrew: brew install homebrew/dupes/rsyncJika tidak ditemukan jalankan brew search rsync.
MikeiLL

12
Penginstalan versi baru tidak perlu, Anda cukup keluar dari spasi DAN mengutip nama host / nama file - misalnyarsync -Pavuz 'you@host:~/file\ with\ spaces' ./
ocodo

Ini harus menjadi jawaban yang diterima.
Josh M.

39

Ini bekerja di bash: Melarikan diri dari spasi dengan backslash dan kemudian menggunakan tanda kutip:

rsync -avuz me@some.server.com:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

Atau jika Anda memiliki path di variabel $ remote_path, spasi dapat diloloskan dengan substitusi:

rsync -avuz me@some.server.com:"${remote_path// /\\ }" .

1
Itu berhasil bagi saya. Selamatkan saya karena harus bekerja di server Mac.
George

1
Ini harus ditandai jawaban yang benar. Kuncinya adalah bahwa Anda membutuhkan garis miring terbalik dan tanda kutip.
Sridhar Sarnobat

4
Meloloskan diri merupakan suatu rasa sakit, -sopsi ini dapat digunakan pada rsync versi modern apa pun dan dirancang untuk mengatasi masalah ini
Mark K Cowan

Catatan : jika Anda menyalin dari server jauh dengan spasi di jalur ke jalur lokal dengan ruang, Anda hanya perlu menambahkan tanda kutip ke jalur jauh .
lenooh

Solusi dari @teekarna bekerja untuk saya. Sesuai halaman manual "rsync", alternatifnya adalah menggunakan "--protect-args" atau "-s" - yang juga berfungsi untuk saya.
Kishan Parekh

14

Gunakan dua pasang kutipan

Jangan repot-repot dengan semua garis miring terbalik, cukup gunakan tanda kutip tunggal di dalam tanda kutip ganda :

ssh me@myserver.com:"'/home/me/test file'" .

Anda juga dapat menggunakan kebalikannya, yaitu, tanda kutip ganda dalam tanda kutip tunggal :

ssh me@myserver.com:'"/home/me/test file"' .

Info lebih lanjut

Wildcard di sisi server

Jika Anda ingin *ditafsirkan di server daripada klien, *harus masuk hanya dengan satu dari 2 pasang kutipan. Saya menemukan ini kontra-intuitif karena secara logis pasangan terluar lolos dari interpretasi klien, sementara pasangan dalam kutipan keluar dari interpretasi server.

Lindungi Args

Keuntungannya, dibandingkan dengan --protect-argssolusinya , adalah bahwa Anda sebenarnya tidak memiliki batasan --protect-args, sehingga Anda dapat menggunakan karakter khusus seperti ~atau$ . Jadi, Anda dapat menulis:

rsync host:'"$HOME/test file"' .

atau

rsync host:'~"/test file"' .

Perhatikan bahwa tilde ( ~) dalam contoh terakhir harus di luar tanda kutip ganda.

Anda dapat menempatkan salah satu pasangan kutipan di sekitar nama pengguna @ host: bagian file (mis. ssh "me@myserver.com:'/home/me/test file'" .)


Sebenarnya saran Anda untuk tidak menempatkan bagian host dalam tanda kutip sama sekali lebih mendalam sehingga menggoda untuk menjadikan ini baris pertama dalam posting.
Sridhar Sarnobat

2
Solusi ini brilian! Bekerja seperti pada kaleng dengan rsync atas ssh.
Ikon

Ketika Anda memikirkannya, 2 pasang tanda kutip sepenuhnya logis: pasangan tanda kutip luar adalah agar klien memperlakukannya secara tak terpisahkan (konten yang diteruskan ke server kata demi kata) dan pasangan tanda kutip dalam adalah untuk server untuk mengenali ketidakterpisahan.
Sridhar Sarnobat

Jawaban ini diremehkan.
Derple

6

Saya mengerti ini adalah pertanyaan lama, tetapi saya pikir saya akan menambah pengetahuan yang ada.

Saya telah menggunakan rsyncbanyak folder dengan ruang dan ini berfungsi. Folder saya bernomor 1-10 sebagai berikut:

  • The\ Folder1
  • The\ Folder2
  • The\ Folder3
  • ..
  • The\ Folder10

2 instance yang ingin Anda gunakan rsyncadalah lokal dan jarak jauh.

  1. Lokal - Catat kurangnya kutipan.

    rsync -avu /media/data/The\ Folder* .
    
  2. Remote - Catat keberadaan kutipan

    rsync -avu -e ssh you@domain.com:"/media/data/The\ Folder*" .
    

3

Secara umum, kutip argumen dan lepaskan karakter spasi dalam argumen. Dalam contoh yang Anda berikan, coba:

rsync --size-only -avzPe ssh  "/mnt/xlses/split/v2/name\ with\ space/" "root@myserver.com:/mnt/xlses/split/v2/name\ with\ space"

1

Dari halaman rsyncmanual:

   If you need to transfer a filename  that  contains  whitespace,  you  can
   either  specify  the --protect-args (-s) option, or you'll need to escape
   the whitespace in a way that  the  remote  shell  will  understand.   For
   instance:

          rsync -av host:'file\ name\ with\ spaces' /dest

0

Yah saya akan menjawab pertanyaan ini sendiri meskipun orang lain mungkin melakukan pekerjaan yang lebih baik untuk menjelaskannya.

Jelas pengaturan pada mesin tujuan mempengaruhi bagaimana argumen diuraikan dan kita harus memiliki sesuatu pengaturan yang membuatnya sulit untuk menggunakan tanda kutip atau garis miring untuk keluar dari ruang tetapi kita dapat menggunakan kartu liar jadi saya melakukan ini

rsync --size-only -avzPe ssh  /mnt/xlses/split/v2/name\ with\ space/ root@myserver.com:/mnt/xlses/split/v2/name*

Ini berfungsi untuk saya karena hanya ada satu direktori yang dimulai dengan nama jika saya memiliki beberapa direktori ini tidak akan berfungsi.

Pada akhirnya saya perlu memahami cara men-setup server jauh sehingga dapat mengurai nama path lebih efisien - Saya tidak pernah menggunakan spasi dalam nama direktori tetapi orang yang mengatur ini melakukannya dan setidaknya untuk saat ini saya terjebak


Proposal Anda hanya berfungsi karena Anda telah membuat direktori tujuan selama upaya pertama Anda (gagal). Lihat jawaban saya untuk cara yang lebih mudah (yang juga memiliki keuntungan tidak mengandalkan upaya pertama yang gagal :).
dg99

Yah sebenarnya direktori sudah ada. Anda tidak benar dalam usaha saya yang gagal itu membuat direktori / ~ / name not / ~ / name dengan Spasi yang saya hapus / ~ / name dan terus mencoba berbagai opsi Direktori / ~ / nama dengan spasi sudah ada saya mencoba menambahkan file untuk itu
PyNEwbie

Oh, aku mengerti maksudmu.
dg99

Berfungsi jika Anda mengutip host / path serta melarikan diri dari spasi.
ocodo

0

Bergantung pada situasinya, opsi cepat adalah membuat symlink pada sistem jarak jauh:

user@remote$ ln -s ~/name\ with\ space/ ~/name_with_space

Kemudian gunakan -Lbendera rsyncyang memerintahkannya untuk mengikuti konten direktori:

user@local$ rsync -avz -L user@remote:~/name_with_space/ ~/name\ with\ space

Saya suka berpikir, ada saat-saat symlinking memotong kerumitan penamaan yang buruk atau hierarki yang rumit tidak perlu.
Sridhar Sarnobat

0
rsync /mnt/xlses/split/v2/name\\\ with\\\ space/ root@myserver.com:/mnt/xlses/split/v2/name\\\ with\\\ space

double escape juga berfungsi


-1

Coba dengan cara ini:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.