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

9

Sou um usuário novato do 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 o find. Estou tendo problemas para configurar a expressão, no entanto. Alguém pode ajudar?

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

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

Aqui eu acho que isso pode se traduzir em encontrar.

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

Talvez eu possa usar o encanamento? Qualquer sugestão ajudaria. Agradecemos antecipadamente.

    
por user13184 05.10.2009 / 20:27

4 respostas

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

normalmente eu colocaria todos os arquivos juntos em uma grande bolha 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 rsync .

    
por 05.10.2009 / 20:38
13

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 comando find entre os backticks ' e não as aspas simples ' .

    
por 03.09.2012 / 17:31
2
for f in 'find . -name "*"';do scp $f phogan@computer/directory;done
    
por 05.10.2009 / 20:37
1

Eu sugeriria

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

Note que esta solução evita ter os nomes dos 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.

    
por 17.05.2011 / 22:20