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

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

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

решение1

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

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

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

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

решение2

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

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

Я бы также создал задание 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

решение3

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копирует найденные файлы на локальный компьютер или любой другой компьютер.

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

Связанный контент