Как фильтровать файлы при использовании scp для рекурсивного копирования dir? - PullRequest
92 голосов
/ 04 августа 2009

Мне нужно скопировать все файлы .class с сервера на локальный, зарезервировав все каталоги. например server:/usr/some/unknown/number/of/sub/folders/me.class будет /usr/project/backup/some/unknown/number/of/sub/folders/me.class проблема в том, что есть много других бесполезных файлов, таких как файлы .svn-base, которые мне не нужны. как я могу отфильтровать их, чтобы я только scp .class файлы?

Ответы [ 8 ]

139 голосов
/ 04 августа 2009

Я бы, вероятно, рекомендовал использовать что-то вроде 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)
65 голосов
/ 12 февраля 2015

Чтобы исключить точечные файлы в базовом каталоге:

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

[!.]* - это оболочка, которая распространяется на все файлы в рабочем каталоге, не начиная с точки.

34 голосов
/ 04 августа 2009

В scp нет функции фильтрации файлов. Для «продвинутых» вещей, подобных этому, я рекомендую использовать rsync:

rsync -av --exclude '*.svn' user@server:/my/dir .

(эта строка копирует rsync из удаленной папки в текущую)

Последние версии туннеля rsync через ssh-соединение автоматически по умолчанию.

8 голосов
/ 04 августа 2009

Так как вы можете 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 ...) слишком длинен для смены tar на

find . -type f -name *.class | xargs tar cfj pack.tar.bz2

Наконец, поскольку вы храните его в /usr/project/backup/,
зачем добывать? Просто сохраните tar.bz2, возможно, с отметкой даты + времени.

1 голос
/ 22 марта 2018

Если вы действительно хотите использовать 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 голос
/ 29 ноября 2017

Команда ниже для файлов.

scp `find. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" -type f` root @ IP: / tmp / test /

  1. IP будет IP-адресом сервера назначения.
  2. -name "* .log" для включаемых файлов.
  3. \! имя "hs_err_pid2801.log" для исключаемых файлов.
  4. . текущий рабочий каталог.
  5. -тип f для типа файла.

Ниже команда для каталога.

scp -r `найти. -maxdepth 1 -имя "lo *" \! -name "localhost" -type d` root @ IP: / tmp / test /

Вы можете настроить вышеупомянутую команду согласно вашему требованию.

1 голос
/ 04 января 2016

При включенной аутентификации на основе ключей 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
0 голосов
/ 04 августа 2009
  1. Скопируйте исходную папку в somedir:

    cp -r srcdir somedir

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

    find somedir -name '.svn' -exec rm -rf {} \ +

  3. запуск scp от somedir

...