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/ [email protected]:/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
PyNEwbie
sumber

Jawaban:

8

Mencoba

rsync --size-only -avzPe ssh /mnt/xlses/split/v2/name\ with\ space [email protected]:/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.

dg99
sumber
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/ "[email protected]:/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). [...]

JohnLate
sumber
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 [email protected]:"/media/Music/Heavy\ Metal/Witch\ Mountain/*" .

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

rsync -avuz [email protected]:"${remote_path// /\\ }" .
teekarna
sumber
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 [email protected]:"'/home/me/test file'" .

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

ssh [email protected]:'"/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 "[email protected]:'/home/me/test file'" .)

Sridhar Sarnobat
sumber
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 [email protected]:"/media/data/The\ Folder*" .
    
Gokul Wimalanathan
sumber
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/" "[email protected]:/mnt/xlses/split/v2/name\ with\ space"
James
sumber
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
Shammel Lee
sumber
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/ [email protected]:/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

PyNEwbie
sumber
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
Chris Laskey
sumber
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/ [email protected]:/mnt/xlses/split/v2/name\\\ with\\\ space

double escape juga berfungsi

Andrej Surkov
sumber
-1

Coba dengan cara ini:

find /path/ -exec rsync -A -X -av -r -s root@xxxx:/path/ {} \;
pengguna94712
sumber