Подтвердить что ты не робот

Рекурсивно использовать scp, но исключая некоторые папки

Предположим, что есть несколько папок с этими структурами

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_0/fl_1/
/bench1/1cpu/p_1/image/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/1cpu/p_1/fl_1/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_0/fl_1/
/bench1/2cpu/p_1/image/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
/bench1/2cpu/p_1/fl_1/
....

Что я хочу сделать, это scp следующие папки

/bench1/1cpu/p_0/image/
/bench1/1cpu/p_1/image/
/bench1/2cpu/p_0/image/
/bench1/2cpu/p_1/image/

Как вы можете видеть, я хочу рекурсивно использовать scp, но исключая все папки с именем "fl_X". Кажется, что scp не имеет такого варианта.

UPDATE scp не имеет такой функции. Вместо этого я использую следующую команду

 rsync -av --exclude 'fl_*' [email protected]:/my/dir

Но это не сработает. Он передает только список папок! что-то вроде ls -R

4b9b3361

Ответ 1

Хотя scp поддерживает рекурсивное копирование каталогов с опцией -r, он не поддерживает фильтрацию файлов. Есть несколько способов выполнить вашу задачу, но я, вероятно, полагаюсь на find, xargs, tar и ssh вместо scp.

find . -type d -wholename '*bench*/image' \
| xargs tar cf - \
| ssh [email protected] tar xf - -C /my/dir

Решение rsync можно заставить работать, но вам не хватает некоторых аргументов. rsync также нужен переключатель r для рекурсии в подкаталоги. Кроме того, если вам нужна такая же безопасность scp, вам необходимо выполнить передачу в ssh. Что-то вроде:

rsync -avr -e "ssh -l user" --exclude 'fl_*' ./bench* remote:/my/dir

Ответ 2

Предполагая, что самый простой вариант (установка rsync на удаленном хосте) невозможен, вы можете использовать sshfs для локального локального подключения и rsync из каталога монтирования, Таким образом, вы можете использовать все опции rsync, например --exclude.

Что-то вроде этого должно делать:

sshfs [email protected]: sshfsdir
rsync --recursive --exclude=whatever sshfsdir/path/on/server /where/to/store

Обратите внимание, что эффективность rsync (только передача изменений, а не все) здесь не применима. Это связано с тем, что для работы, rsync должен читать каждое содержимое файла, чтобы увидеть, что изменилось. Однако, поскольку rsync работает только на одном хосте, весь файл должен быть передан там (по sshfs). Исключенные файлы не должны передаваться, однако.

Ответ 3

Вы можете указать GLOBIGNORE и использовать шаблон *

GLOBIGNORE='ignore1:ignore2' scp -r source/* remoteurl:remoteDir

Возможно, вы захотите иметь общие правила, которые вы комбинируете или переопределяете с помощью export GLOBIGNORE, но для специального использования подойдет просто вышеприведенное. Символ : используется в качестве разделителя для нескольких значений.

Ответ 4

Если вы используете файл pem для аутентификации, вы можете использовать следующую команду (которая будет исключать файлы с чем-то расширением):

rsync -Lavz -e "ssh -i <full-path-to-pem> -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" --exclude "*.something" --progress <path inside local host> <user>@<host>:<path inside remote host>

-L означает следующие ссылки (копировать файлы, а не ссылки). Используйте полный путь к вашему файлу pem, а не относительный.

Использование sshfs не рекомендуется, так как оно работает медленно. Кроме того, комбинация find и scp, которая была представлена ​​выше, также является плохой идеей, так как она откроет ssh-сессию на файл, который слишком дорог.

Ответ 5

Вы можете использовать расширенное globbing, как в примере ниже:

#Enable extglob
shopt -s extglob

cp -rv !(./excludeme/*.jpg) /var/destination

Ответ 6

Это хорошо работает для меня, так как структура каталогов не важна для меня.

scp -r [email protected]:~/bench1/?cpu/p_?/image/ .

Предполагая, что /bench1 находится в домашнем каталоге текущего пользователя. Также измените USER и HOSTNAME на реальные значения.