Выборочное копирование из коллекции удаленных каталогов

Выборочное копирование из коллекции удаленных каталогов

У меня есть удаленная машина с большим количеством пронумерованных каталогов, например:

dir1 dir2 dir3 ... dir40

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

file1 file2 file3 ... file2530

Я хочу скопировать только выбранный диапазон файлов в каждом каталоге. Поскольку имена файлов идентичны в каждом каталоге, я хочу пересоздать иерархию каталогов на моей локальной машине. Но поскольку я не хочукаждыйфайл, я не могу просто scp -rскопировать каждый файл в каталоге.

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

Как можно скопировать набор файлов с удаленного компьютера вместе с родительскими каталогами этих файлов, сохранив структуру каталогов и не копируя каждый файл в этих каталогах?

решение1

Вы можете использовать rsync, который сделает только один ssh к удаленному компьютеру и предоставит ему либо полный список файлов, либо список шаблонов файлов, которые нужно или не нужно копировать. Например,

rsync -navR --exclude='*-[4-9]?.out' --exclude='*-3[3-9].out' --exclude='*-???*.out' myremote:'dir*' mylocaldir

Это исключит имена файлов, например, file-40.outс 2 символами от 40 до 99, а также file-33.outдо 39, а также file-100.outили больше. Запустите команду с -nпараметром, как показано, чтобы собрать список имен, которые будут переданы, и если это нормально, удалите параметр, чтобы фактически выполнить копирование.

Обратите внимание, rsyncчто не поддерживает фигурные скобки {}в шаблонах glob. Альтернативные способы указания файлов для копирования зависят от того, насколько экзотичен ваш шаблон исключения, но надежный метод — использовать -nшаблоны и не исключать их, чтобы получить полный список имен, затем отредактировать этот список и предоставить его как --files-fromсписок файлов. Вам также нужно будет удалить dir*из удаленного назначения:

rsync -av --files-from=list  myremote: mylocaldir

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