scp alle Dateien mit der Endung „-123.jpg“ – Rekursion, Leerzeichen, Platzhalter …

scp alle Dateien mit der Endung „-123.jpg“ – Rekursion, Leerzeichen, Platzhalter …

Es ist zu viel los, als dass ich mit meinem Anfängerkopf hier durchkommen könnte. Ich möchte alle Dateien mit der Endung -123.jpg aus einer Vielzahl verschachtelter Verzeichnisse auf einem Remote-Server herunterladen. Einige dieser Verzeichnisse haben Leerzeichen in ihren Namen. Ich denke, der Befehl sollte ungefähr so ​​lauten:

scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./

… wobei „parent\ directory“ ein Verzeichnisname mit einem Leerzeichen ist und der angegebene Pfad so weit wie möglich reicht, bevor er sich in verschiedene Unterverzeichnisse aufspaltet, z. B. dir/sub dir/[uniquely_id]-123.jpg file. (Beachten Sie, dass diese Unterverzeichnisse oft auch Leerzeichen enthalten, falls dies das *-Platzhalterzeichen betrifft)

Ich erhalte die Antwort „keine Übereinstimmung“ oder „keine solche Datei oder kein solches Verzeichnis“, wenn ich das Leerzeichen verändere. Ich denke daher, dass ich die Rekursion oder das Platzhalterzeichen falsch gemacht habe.

Dank im Voraus.

Antwort1

Das Escapen von Dateinamen mit scp ist knifflig; Ihre Argumente werden auf der Remote-Seite (erneut) erweitert. „Interessante“ Zeichen müssen in doppelte Anführungszeichen gesetzt werden, um eine Sonderbehandlung durch Ihre lokale Shell und die Remote-Seite zu vermeiden. Ich würde erwarten, dass die folgenden beiden Vorgehensweisen für Sie funktionieren:

scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./

Wenn das verwirrend ist: Rsync ist ziemlich einfach zu verwenden (wie Lothar erwähnt), und auch das Weiterleiten von Tar oder CPIO über SSH ist ziemlich einfach.

ssh user@server 'cd /path/to/parent\ directory;
                 find -name "*123.jpg" -print0 | cpio -0 -o' |
    cpio -i -d -v

Antwort2

Da mir dein Serverlayout zum Testen fehlt, weiß ich nicht, ob der folgende Befehl tatsächlich funktioniert, aber ich denke, in diesem Fall wäre rsync besser als scp, da du Ein- und Ausschlussmuster angeben kannst. So etwas wie:

rsync -arvzSH  --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/

kann funktionieren. Aber Sie sollten besser noch einmal überprüfen,rsync-Dokumentation.

Antwort3

Ein Workaround für scp mit Platzhaltern:

for i in "*-123.jpg"
do 
    scp $i <user>@<server>:/path/to/destination/
done

Verweisen:https://community.hpe.com/t5/System-Administration/How-to-scp-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/true#M238959

Antwort4

Dies sollte ordnungsgemäß in zwei Teilen erfolgen:

  1. Suchen Sie zunächst alle benötigten Dateien und kopieren Sie diese in einen Ordner (das funktioniert nicht, wenn Sie die gleichen Dateinamen haben) - Sie können dies mit einer findund-exec
  2. Senden Sie dann eine Reihe von Dateien mitscp

scpist nicht erweitert genug, um Ordnerstrukturen zu kopieren, und es gibt keinen einzelnen Befehl zum Erstellen einer Kopie eines Ordnerbaums.

Wenn Sie außerdem alle Dateien in Ordnern benötigen, da Sie sie nicht mit Platzhaltern auswählen können, und Sie die Ordnerstruktur beibehalten möchten, können Sie mc= Midnight Commander und seinen „Shell-Link“ verwenden.

verwandte Informationen