Я хотів би передати висновок find у вхідний список scp, як?


10

Я початківець користувач Linux і намагаюся надсилати довгий список файлів з одного комп'ютера на інший. Список аргументів занадто довгий, тому я використовую find. Однак у мене виникають проблеми з налаштуванням виразу. Може хтось допоможе?

Ось що я зазвичай набираю для короткого списку аргументів.

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

Ось я думаю, що це може перетворитись на знахідку.

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

Можливо, я міг би використати трубопроводи? Будь-які пропозиції допоможуть. Заздалегідь спасибі.

Відповіді:


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

Зазвичай я б "націлив" всі файли разом в один величезний блок і зателефонував би "scp" лише один раз. Щось на зразок цього:

tar czfv - file1 file2 dir1 dir2 | ssh phogan@computer/ tar xvzf - -C directory
  • Можна пограти з параметрами --exclude = або --include =.
  • Іншим варіантом буде використання rsync .

якщо ви не використовуєте паролі з ssh / scp, чи не знайдеться рішення з пошуком пароля для кожного файлу?
шарлатаний кіхот

давайте просто припустимо, що він знає, як використовувати ssh-ключі :) Проблема з 1000 питань щодо пароля також є причиною тар-підходу
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>
Carlos Rodrigues

1
Не працює у кількох файлах
Amruta

@Amruta use-r
slybloty

@slybloty scp -rпризначений для рекурсії одного запису (каталогу), а не для декількох записів (декількох файлів).
AndrewF

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

так, він хоче мати єдину команду в будь-якому випадку
Джон T

корисний, використав його зgrep -l pattern *
Tanj

Здається, не працює над файлами з пробілами в них.
Крістоф Де Троєр

1

Я б запропонував

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

Зауважте, що це рішення дозволяє уникнути назви файлів у командному рядку, де вони можуть бути інтерпретовані як аргументи командного рядка.

Ще одна річ, на яку слід звернути увагу, - це те, що файли можуть містити пробіли. Це означає, що цикл for в bash може мати проблеми зі списком імен файлів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.