Использование (scp | rsync) для извлечения определенных файлов при одновременном создании структуры папок? - PullRequest
0 голосов
/ 21 мая 2019

У меня есть большой проект, размещенный на сервере, на котором есть определенные файлы, которые я хочу скопировать на свой локальный компьютер в той же структуре папок, но только в тот файл, который мне нужен. Моя текущая команда для поиска этих файлов (в то время как в проекте на сервере):

find ./ -type f -name '*_out.csv' ! -path './*/doc/*' 2>/dev/null

, который создает список, подобный этому (для краткости сокращен):

./validation/Riso_AN8/analysis/Riso_AN8_out.csv
./validation/FUMEXII_Regate/analysis/Regate_smeared_out.csv
./validation/FUMEXII_Regate/analysis/Regate_discrete_out.csv
./validation/IFA_432/analysis/rod3/IFA_432_rod3_out.csv
./validation/IFA_432/analysis/rod1/IFA_432_rod1_out.csv
./validation/IFA_432/analysis/rod2/IFA_432_rod2_out.csv
./validation/LOCA_REBEKA_cladding_burst_tests/analysis/rebeka_2d_06MPa/rebeka_singlerod_2d_06MPa_out.csv
./validation/LOCA_REBEKA_cladding_burst_tests/analysis/rebeka_2d_06MPa/rebeka_singlerod_2d_06MPa_tm_out.csv
./validation/LOCA_REBEKA_cladding_burst_tests/analysis/rebeka_2d_08MPa/rebeka_singlerod_2d_08MPa_tm_out.csv

Я хотел бы использовать scp или rsync, чтобы вытащить эти файлы на мой локальный компьютер и создать структуру папок без чего-либо еще в них. Каков будет лучший способ пойти по этому поводу? У меня есть тонна файлов, поэтому я не хочу создавать структуру папок заранее. Я также не могу вытащить весь проект с сервера, потому что он огромный, и системные администраторы разозлятся на меня.

Есть ли способ извлечь эти файлы при одновременном создании структуры папок на моем локальном компьютере?

Ответы [ 2 ]

1 голос
/ 21 мая 2019

Я бы рекомендовал 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 для удаленного файла.

1 голос
/ 21 мая 2019

Я думаю, вы можете сделать это с опциями rsync * --exclude и --include.

rsync --recursive --include '*_out.csv' --exclude '*/doc/*' server:path/to/remote/dir path/to/local/dir
...