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

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

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

Я получаю «нет совпадения» для этого или «нет такого файла или каталога», если я вмешиваюсь в пробел. Поэтому я думаю, что это неправильная рекурсия или подстановочный знак.

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

4 ответа4

2

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

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

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

0

Это правильно должно быть сделано в двух частях:

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

scp недостаточно продвинут, чтобы копировать структуру папок, и нет единой команды, чтобы сделать копию дерева папок.

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

0

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

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

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

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

Работа вокруг для 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-mutiple-files-using-wild-chars-or-in-a-single-scp/mp/3639440/highlight/ правда # M238959

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .