Слишком много всего происходит, чтобы я мог вникнуть в это с моей головой новичка. Я хочу скачать все файлы, которые заканчиваются на -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
решение4
Правильно это следует делать в два этапа:
- сначала найдите все необходимые файлы и скопируйте их в одну папку (это не сработает, если у вас одинаковые имена файлов) - вы можете сделать это с помощью одного
find
и-exec
- затем отправьте кучу файлов с помощью
scp
scp
недостаточно продвинут для копирования структуры папок и не существует единой команды для создания копии дерева папок.
Кроме того, если вам нужны все файлы в папках, поскольку вы не сможете выбрать их с помощью подстановочных знаков, и вы хотите сохранить структуру папок, вы можете использовать mc
= Midnight Commander и его «Shell link».