Как фильтровать файлы при использовании scp для копирования рекурсивно?

Мне нужно скопировать все файлы .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 файлы?

Ответ 1

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

Ответ 2

Чтобы исключить dotfiles в базовый каталог:

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

Ответ 3

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

rsync -av --exclude '*.svn' [email protected]:/my/dir .

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

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

Ответ 4

Поскольку вы можете scp, вы должны быть в порядке ssh,
либо script выполните следующие действия или войдите в систему и выполните...

# 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 [email protected]:/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, возможно, с датой + отметкой времени.

Ответ 5

При включенной аутентификации на основе ssh будет работать script.

for x in `ssh [email protected] 'find /usr/some -type f -name *.class'`; do y=$(echo $x|sed 's/.[^/]*$//'|sed "s/^\/usr//"); mkdir -p /usr/project/backup$y; scp $(echo '[email protected]:'$x) /usr/project/backup$y/; done

Ответ 6

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

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

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

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

scp -r `find. -maxdepth 1 -name "lo *" \! -name "localhost" -type d` root @IP:/tmp/test/

вы можете настроить команду выше в соответствии с вашим требованием.

Ответ 7

  • Скопируйте исходную папку в somedir:

    cp -r srcdir somedir

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

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

  • запустить scp из somedir