Ich möchte die Ausgabe von find in die Eingabeliste von scp leiten, wie?

10

Ich bin ein Anfänger in Linux und versuche, eine lange Liste von Dateien von einem Computer auf einen anderen zu senden. Die Argumentliste ist zu lang, daher verwende ich find. Ich habe jedoch Probleme beim Einrichten des Ausdrucks. Kann jemand helfen?

Folgendes würde ich normalerweise für eine kurze Argumentliste eingeben.

scp ./* phogan@computer/directory...

Hier ist, denke ich, dass dies mit find übersetzt werden könnte.

scp find . -name "*" phogan@computer/directory...

Vielleicht könnte ich Rohrleitungen verwenden? Irgendwelche Vorschläge würden helfen. Danke im Voraus.

user13184
quelle

Antworten:

16
find . -name "*" -exec scp '{}' phogan@computer:/directory ';'

Normalerweise würde ich alle Dateien zusammen in einem riesigen Blob "tarieren" und nur einmal "scp" aufrufen. Etwas wie das:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Man könnte mit den Parametern --exclude = oder --include = von tar herumspielen.
  • Eine andere Möglichkeit wäre die Verwendung von rsync .
Akira
quelle
Wenn Sie Passwörter mit ssh / scp verwenden, würde die Lösung mit find nicht für jede Datei nach einem Passwort fragen?
Quacksalber Quijote
Nehmen wir einfach an, er weiß, wie man SSH-Schlüssel benutzt :) Das Problem mit 1000 Passwortfragen ist auch der Grund für den Tar-Ansatz
Akira
15

Sie können dies mit nur einem Befehl tun scp.

  • für neuere Versionen von scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • für ältere Versionen:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Achten Sie darauf , die einzukapseln findBefehl zwischen Backticks ` und nicht die einfachen Anführungszeichen ' .

Carlos Rodrigues
quelle
Welche scp-Version, welche Linux-Distribution ist das? Zum Beispiel hat scp in Ubuntu 14.04 diese Option nicht.
GeekQ
2
Hallo, ältere Versionen unterstützen es, die neuen Versionen unterstützen einen einfacheren Befehl:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues
1
Funktioniert nicht mit mehreren Dateien
Amruta
@ Amruta verwenden-r
Slybloty
@slybloty scp -rdient zur Rekursion eines einzelnen (Verzeichnis-) Eintrags, nicht für mehrere Einträge (mehrere Dateien).
AndrewF
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
John T.
quelle
Ja, er will sowieso einen einzigen Befehl
John T
nützlich, verwendet es mitgrep -l pattern *
Tanj
Scheint nicht mit Dateien mit Leerzeichen zu funktionieren.
Christophe De Troyer
1

ich würde vorschlagen

find . -print0 | tar --null --files-from=/dev/stdin -cf - | ssh phogan@computer tar -xf - -C /directory

Beachten Sie, dass bei dieser Lösung vermieden wird, dass die Dateinamen in der Befehlszeile angezeigt werden, wo sie möglicherweise als Befehlszeilenargumente interpretiert werden.

Eine andere Sache, auf die Sie achten sollten, ist, dass Dateinamen Leerzeichen enthalten können. Dies bedeutet, dass eine for-Schleife in bash möglicherweise Probleme mit einer Liste von Dateinamen hat.

Erik Sjölund
quelle