Я хотел бы направить вывод find во входной список scp, как?

23384
user13184

Я начинающий пользователь Linux и пытаюсь отправить длинный список файлов с одного компьютера на другой. Список аргументов слишком длинный, поэтому я использую find. У меня проблемы с настройкой выражения, хотя. Может кто-нибудь помочь?

Вот что я обычно печатаю для короткого списка аргументов.

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

Вот я думаю, что это может привести к находке.

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

Может быть, я мог бы использовать трубопровод? Любые предложения помогут. Заранее спасибо.

9

4 ответа на вопрос

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

обычно я собираю все файлы вместе в один большой двоичный объект и вызываю scp всего один раз. что-то вроде этого:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory 

можно поэкспериментировать с параметрами --exclude = или --include = tar. другой вариант будет использовать rsync .

если вы используете пароли с ssh / scp, разве решение с поиском не запрашивает пароль для каждого файла? quack quixote 15 лет назад 0
давайте просто предположим, что он знает, как использовать ssh-ключи :) проблема с 1000 вопросов о паролях также является причиной tar-подхода akira 15 лет назад 0
13
Carlos Rodrigues

Вы можете сделать это с помощью одной команды scp.

  • для более новых версий scp:
scp `find <path> -name <expression>` user@host:<path_where_to_copy> 
  • для более старых версий:
scp --exec=`find <path> -name <expression>` user@host:<path_where_to_copy> 

Убедитесь, что findкоманда заключена в кавычки ` а не в одинарные кавычки ' .

Какая версия scp, какой дистрибутив linux это? Например, scp в Ubuntu 14.04 не имеет этой опции. geekQ 9 лет назад 0
Привет, старые версии поддерживают его, новые версии поддерживают более простую команду: `` scp` find -название `user @ host:`` Carlos Rodrigues 9 лет назад 2
Не работает с несколькими файлами Amruta 8 лет назад 1
@Amruta использовать `-r` slybloty 6 лет назад 0
2
John T
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done 
да, он все равно хочет одну команду John T 15 лет назад 0
полезно, использовал его с `grep -l pattern *` Tanj 15 лет назад 0
Кажется, не работает с файлами с пробелами в них. Christophe De Troyer 7 лет назад 0
1
Erik Sjölund

I would suggest

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

Note, that this solution avoids having the filenames on the command line where they might be interpreted as command line arguments.

Another thing to watch out for is that filenames might contain spaces. This means that a for loop in bash might have difficulties with a list of filenames.

Похожие вопросы