scp все файлы, заканчивающиеся на «-123.jpg» — рекурсия, пробелы, подстановочные знаки…

scp все файлы, заканчивающиеся на «-123.jpg» — рекурсия, пробелы, подстановочные знаки…

Слишком много всего происходит, чтобы я мог вникнуть в это с моей головой новичка. Я хочу скачать все файлы, которые заканчиваются на -123.jpg из множества вложенных каталогов на удаленном сервере. В именах некоторых из этих каталогов есть пробелы. Я думаю, что команда должна быть примерно такой:

scp -r user@server:/path/to/parent\ directory/*/*/*123\.jpg ./

… где «parent\ directory» — имя каталога с пробелом, а указанный путь идет настолько глубоко, насколько это возможно, прежде чем он разделится на различные подкаталоги, например, dir/sub dir/[uniquely_id]-123.jpg file. (Обратите внимание, что эти подкаталоги часто также содержат пробелы, должно ли это влиять на подстановочный знак *)

Я получаю 'no match', возвращаемый для этого, или 'no such file or directory', если я вмешиваюсь в экранирование пробела. Я думаю, что это рекурсия или подстановочный знак, в котором я ошибся.

Заранее спасибо.

решение1

Экранирование имени файла с помощью scp — сложная задача; ваши аргументы (пере)расширяются на удаленной стороне. «Интересные» символы должны быть заключены в двойные кавычки, чтобы избежать специальной обработки вашей локальной оболочкой и удаленной. Я ожидаю, что оба следующих варианта сработают для вас:

scp user@server:'/path/to/parent\ directory/*/*/*123.jpg' ./
scp user@server:'"/path/to/parent directory"/*/*/*123.jpg' ./

Если это вас смущает, rsync довольно прост в использовании (как упоминает lothar), и передача tar или cpio через ssh тоже довольно проста.

ssh user@server 'cd /path/to/parent\ directory;
                 find -name "*123.jpg" -print0 | cpio -0 -o' |
    cpio -i -d -v

решение2

Не имея вашей серверной компоновки для тестирования, я не знаю, работает ли следующая команда на самом деле, но я думаю, что rsync будет лучше, чем scp в этом случае, так как вы можете указать шаблоны in- и exclude. Что-то вроде:

rsync -arvzSH  --include "*123.jpg" --exclude "*" user@server:/path/to/parent\ directory/ /path/to/target directory/

может сработать. Но лучше перепроверьтеrsync-документация.

решение3

Обходной путь для scp с использованием подстановочных знаков:

for i in "*-123.jpg"
do 
    scp $i <user>@<server>:/path/to/destination/
done

Ссылаться:https://community.hpe.com/t5/System-Administration/How-to-scp-multiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/true#M238959

решение4

Правильно это следует делать в два этапа:

  1. сначала найдите все необходимые файлы и скопируйте их в одну папку (это не сработает, если у вас одинаковые имена файлов) - вы можете сделать это с помощью одного findи-exec
  2. затем отправьте кучу файлов с помощьюscp

scpнедостаточно продвинут для копирования структуры папок и не существует единой команды для создания копии дерева папок.

Кроме того, если вам нужны все файлы в папках, поскольку вы не сможете выбрать их с помощью подстановочных знаков, и вы хотите сохранить структуру папок, вы можете использовать mc= Midnight Commander и его «Shell link».

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