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

Вопрос или проблема

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

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

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

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

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

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

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

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

ssh user@remote "find /target/A1 -iname \"*files*\" -exec scp {} user@local:/destination \;"
  • ssh подключается к удаленной машине и выполняет код, заключенный в двойные кавычки ""
  • find ищет внутри каталога /target/A1 все файлы, содержащие ключевое слово “files”. Обратите внимание, что вам нужны обратные слеши для параметра поиска без учета регистра -iname и двойные кавычки, чтобы избежать преждевременного завершения предыдущей пары.
  • -exec — это еще один параметр find, используемый для выполнения кода. В нашем случае мы выполняем scp и передаем все результаты поиска от find к scp с помощью фигурных скобок {}.
  • scp копирует ваши найденные файлы на ваш локальный или любой другой компьютер.

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

Ответ или решение

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

Подход 1: Использование SCP с подстановочными знаками

Если структура каталогов удаленного сервера выглядит следующим образом:

  • A1/B1/C1/files111*
  • A1/B1/C2/files112*
  • A1/B2/C1/files121*
  • A1/B2/C2/files122*

то для загрузки всех файлов с использованием SCP, выполните команду:

scp -r user@remotemachine:/path/to/A1/B1/C1/files\* /path/to/local/target/
scp -r user@remotemachine:/path/to/A1/B1/C2/files\* /path/to/local/target/
scp -r user@remotemachine:/path/to/A1/B2/C1/files\* /path/to/local/target/
scp -r user@remotemachine:/path/to/A1/B2/C2/files\* /path/to/local/target/

Обратите внимание, что символ \ перед * необходим для того, чтобы ваш локальный шелл не интерпретировал его, и передал его на удаленный сервер.

Подход 2: Использование SSH и команды find

Если вам нужно автоматизировать процесс и организовать более гибкую выборку файлов, вы можете использовать комбинацию ssh и find. Например:

ssh user@remotemachine "find /path/to/A1 -name 'files*' -exec scp {} user@local:/path/to/destination/ \;"

В этом случае:

  • ssh подключается к удаленному серверу и выполняет команду, заключенную в кавычки.
  • find ищет все файлы, соответствующие шаблону files*, в указанной директории (/path/to/A1).
  • -exec выполняет команду scp для каждого найденного файла, передавая его путь с помощью {}.

Дополнительные меры

  1. Резервное копирование и удаление: Если вы планируете удалять файлы после их копирования, убедитесь, что они сначала помещены в временный каталог, чтобы избежать нежелательных удалений. Вы можете использовать следующую конструкцию:
for remoteTargets in "/A1/B1/C1/files111*" "/A1/B1/C2/files112*" "/A1/B2/C1/files121*" "/A1/B2/C2/files122*"
do
    scp -pr user@remotemachine:$remoteTargets /path/to/local/target/
    ssh user@remotemachine "rm -rf $remoteTargets"
done
  1. Автоматизация через cron: Для регулярной синхронизации файлов на локальной машине, рассмотрите возможность настройки задачи cron для автоматического выполнения данной операции в заданное время.

Примечания

  • Проверьте, что у вас настроено SSH-авторизация с помощью ключей, чтобы избежать постоянного запроса пароля.
  • Убедитесь, что у вас есть необходимые права доступа как на удаленном сервере, так и на локальной машине.

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

Оцените материал
Добавить комментарий

Капча загружается...