2013-02-05 13 views
29

Bir dosya (:) kaynağında bash kullanarak bir dosya kopyalamaya çalışıyorum kaynak dosya adı. Dosya adında bir virgülle nasıl dosya okuyabilirim?

scp file\:\ name.mp4 [email protected]:"/path/to/dest" 

bu hatayı alıyorum: Ben kullanıyorum benim komuta karartılmış sürümüdür Ben sadece dosyayı yeniden adlandırmak ve : kaldırmak biliyorum

ssh: Could not resolve hostname Portal 2: Name or service not known 

ama İsterdim Kolondan kaçmanın mümkün olup olmadığını bilin.

cevap

51

değil bir bash kaçan sorun, bu scp bir [kullanıcı @] ana ön ek olarak x: tedavi denemek,:

scp ./file:\ name.mp4 [email protected]:"/path/to/dest" 

göre (örneğin ./) ya da tam yollar kullanılarak (/path/to/source) bu davranış önler - Bir : önce / varlığı, OpenSSH'nin olası bir host: veya [email protected]: önekini kontrol etmeyi durdurmasına neden olur. sorunsuz çalışması için bu izin iki nokta üst üste ile başlamak OpenSSH en scp sadece özel kılıfı dosya adları, normal anlamda bir : kaçmak için hiçbir desteği vardır ve geçerli ana makine adlarından başka hiçbir fikri böylece neredeyse : ile herhangi adı taşıyan can Buna sebep olsun.

nedeniyle [] kapalı IPv6 adreslerinin OpenSSH en basit ayrıştırma için

(yapabilirsiniz başarıyla [ ile başlamak veya : önce @[ içeren ve ]: içermeyen, ama bu ;-)

genellikle kullanışlı değil : içeren scp dosyalar

(original question nasıl bash iki nokta üst üste kaçacağız? o bu durum için geçerlidir, ancak iken aşağıdaki metin yazılmış Kabuk çıkışlarının hiçbir miktar yardımcı olacaktır scp.)

yaklaşık : kaçmak için nasıl yapmanız gerekmez soruya cevap vermek için ancak "\:" çalışır.Bir : kullanıldığı yerler: kaçmak eğer komuta üzerinde etkisi yoktur sadece \e\c\h\o foo gibi

  1. boş komut :, gerek kaçmak için şunları yapabilirsiniz olsa ("etkisiz", tamamen doğru değildir bir veya daha fazla karakter o önleyecektir bir takma, değerlerini kaçan hiçbir yararlı etkisi (Ben : içeren bir dizinden benim PATH bir programı çalıştırmak mümkün olmuştur vardır))
  2. PATH (ve diğerleri, CDPATH, MAILPATH eşleştirilerek Biraz beklenmedik olan)
  3. parametre genişletme ${name:-x} ve daha name[a-zA-Z_][a-zA-Z0-9_] olmalı, böylece gerek değişkenleri isimleri kaçmak için ve hiçbir belirsizlik yoktur, çünkü gerek
  4. ? : trinary sadece değişkenler ve sayılar, gerek çalışır parametre genişleme diğer varyasyonları müteakip : kaçmaya [[:digit:]] gibi desende sınıfları ile
  5. == ve =~ kaçmak için, size \: ile kaçabilir ama ... her zamankinden yararlı olabilir nasıl bir kayıp komut veya işlev adlarında
  6. , gerek değilim Kaçış, \:'un yararlı bir etkisi yoktur
  7. .210

(boş komut sadece :, sen #foo adında bir komut gerekir nerede bir komut veya işlev ":foo" gibi adlandırılmış ve # için durum farklı bu açıdan, kaçan olmadan çağrılabilir olabilir unutmayın Kaçtı olmak.)

+1

Aynı sorun, rsync'i de etkiler. Neyse ki, aynı çözüm - dosya adlarını '. /' Ile öneklemek - o da yardımcı olur. –