Gostaria de canalizar a saída do find na lista de entrada do scp, como?

10

Eu sou um usuário iniciante no Linux e estou tentando enviar uma longa lista de arquivos de um computador para outro. A lista de argumentos é muito longa, então estou usando find. Estou tendo problemas para configurar a expressão, no entanto. Alguém pode ajudar?

Aqui está o que eu normalmente digitaria para uma pequena lista de argumentos.

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

Aqui está eu acho que isso pode se traduzir em encontrar.

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

Talvez eu possa usar tubulação? Qualquer sugestão ajudaria. Desde já, obrigado.

user13184
fonte

Respostas:

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

Normalmente, eu 'tar' todos os arquivos juntos em um blob enorme e chamaria 'scp' apenas uma vez. Algo assim:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Pode-se brincar com os parâmetros --exclude = ou --include = do tar.
  • Outra opção seria usar o rsync .
akira
fonte
se estiver usando senhas com ssh / scp, a solução com find não pedirá uma senha em todos os arquivos?
quack quixote
vamos apenas supor que sabe como usar-chaves SSH :) o problema com 1000 perguntas de senha também é a razão para o tar-abordagem
akira
15

Você pode fazer isso com apenas um comando scp.

  • para versões mais recentes de scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy>
  • para versões mais antigas:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy>

Certifique-se de encapsular o findcomando entre backticks ` e não aspas simples ' .

Carlos Rodrigues
fonte
Qual versão do scp, qual distribuição Linux é essa? Por exemplo, o scp no Ubuntu 14.04 não tem essa opção.
precisa saber é
2
Oi, versões anteriores suportam, as novas versões suportam um comando mais simples:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Carlos Rodrigues
1
Não funciona em vários arquivos
Amruta
@Amruta use-r
slybloty
@slybloty scp -ré para recursão em uma única entrada (diretório), não para várias entradas (vários arquivos).
AndrewF
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
John T
fonte
sim ele quer um único comando de qualquer maneira
John T
útil, usada comgrep -l pattern *
Tanj
Parece não funcionar em arquivos com espaços neles.
Christophe De Troyer
1

eu sugeriria

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

Observe que essa solução evita ter os nomes de arquivos na linha de comando, onde eles podem ser interpretados como argumentos de linha de comando.

Outra coisa a observar é que os nomes de arquivos podem conter espaços. Isso significa que um loop for no bash pode ter dificuldades com uma lista de nomes de arquivos.

Erik Sjölund
fonte