
У меня есть удаленная машина с большим количеством пронумерованных каталогов, например:
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