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

10

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

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

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

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

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

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

user13184
источник

Ответы:

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

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

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Можно поэкспериментировать с параметрами --exclude = или --include = tar.
  • Другой вариант - использовать rsync .
Акира
источник
если использовать пароли с помощью ssh / scp, разве решение с find не запрашивает пароль для каждого файла?
шарлатан-кихот
давайте просто предположим, что он знает, как использовать ssh-ключи :) проблема с 1000 вопросов о паролях также является причиной tar-подхода
akira
15

Вы можете сделать это с помощью одной команды 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
2
Привет, старые версии поддерживают его, новые версии поддерживают более простую команду:scp `find <path> -name <expression>` user@host:<path_where_to_copy>
Карлос Родригес
1
Не работает с несколькими файлами
Amruta
@Amruta use-r
слыблоты
@slybloty scp -rпредназначен для рекурсии одной записи (каталога), а не для нескольких записей (нескольких файлов).
AndrewF
2
for f in `find . -name "*"`;do scp $f phogan@computer/directory;done
Джон Т
источник
да, он все равно хочет одну команду
Джон Т
полезно, использовал это сgrep -l pattern *
Tanj
Кажется, не работает с файлами с пробелами в них.
Кристоф Де Тройер
1

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

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

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

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

Эрик Шёлунд
источник