Использование scp для получения всех файлов в нескольких каталогах

1

У меня есть структура каталогов , которая выглядит как A1/B1/C1/files111*, A1/B1/C2/files112*, A1/B2/C1/files121*, A1/B2/C2/files122*и т.д. , так что все файлы во всех каталогах являются уникальными. Есть ли способ использовать scp (или другой инструмент), чтобы вытащить все файлы терминала files###*одновременно?

drjrm3
источник

Ответы:

0

Поскольку вы не указали это в вопросе, я предполагаю, что структура каталогов удаленная, и вы хотите, чтобы она была локальной.

Вам нужно использовать подстановочные знаки, но избегать их на стороне клиента, чтобы ваша локальная оболочка игнорировала их и передавала их дальше. Объедините это с рекурсивным флагом ( -r), и он должен работать так, как вы хотите:

scp -r remotemachine:some/directory/files\*   /some/local/target/directory/

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

Ярмунд
источник
0

Сначала вы должны подумать о том, что вы хотите случиться с файлами, которые копируются таким образом, и как это может повлиять на будущие операции копирования. Они собираются там остаться? Будут ли они удалены? Архивировано? Как только вы это знаете, вы можете создать команду копирования, а затем необходимые операции очистки. Вот пример сценария, который сначала копирует все существующие файлы, а затем удаляет их с удаленного сервера.

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

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

#!/bin/bash
HOST="RemoteServerIPorHostName"
localDir="/some/local/dir"

for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@$HOST:$remoteTargets $localDir
    ssh -t user@$HOST 'rm -rf $remoteTargets'
done
Алекс Аткинсон
источник
0
ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/desitnation \;"
  • ssh подключается к удаленной машине и выполняет код, заключенный в двойные кавычки ""
  • findпоиск внутри /target/A1каталога всех файлов, содержащих ключевое слово "files". Обратите внимание, что вам нужно использовать обратную косую черту для параметра поиска без учета регистра -inameи двойных кавычек, чтобы не оставлять предыдущую пару слишком рано.
  • -execэто еще один findпараметр, используемый для выполнения кода. В нашем случае мы выполняем scpи передать все результаты поиска из findк scpс фигурными скобками {}.
  • scp копирует найденные файлы на ваш локальный или любой другой компьютер.

Это сработало в моей тестовой настройке, так как я обменялся открытыми ключами, чтобы использовать аутентификацию без пароля.

Ксилол
источник