Unix funktioniert nicht mit einem Platzhalter im Pfad beim Ssh'ing

983
LLJ

Dieser Befehl mit einem * im Suchpfad funktioniert auf dem lokalen Server einwandfrei

Svr1$ find /path/*/foo/ -name "*20160208" 

Wenn ich dies von einem anderen Server aus der Ferne versuche, funktioniert es nicht

Svr2$ ssh Svr1 find '/path/*/foo/' -name "*20160208*" 

Die Fehlermeldung lautet:

find: stat() error /path/*/foo/: No such file or directory 

Wenn ich jedoch den Suchpfad ändere, um die Verwendung von * zu vermeiden, funktioniert das einwandfrei. So was:

Svr2$ ssh Svr1 find '/path/' -name "*20160208*" 

Irgendeine Idee, was ich falsch mache?

Danke vielmals.

2
Stern in Anführungszeichen macht es wörtlich barlop vor 8 Jahren 0
Was ist, wenn Sie "/ path / * / foo /" `in` / path / * / foo / `ändern? barlop vor 8 Jahren 0
Eigentlich hatte ich es ursprünglich und es hat nicht funktioniert. Ich stellte hier eine Frage und wurde aufgefordert, den Pfad in Anführungszeichen zu setzen. Es funktioniert immer noch nicht und ich habe keine Ideen. LLJ vor 8 Jahren 0

2 Antworten auf die Frage

3
Gombai Sándor

Ihr Problem ist, dass der Befehl find Verzeichnis-Glob (s) nicht interpoliert / interpretiert (die Verzeichnisliste, unter der er suchen muss), er interpoliert das Muster nur als Glob, das übereinstimmen muss. Was die Verzeichnis Klackse interpretiert die Shell selbst Sie laufen finden im Inneren. Wenn Sie find per ssh ausführen, gibt es keine Shell für diesen Job.

Glücklicherweise gibt es keine Regel, dass eine Shell über ssh ausgeführt wird und die Shell Ihren Befehl ausführen soll, wobei alle erforderlichen Elemente interpoliert werden und der Rest der Platzhalter für das Finden selbst erhalten bleibt .

Etwas, was ich auf meinem Rechner verwendet habe:

ssh lx@localhost "bash -c '/usr/bin/find /tmp/d* -name \"f*\" '" lx@localhost's password: /tmp/d1/f1 /tmp/d2/f2 
0
Jakuje

Ihre Schreibweise wird auf dem lokalen Host ausgewertet, was Sie normalerweise nicht möchten. Sie müssen die Sequenzen umleiten, damit sie auf dem anderen Host ausgewertet werden können. So etwas sollte das tun:

Svr2$ ssh Svr1 "find /path/*/foo/ -name \"*20160208*\""