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