Verwenden von scp zum Abrufen aller Dateien in mehreren Verzeichnissen

Verwenden von scp zum Abrufen aller Dateien in mehreren Verzeichnissen

Ich habe eine Verzeichnisstruktur, die wie folgt aussieht A1/B1/C1/files111*: , A1/B1/C2/files112*, A1/B2/C1/files121*, A1/B2/C2/files122*, usw., sodass alle Dateien in allen Verzeichnissen eindeutig sind. Gibt es eine Möglichkeit, mit scp (oder einem anderen Tool) alle Terminaldateien files###*auf einmal abzurufen?

Antwort1

Da Sie dies in der Frage nicht angegeben haben, gehe ich davon aus, dass die Verzeichnisstruktur remote ist und Sie sie lokal haben möchten.

Sie müssen Platzhalter verwenden, diese aber auf der Clientseite maskieren, sodass Ihre lokale Shell sie ignoriert und weiterleitet. Kombinieren Sie dies mit einem rekursiven Flag ( -r), und es sollte wie gewünscht funktionieren:

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

Wichtig ist der Backslash, da er dafür sorgt, dass Ihre lokale Shell das Asterisk ignoriert und stattdessen weiterleitet. Damit sollten Sie alles files*von der Remote-Site abrufen können, einschließlich der Unterverzeichnisse. Außerdem werden alle tatsächlichen Dateien abgerufen, deren Name mit beginnt files*.

Antwort2

Zunächst müssen Sie überlegen, was mit den auf diese Weise kopierten Dateien geschehen soll und wie sich dies auf zukünftige Kopiervorgänge auswirken kann. Bleiben sie dort? Werden sie gelöscht? Archiviert? Sobald Sie dies wissen, können Sie Ihren Kopierbefehl und anschließend die erforderlichen Bereinigungsvorgänge erstellen. Hier ist ein Beispielskript, das zuerst alle vorhandenen Dateien kopiert und sie dann vom Remote-Server löscht.

Es besteht das Risiko, dass sich die Dateien zwischen Kopier- und Löschvorgängen ändern. Daher würde ich sie zunächst in ein temporäres Verzeichnis verschieben und sie dann von dort kopieren und löschen, sodass das Arbeitsverzeichnis weiterhin normal funktionieren kann.

Ich würde außerdem einen Cron-Job erstellen, um diese Dateien jeden Tag automatisch zur gleichen Zeit abzurufen, und einige Plausibilitätsprüfungen hinzufügen, um sicherzustellen, dass die Vorgänge erfolgreich abgeschlossen werden.

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done

Antwort3

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • sshstellt eine Verbindung zu einem Remotecomputer her und führt Code aus, der in Anführungszeichen eingeschlossen ist""
  • finddurchsucht das /target/A1Verzeichnis nach allen Dateien, die das Schlüsselwort „files“ enthalten. Beachten Sie, dass Sie die Backslashes für die Groß-/Kleinschreibung nicht berücksichtigende Suchparameter -inameund die doppelten Anführungszeichen benötigen, um das vorherige Paar nicht zu früh zu verlassen.
  • -execist ein weiterer findParameter, der zum Ausführen von Code verwendet wird. In unserem Fall führen wir aus scpund übergeben alle Suchergebnisse von findan scpmit den geschwungenen Klammern {}.
  • scpkopiert die gefundenen Dateien auf Ihren lokalen oder einen anderen Computer.

Dies hat in meinem Testaufbau funktioniert, da ich die öffentlichen Schlüssel ausgetauscht habe, um eine Authentifizierung ohne Passwort zu verwenden.

verwandte Informationen