2013-02-05 18 views
29

Ich versuche, eine Datei mit scp in bash mit einem Doppelpunkt (:) Zeichen im Quelldateinamen zu kopieren. Die verschleierte Version meines Befehls Ich verwende ist:Wie scp ich eine Datei mit einem Doppelpunkt im Dateinamen?

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

ich diesen Fehler:

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

Ich weiß, ich könnte einfach die Datei umbenennen und die : entfernen, aber ich mag wissen, ob es möglich ist, dem Dickdarm zu entkommen.

Antwort

51

Nicht ganz bash entkommen Problem, es scpx: als [user @] Hostpräfix Behandlung, versuchen:

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

relativ (zB ./) oder vollständig qualifizierte Pfade (/path/to/source) verhindert, dass dieses Verhalten - das Vorhandensein von / vor einem : bewirkt, dass OpenSSH die Überprüfung auf ein mögliches host: oder [email protected]:-Präfix beendet). OpenSSH's scp nur spezielle Fälle Dateinamen, starten mit einem Doppelpunkt damit diese ohne Probleme zu arbeiten, hat es keine Unterstützung für eine : im normalen Sinne zu entkommen, und hat keine andere Vorstellung von gültigen Hostnamen so fast jeder Dateiname mit einem : kann Ursache dafür.

(Aufgrund verein Parsen von [] eingeschlossen IPv6-Adressen des OpenSSH, können Sie erfolgreich scp Dateien : enthält, die mit [ starten oder @[ vor dem : enthalten und enthalten keine ]:, aber das ist nicht generell nützlich ;-)


(der folgende Text wurde geschrieben, wenn die original question war Wie entkommen ich einen Doppelpunkt in der bash? Es gilt für diese Situation, aber nicht beschränkt auf scp wie kein Betrag des Shell-Escaping dort helfen.)

Um die Frage zu beantworten, wie : zu entkommen, brauchen Sie nicht zu, sondern „\:“ funktioniert.Orte, die ein : verwendet wird:

  1. die Null Befehl :, Flucht keine Notwendigkeit zu, obwohl können Sie, wie \e\c\h\o foo es keine Auswirkung auf den Befehl hat („keine Wirkung“ ist nicht ganz richtig, wenn Sie entkommen ein oder mehr Zeichen wird es verhindern, dass ein Alias ​​angepasst)
  2. PATH (und andere, CDPATH, MAILPATH) keine nützliche Wirkung, die Werte zu entkommen hat (ich habe es nicht gelungen, ein Programm in meinem PATH aus einem Verzeichnis ein : enthält, laufen, was ist ein wenig unerwartet)
  3. Parameter Erweiterung ${name:-x} und mehr, name muss [a-zA-Z_][a-zA-Z0-9_] sein, also keine Notwendigkeit, Variablen-Namen zu entkommen, und da es keine Zweideutigkeit ist, keine Notwendigkeit, nachfolgende : in den anderen Varianten des Parameter Expansion
  4. ? : trinary auf Variablen und Zahlen nur zu entkommen arbeitet, keine Notwendigkeit
  5. == und =~ mit Klassen in dem Muster zu entkommen, wie [[:digit:]], können Sie mit \: entkommen, aber ich bin ratlos, wie das überhaupt nützlich sein könnte ...
  6. innerhalb Namen Befehl oder eine Funktion, keine Notwendigkeit, zu entkommen, hat \: keinen nützlichen Effekt

(Beachten Sie, dass der Null-Befehl ist nur :, können Sie einen Befehl oder eine Funktion wie „:foo“ genannt haben, und es kann ohne Flucht aufgerufen werden, in dieser Hinsicht es # anders ist, wo ein Befehl #foo genannt müßte Escape sein.)

+1

Das gleiche Problem betrifft 'rsync'. Glücklicherweise hilft die selbe Lösung - die Dateinamen mit '. /' Voranstellen - auch dort. –

Verwandte Themen