Wie man mit regulären Ausdrücken scp

12

Ich versuche, alle Dateien, die nicht mit dem Buchstaben "a" beginnen, in ksh zu kopieren.

Das Kopieren vom Quellcomputer zum Zielcomputer funktioniert einwandfrei :

scp -p !(a*) user@machine:/path/directory/.

Wenn ich mich jedoch auf dem Zielserver befinde und vom Quellserver kopieren möchte, schlägt Folgendes fehl:

scp -p user@machine:/path/!(a*) .

Irgendwelche Ideen?

Ryan P
quelle

Antworten:

15

Ich stimme vonbrand zu. Die Globierung wird von der Shell übernommen, in der Sie ausgeführt werden. scp user@machine:/path/*Erweitern Sie also / path / * zu den Dateien in LOCAL / path / *, nicht auf dem Remotecomputer.

Nur zum Grinsen habe ich versucht:

scp "user@machine:/path/[regex here]" .  

und es hat funktioniert. Versuch das. Beachten Sie die Anführungszeichen. Sehr nötig. Lass uns wissen.

Hinweis: Das Benutzerkonto auf dem Remotecomputer verwendet möglicherweise standardmäßig ein anderes Shell-Programm als Ihr , sodass die Regeln für die Platzhaltererweiterung möglicherweise anders sind.

SuperMagic
quelle
1

Dies ist nicht "scp mit regulären Ausdrücken", sondern die Shell, die die Datei-Globs verarbeitet. scpbekommt gerade die bereits erweiterte Dateiliste ausgehändigt. Die Erweiterung erfolgt auf der Maschine, auf der der Befehl ausgeführt wird.

Entschuldigung, kann nicht (leicht) tun.

vonbrand
quelle
Diese Antwort ist falsch. Bitte entfernen :)
Michael
1

Was ich fand, war, dass ich auf älteren HP-UX-Maschinen (parisc 11.11) [^ a] * verwenden musste, aber auf neueren Maschinen (parisc 11.31 und neuer) funktioniert es mit! (A *)

Damit bin ich gelandet. Und es funktioniert:

    if [[  ${S_MACH} = "phd026a" || ${S_MACH} = "tht030a" ]]
    then
            scp -p -r ${S_MACH}:${S_DIR}/bin/[^a^b^c^p]* ${D_DIR}/bin/.
    else
            scp -p -r ${S_MACH}:${S_DIR}/bin/!((a*)|(b*)|(c*)|(p*)) ${D_DIR}/bin/.
    fi
Ryan P
quelle
Beide Lösungen funktionieren für mich auf einem 11.11 Server.
DarkHeart
0

An übergebene entfernte Namen scpwerden tatsächlich als durch Leerzeichen getrennte Liste von Mustern auf der entfernten Seite interpretiert. Dies ist oft ärgerlich, wenn Sie versuchen, eine Datei zu kopieren, deren Name Leerzeichen enthält. Hier ist es jedoch nützlich, scp -p 'user@machine:/path/a*' .alle Dateien zu kopieren, deren Name mit "" beginnt a.

Ihr Befehl funktioniert, wenn Sie das Muster so zitieren, dass es nicht lokal, sondern remote interpretiert wird, sofern Sie eine weitere Hürde überwinden. Das Muster !(a*)ist kein einfaches Shell-Muster, sondern eine ksh-Erweiterung (diese Bash- und Zsh-Befehle werden auch unterstützt, wenn Sie die entsprechende Option festlegen). Dies funktioniert also nur, wenn Ihre Remote-Shell ksh ist, nicht, wenn es sich um eine andere Shell handelt, exec kshvon der Sie stammen, .profileoder um etwas Ähnliches.

Der einfachste Weg, es sei denn, Sie befinden sich in einer eingeschränkten oder antiken Umgebung, besteht darin, dies zu vergessen scp. Sie möchten, dass Remote-Dateien genau wie lokale Dateien funktionieren . Machen Sie sie also zu lokalen Dateien: Hängen Sie das Remote-Verzeichnis mit sshfs ein . Dies erfordert FUSE auf dem lokalen Computer und einen SFTP-Server (dh eine sftp-serverausführbare Datei, die sshdgestartet wird) auf dem Remote-Computer.

mkdir ~/net/machine
sshfs user@machine:/ ~/net/machine
cp -p ~/net/machine/path/!(a*) .
Gilles 'SO - hör auf böse zu sein'
quelle