Linux'ta scp kopyalama yolundaki boşluklardan nasıl kaçarım?


307

Ben linux için yeniyim, uzak sistemden yerel sisteme bir dosya kopyalamak istiyorum ... şimdi linux sisteminde scp komutu kullanıyorum .. Bunu kopyalamaya çalıştığımda bazı klasörler veya dosya adları boşluklu dosyası, şu hata iletisini gösterir: "Böyle bir dosya veya dizin yok"

Denedim:

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

Bazı referansları çevrimiçi gördüm ama tam olarak anlamıyorum, kimse bu konuda yardımcı olabilir mi?

kopyalama sırasında dosya adı veya dizin adlarındaki boşluklardan nasıl kaçabilirim?


Hayır çalışmıyor !! zaten yap ..
AlexPandiyan

Dosyanın gerçekten var olup olmadığını iki kez kontrol edin. Tırnak işaretleri, oturum açma adı ve ip adresi de dahil olmak üzere tüm yol boyunca konur. Alternatif olarak, tırnak işaretlerini uzaklaştırın ve boşluk yerine ters eğik çizgi ekleyin.

Yanıtlar:


491

Temel olarak iki kez kaçmanız gerekiyor, çünkü yerel olarak ve sonra uzak uçta kaçtı.

Yapabileceğiniz birkaç seçenek var (bash'da):

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
Bu oldukça küçük, ancak bir Mac'te ve Terminal gibi çoğu konsol uygulamasında, 'Kaçan Metni Yapıştır' seçeneği var. Bu nedenle ikinci seçeneği kullandım.
Sacrilicious

3
'' yol '' çalışırken '' yol '' başarısız oldu; sonuç önce tek tırnak ve sonra çevrelemek için çift tırnak

7
Vaov! Bu muhtemelen gördüğüm en saçma program davranışı!
jankes

2
@jankes Esassız değil. Bir kabuk komut argümanı koyduğunuz gerçeği scp user@example.com:'$(ls -t | head -1)' ., sunucuda en son oluşturulan dosyayı scp user@example.com:'dir/*.{xml,pdf}' .almak veya tüm xml ve pdf dosyalarını uzak bir dizinden almak gibi şeyler yapmanızı sağlar . Genel olarak, boşlukları olan dosyalarla rahatlık olmasını tercih ederim. Boşluklu dosyalar her zaman rahatsız olur.
JoL

1
neden 2 kez kaçıyor? Bu davranışı değiştirmek için herhangi bir yolu var mı?
Fractale

76

İşler

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

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

çalışmıyor

scp localhost:'f/a b c' .

Bunun nedeni, dizenin yol scp komutuna geçirilmeden önce kabuk tarafından yorumlanmasıdır. Bu yüzden uzaktan kumandaya geldiğinde uzaktan kumanda, kaçış tırnak işaretleri içeren bir dize arıyor ve başarısız oluyor

Bu eylemi görmek için, -vx seçenekleriyle bir kabuk başlatın, yani bash -vxkomut çalıştırılırken enterpolasyonlu sürümünü görüntüler.


Tek tırnak ve kaçan benim için çalıştı ama çift tırnak değil
Mauricio Trajano

1
Bakmak @MauricioTrajano gnu.org/software/bash/manual/html_node/Quoting.html tüm tırnak farklı şeyler yapar. Çift "ya da tek 'çalışma yukarıdaki basit durumda aynı
Vorsprung

34

Ayrıca şöyle bir şey yapabilirsiniz:

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

İlk teklif seviyesi scp tarafından yorumlanacak ve daha sonra ikinci teklif seviyesi boşlukları koruyacaktır.


4
Aynı sayıda kaçış karakteriyle kaç alanı işleyebileceği düşünülürse, bu cevap yetersizdir. Teşekkürler!
Michael

20

Dizin adlarındaki boşluklardan kaçmak için 3 ters eğik çizgi kullanın:

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

adlı uzak dizinden Downloadsdizininize kopyalamalısınız .filedirectory with spaces


Ubuntu 19.10'da benim için çalışan tek kişi bu. Çift tırnak yok, giriş ve çıkış yumuşak ve sert tırnak yok, kaçan tırnak yok. Yalnızca trippleback boşluklu alanlar. Çok garip. Teşekkür ederim!
uldics

9

Bunu boşluk içeren bir dosya adı içeren bir kabuk değişkeni için çalışmakta zorlandım . Nedense kullanmak

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

@ Adrian'ın cevabı başarısız gibi görünüyor.

En iyi sonucu veren şeyin , boşluklara ters eğik çizgi eklemek için aşağıdaki gibi bir parametre genişletmesi kullandığı ortaya çıktı .

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

Daha sağlam 'hepsinin yerine geçecek' genişlemeyi file="${file//\ /\\\ }"
öneriyorum

Bu ayrımı unuttum - parametre genişletmelerimde paslıyım. Teşekkürler!
Luke Davis

Bir değişkenim yoktu ama bu beni çok fazla alana sahip bir yol için 3 ters eğik çizgiye iyi bir alternatif olarak tatmin etti. Kimsenin bunun için zamanı yok!
Robert Dundon

1

Windows 10'da Powershell için bu ipucunu koymak için bu Linux sorusunu kullandığım için üzgünüm: ters eğik çizgilerden kaçan veya tırnaklarla çevrelenen boşluk karakteri bu durumda benim için çalışmadı. Verimli değil, ama "?" yerine char:

"görevler.txt Jun-22.bkp" dosyası için "görevler.txt? Jun-22.bkp" kullanarak indirdim

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.