Рекурсивно использовать 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
Ответы
Ответ 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 на реальные значения.