Как фильтровать файлы при использовании 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