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

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, на самом деле)

чтобы исключить dotfiles в директории:

scp -r [!.]* server:/path/to/something

в 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/

  1. IP будет IP-адрес сервера назначения.
  2. -имя "*.журнал " для включения файлов.
  3. \! -название "hs_err_pid2801.журнал" для исключения файлов.
  4. . является текущим рабочим реж.
  5. - тип 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
  1. скопируйте исходную папку в somedir:

    cp-r srcdirsomedir

  2. удалить все ненужные файлы:

    найти somedir -имя '.svn ' - exec rm-rf {} \+

  3. запуск scp из somedir