10

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

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

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

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

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

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

4 ответа4

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

14

Вы можете сделать это с помощью одной команды 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 между обратными кавычками ` а не одинарными кавычками '.

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

Я бы предложил

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

Обратите внимание, что это решение позволяет избежать имен файлов в командной строке, где они могут быть интерпретированы как аргументы командной строки.

Еще одна вещь, на которую следует обратить внимание, это то, что имена файлов могут содержать пробелы. Это означает, что цикл for в bash может иметь проблемы со списком имен файлов.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .