Как фильтровать файлы при использовании scp для рекурсивного копирования dir?
мне нужно скопировать все .файлы классов от сервера до локального со всеми зарезервированными dir. например,server:/usr/some/unknown/number/of/sub/folders/me.class будет /usr/project/backup/some/unknown/number/of/sub/folders/me.class проблема в том, что есть много других бесполезных файлов, таких как .svn-базовые файлы, которые мне не нужны. как я могу фильтровать их, чтобы я только scp .файлы классов?
8 ответов:
Я бы, наверное, рекомендовал использовать что-то вроде
rsyncдля этого из-за егоincludeиexcludeфлаги, например: -rsync -rav -e ssh --include '*/' --include='*.class' --exclude='*' \ server:/usr/some/unknown/number/of/sub/folders/ \ /usr/project/backup/some/unknown/number/of/sub/folders/некоторые другие полезные флаги:
-rдля рекурсивных-aв архиве (в основном все файлы)-vдля более подробного вывода-eчтобы указать ssh вместо значения по умолчанию (которое должно быть ssh, на самом деле)
в scp нет функции для фильтрации файлов. Для "продвинутых" вещей, подобных этому, я рекомендую использовать rsync:
rsync -av --exclude '*.svn' user@server:/my/dir .(эта строка копирует rsync из удаленной папки в текущую)
последние версии rsync туннеля через ssh-соединение автоматически по умолчанию.
так как вы можете
scpвы должны быть в порядкеssh,
либо сценарий следующий, либо войти и выполнить...# After reaching the server of interest cd /usr/some/unknown/number/of/sub/folders tar cfj pack.tar.bz2 $(find . -type f -name *.class)возврат обратно (выход) на локальный сервер и
scp,# from the local machine cd /usr/project/backup/some/unknown/number/of/sub/folders scp you@server:/usr/some/unknown/number/of/sub/folders/pack.tar.bz2 . tar xfj pack.tar.bz2
если вы найдете
$(find ...)слишком долго для вашего изменения смолы,find . -type f -name *.class | xargs tar cfj pack.tar.bz2
наконец, так как вы держите его в
/usr/project/backup/,
зачем утруждать себя добычей? Просто держитеtar.bz2, возможно, с отметкой даты и времени.
при включенной аутентификации на основе ключа ssh будет работать следующий скрипт.
for x in `ssh user@remotehost 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo 'user@remotehost:'$x) /usr/project/backup$y/; done
ниже команда для файлов.
scp ' найти . - maxdepth 1-имя"*.лог"\! -название "hs_err_pid2801.log " - тип f` root@IP:/tmp/test/
- IP будет IP-адрес сервера назначения.
- -имя "*.журнал " для включения файлов.
- \! -название "hs_err_pid2801.журнал" для исключения файлов.
- . является текущим рабочим реж.
- - тип f для типа файла.
ниже команда для каталога.
scp-r ' найти . - maxdepth 1-имя " lo*"\! - имя "localhost" - тип d` root@IP:/tmp/test/
вы можете настроить выше команды в соответствии с вашим требованием.
Если вы действительно хотите использовать scp, есть косвенный способ.Скажем, мы хотим скопировать все .jpg файл в локальной папке '/ src 'в папку' /dst ' на удаленном сервере 10.1.1.2:
#make a clean temp folder mkdir /tmp/ttt #copy all .jpg file and retain folder structure as-is find /src -type f -name *.jpg -exec cp --parents \{\} /tmp/ttt \; #copy to remote target folder as-is and retain original time attributes scp -rp /tmp/ttt/* 10.1.1.2:/dst #if copy ok, remove temp folder rm -rf /tmp/ttt