Bagaimana cara keluar dari ruang di jalur untuk menyalin scp di Linux?


307

Saya baru mengenal linux, saya ingin menyalin file dari jarak jauh ke sistem lokal ... sekarang saya menggunakan perintah scp di sistem linux .. Saya punya beberapa folder atau nama file dengan spasi, ketika saya mencoba menyalinnya file, itu menunjukkan pesan kesalahan: "Tidak ada file atau direktori"

Saya mencoba:

scp ael5105@192.168.0.200:'/home/5105/test/gg/Untitled Folder/a/qy.jpg' /var/www/try/

Saya melihat beberapa referensi online tetapi saya tidak mengerti betul, dapatkah ada yang membantu ini?

bagaimana saya bisa keluar dari spasi dalam nama file atau nama direktori selama menyalin ...


Tidak tidak berfungsi !! sudah melakukannya ..
AlexPandiyan

Periksa kembali apakah file tersebut benar-benar ada. Letakkan tanda kutip di seluruh jalur, termasuk nama login dan alamat ip. Atau, remote kutipan dan tambahkan spasi dengan backslash sebagai gantinya.

Jawaban:


491

Pada dasarnya Anda perlu melarikan diri dua kali, karena lolos secara lokal dan kemudian di ujung yang jauh.

Ada beberapa opsi yang dapat Anda lakukan (dalam bash):

scp user@example.com:"'web/tmp/Master File 18 10 13.xls'" .
scp user@example.com:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp user@example.com:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .

11
Ini cukup kecil, tetapi pada Mac dan di sebagian besar aplikasi konsol seperti Terminal, ada opsi 'Tempel Teks yang Dijauhkan'. Karena itu saya menggunakan opsi kedua.
Sacrilicious

3
'"path"' bekerja ketika "'path'" gagal; kesimpulan tanda kutip tunggal pertama dan kemudian tanda kutip ganda untuk mengelilingi

7
Wow! Itu mungkin satu-satunya perilaku program konyol yang pernah saya lihat!
jankes

2
@ jankes Ini bukan tanpa pahala. Fakta bahwa apa yang Anda letakkan di sana adalah argumen perintah shell memungkinkan Anda melakukan hal-hal seperti scp user@example.com:'$(ls -t | head -1)' .mendapatkan file yang paling baru dibuat di server, atau scp user@example.com:'dir/*.{xml,pdf}' .untuk mendapatkan semua file xml dan pdf dari direktori jarak jauh. Secara umum, saya lebih suka ini daripada memiliki kenyamanan dengan file yang memiliki spasi. File dengan spasi selalu mengganggu.
JoL

1
mengapa melarikan diri 2 kali? Adakah cara untuk mengubah perilaku ini?
Fractale

76

bekerja

scp localhost:"f/a\ b\ c" .

scp localhost:'f/a\ b\ c' .

tidak bekerja

scp localhost:'f/a b c' .

Alasannya adalah bahwa string ditafsirkan oleh shell sebelum path dilewatkan ke perintah scp. Jadi ketika sampai ke remote, remote mencari string dengan tanda kutip tidak terhapus dan gagal

Untuk melihat ini dalam tindakan, mulailah sebuah shell dengan opsi -vx yaitu bash -vxdan itu akan menampilkan versi interpolasi dari perintah saat menjalankannya.


Menggunakan tanda kutip tunggal dan melarikan diri berhasil bagi saya tetapi tidak dengan tanda kutip ganda
Mauricio Trajano

1
@MauricioTrajano lihat di gnu.org/software/bash/manual/html_node/Quoting.html semua kutipan melakukan hal yang berbeda. Dalam kasus sederhana di atas pekerjaan ganda "atau tunggal 'yang sama
Vorsprung

34

Anda juga dapat melakukan sesuatu seperti:

scp foo@bar:"\"apath/with spaces in it/\""

Tingkat kutipan pertama akan ditafsirkan oleh scp dan kemudian tingkat kutipan kedua akan mempertahankan spasi.


4
Jawaban ini di bawah rata-rata, mengingat berapa banyak ruang yang bisa ditangani dengan jumlah karakter pelarian yang sama. Terima kasih!
Michael

20

Gunakan 3 garis miring terbalik untuk keluar dari spasi dalam nama direktori:

scp user@host:/path/to/directory\\\ with\\\ spaces/file ~/Downloads

harus menyalin ke Downloadsdirektori Anda filedari direktori jarak jauh yang disebut directory with spaces.


Ini adalah satu-satunya yang bekerja untuk saya di Ubuntu 19.10. Tidak ada tanda kutip ganda, tidak ada kutipan lembut dan keras masuk dan keluar, tidak ada kutipan lolos. Hanya tripplack yang memiliki ruang kosong. Sangat aneh. Terima kasih!
Uldics

9

Saya mengalami kesulitan besar untuk mendapatkan ini bekerja untuk variabel shell yang berisi nama file dengan spasi. Untuk beberapa alasan menggunakan

file="foo bar/baz"
scp user@example.com:"'$file'"

seperti pada jawaban @ Adrian sepertinya gagal.

Ternyata apa yang paling berhasil adalah menggunakan ekspansi parameter untuk menambahkan backslash ke spasi , sebagai berikut.

file="foo bar/baz"
file="${file//\ /\\\ }"
scp user@example.com:"$file"

Saya akan menyarankan ekspansi 'pengganti semua' yang lebih kuat: file="${file//\ /\\\ }"
troyfolger

Lupa perbedaan itu - saya berkarat pada ekspansi parameter saya. Terima kasih!
Luke Davis

Saya tidak memiliki variabel tetapi ini memuaskan saya sebagai alternatif yang baik untuk 3 backslash untuk jalan dengan banyak ruang. Tidak ada yang punya waktu untuk itu!
Robert Dundon

1

Maaf karena menggunakan pertanyaan Linux ini untuk memberikan tip ini untuk Powershell pada Windows 10: karakter antariksa yang melarikan diri dengan garis miring terbalik atau tanda kutip tidak berfungsi untuk saya dalam kasus ini. Tidak efisien, tapi saya menyelesaikannya menggunakan "?" sebagai gantinya char:

untuk file "task.txt Jun-22.bkp" Saya mengunduhnya menggunakan "task.txt? Jun-22.bkp"

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.