Vorrei reindirizzare l'output di find nell'elenco di input di scp, come?


10

Sono un utente Linux alle prime armi e sto cercando di inviare un lungo elenco di file da un computer a un altro. L'elenco degli argomenti è troppo lungo, quindi sto usando find. Tuttavia, ho difficoltà a impostare l'espressione. Qualcuno può aiutare?

Ecco cosa normalmente scriverei per un breve elenco di argomenti.

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

Qui penso che questo potrebbe tradursi in con find.

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

Forse potrei usare le tubazioni? Qualsiasi suggerimento sarebbe d'aiuto. Grazie in anticipo.

Risposte:


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

Normalmente "tar" tutti i file in un unico blob e chiamerei "scp" solo una volta. Qualcosa come questo:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Si potrebbe giocare con i parametri --exclude = o --include = di tar.
  • Un'altra opzione sarebbe quella di utilizzare rsync .

se si utilizzano password con ssh / scp, la soluzione con find non richiede una password su ogni file?
Quack Quixote

supponiamo solo che sappia usare ssh-keys :) il problema con 1000 domande sulla password è anche il motivo dell'approccio tar
akira,

15

Puoi farlo con un solo comando scp.

  • per le versioni più recenti di scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • per le versioni precedenti:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Assicurati di incapsulare il findcomando tra backtick ` e non virgolette singole ' .


Quale versione di SCP, quale distribuzione Linux che? Ad esempio, scp in Ubuntu 14.04 non ha questa opzione.
geekQ,

2
Ciao, le versioni precedenti lo supportano, le nuove versioni supportano un comando più semplice:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues,

1
Non funziona su più file
Amruta,

@Amruta use-r
slybloty,

@slybloty scp -rè per la ricorsione su una singola voce (directory), non per più voci (più file).
AndrewF,

2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done

sì, vuole comunque un singolo comando
John T,

utile, usato congrep -l pattern *
Tanj

Non sembra funzionare su file con spazi all'interno.
Christophe De Troyer,

1

io suggerirei

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

Si noti che questa soluzione evita di avere i nomi di file sulla riga di comando in cui potrebbero essere interpretati come argomenti della riga di comando.

Un'altra cosa a cui prestare attenzione è che i nomi dei file potrebbero contenere spazi. Ciò significa che un ciclo for in bash potrebbe avere difficoltà con un elenco di nomi di file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.