Я бы рекомендовал rsync
, и я бы, вероятно, позвонил find
через ssh
, используя basedir
для извлечения файлов из подстановки процесса .Затем вы можете передать цикл while
, чтобы прочитать каждое имя файла, найденное на сервере, получить путь и создать путь на локальном компьютере ниже текущего каталога, используя mkdir -p
(с проверкой).Затем вы можете вызвать rsync
, чтобы вытащить файл с сервера в правильный каталог, используя rsync -uav
.Например, вы можете сделать что-то похожее на:
#!/bin/bash
server=${1:-yourserver} ## your server name
basedir=${2:-/path/to/files} ## the base directory to run find on server
while read -r line; do ## read line at a time from find output on server
dname="${line%/*}" ## separate directory name
mkdir -p "$dname" || { ## create/validate directory from remote file
printf "error: unable to create '%s'.\n", "$dname" >&2
continue
}
rsync -uav "$server:$line" "$dname" ## rsync file to correct directory
done < <(ssh "$server" "find $basedir -type f -name '*_out.csv' ! -path './*/doc/*' 2>/dev/null")
Затем просто вызовите скрипт на локальном компьютере, указав имя сервера в качестве первого аргумента и базовый каталог, в котором находятся файлы на сервере.Убедитесь, что вы изменили каталог на локальном компьютере на каталог, в котором вы хотите создать структуру удаленного каталога.Это предполагает, что ваш вызов find
(выполненный на сервере с помощью ssh
с локального компьютера) возвращает список файлов, которые вы хотите скопировать на локальный компьютер.
Это не так эффективно, как одинrsync
call, но если ваша команда find
создает ветви в дереве удаленных каталогов, которые имеют многоуровневые каталоги перед именем файла, которое иначе не было бы создано на локальном компьютере, вам придется вручную убедиться, что вы создаете эти путиперед вызовом rsync
для удаленного файла.