Копировать определенные типы файлов с одного хоста на другой

Я создаю сценарий bash, который автоматически копирует исходные файлы C и файлы заголовков из определенного каталога на другом хосте в каталог, в котором я нахожусь на текущем хосте.

В настоящее время он генерирует эту команду: ssh host2 "cd dir1/dir2 && find . -maxdepth 1 -regextype posix-extended -regex '.*.(c|h)' | tar -T - -c -f -" | смола хф -

Проблема в том, что я получаю эту ошибку: «tar: это не похоже на архив tar»

Эта ошибка выводится окончательным tar (tar xf -), потому что по какой-то причине файл tar, который передается по конвейеру, поврежден.

Если вместо этого я сделаю это, используя комбинацию ssh, tar и scp, все будет работать нормально, но для этого мне потребуется дважды ввести свой пароль (для host2) (один раз для ssh и один раз для scp). Я мог бы ввести пароль в качестве аргумента сценария, но я не хочу, чтобы он отображался в моей истории bash.

Любые идеи?


person Tom G    schedule 29.09.2011    source источник


Ответы (2)


Почему бы вместо этого не использовать rsync для этой работы? Он поддерживает --filter, который точно соответствует вашим потребностям. Вот пример:

http://ubuntuforums.org/showthread.php?t=1240150

person Lifu Tang    schedule 29.09.2011
comment
Спасибо. Мне удалось сделать это с помощью: rsync --include=*.c --include=*.h --exclude=* $SOURCE_HOST:$PATH/* . - person Tom G; 30.09.2011
comment
У меня это не работает: rsync -avz --include=*.h --exclude=* SRC_DIR DST_DIR копирует файлы .h из SRC_DIR, но НЕ РЕКУРСИВНО. Применение опции --recursive не помогает :( - person kappa; 27.11.2012

Рассматривали ли вы возможность использования rsync с соответствующими флагами --include и --exclude? rsync может копировать поверх ssh, и вы сможете скопировать все дерево (или подмножество) с помощью одной команды.

Кроме того, если вас беспокоит только ввод пароля, вы также можете просто попробовать использовать авторизованные ключи (и, возможно, ssh-agent), чтобы вам не нужно было вводить пароль для доступа к другому хосту.

person Laurence Gonsalves    schedule 29.09.2011
comment
Спасибо. Мне удалось сделать это с помощью: rsync --include=*.c --include=*.h --exclude=* $SOURCE_HOST:$PATH/* . - person Tom G; 30.09.2011