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.

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 .

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 ' .


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

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.