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 [email protected]:'/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 ...

AlexPandiyan
sumber
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 [email protected]:"'web/tmp/Master File 18 10 13.xls'" .
scp [email protected]:"web/tmp/Master\ File\ 18\ 10\ 13.xls" .
scp [email protected]:web/tmp/Master\\\ File\\\ 18\\\ 10\\\ 13.xls .
Adrian Gunawan
sumber
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 [email protected]:'$(ls -t | head -1)' .mendapatkan file yang paling baru dibuat di server, atau scp [email protected]:'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.

Vorsprung
sumber
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.

MattK
sumber
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.

Chris
sumber
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 [email protected]:"'$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 [email protected]:"$file"
Luke Davis
sumber
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"

Vitor Pepicon
sumber