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

23579
user13184

Ich bin ein Linux-Neuling und versuche, eine lange Liste von Dateien von einem Computer an einen anderen zu senden. Die Liste der Argumente ist zu lang, daher verwende ich find. Ich habe jedoch Probleme, den Ausdruck einzurichten. Kann jemand helfen?

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

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

Ich denke, das könnte sich mit find übersetzen lassen.

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

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

9

4 Antworten auf die Frage

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

Normalerweise würde ich alle Dateien zu einem großen Fleck zusammen "tar" und "scp" nur einmal 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 Option wäre die Verwendung von rsync .

Wenn Sie bei Verwendung von Kennwörtern mit ssh / scp die Lösung mit find nicht in jeder Datei nach einem Kennwort fragen? quack quixote vor 14 Jahren 0
Nehmen wir einfach an, er kann ssh-keys verwenden :) das Problem mit 1000 Passwortfragen ist auch der Grund für den tar-Ansatz akira vor 14 Jahren 0
13
Carlos Rodrigues

You can do it with just one command scp.

  • for newer versions of scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy> 
  • for older versions:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy> 

Make sure to encapsulate the find command in between backticks ` and not single quotes '.

Welche SCP-Version, welche Linux-Distribution ist das? Zum Beispiel hat scp in Ubuntu 14.04 diese Option nicht. geekQ vor 8 Jahren 0
Hallo, ältere Versionen unterstützen es, die neuen Versionen unterstützen einen einfacheren Befehl: `` scp `find -Name `user @ host:`` Carlos Rodrigues vor 8 Jahren 2
Funktioniert nicht bei mehreren Dateien Amruta vor 7 Jahren 1
@Amruta benutzt `-r` slybloty vor 6 Jahren 0
2
John T
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done 
ja er will sowieso einen einzigen Befehl John T vor 14 Jahren 0
nützlich, verwendet es mit `grep -l pattern *` Tanj vor 14 Jahren 0
Scheint nicht an Dateien mit Leerzeichen zu arbeiten. Christophe De Troyer vor 6 Jahren 0
1
Erik Sjölund

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 stehen, wo sie möglicherweise als Befehlszeilenargumente interpretiert werden.

Beachten Sie auch, dass Dateinamen Leerzeichen enthalten können. Dies bedeutet, dass eine for-Schleife in bash Schwierigkeiten mit einer Liste von Dateinamen haben kann.