Como arquivos de filtro quando utilizar o scp para copiar dir recursivamente?
Pergunta
Eu preciso copiar todos os arquivos .class do servidor para o local com todos os dir reservados. por exemplo. server:/usr/some/unknown/number/of/sub/folders/me.class
será /usr/project/backup/some/unknown/number/of/sub/folders/me.class
o problema é, há muitos outros arquivos inúteis, como arquivos .svn-base que eu não quero. Como posso filtrá-los, então eu apenas os arquivos .class scp
?
Solução
Eu provavelmente recomendo usar algo como rsync
para este devido a suas bandeiras include
e exclude
, por exemplo: -
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/
Algumas outras bandeiras úteis:
-
-r
para recursiva -
-a
para arquivo (principalmente todos os arquivos) -
-v
para verboso saída -
-e
para especificar ssh em vez do padrão (que deve ser ssh, na verdade)
Outras dicas
Para excluir dotfiles no diretório base:
scp -r [!.]* server:/path/to/something
[!.]*
é um glob shell que se expande para todos os arquivos no diretório de trabalho não iniciar com um ponto.
Não há recurso no scp para arquivos de filtro. Para coisas "avançada" como este, eu recomendo usar rsync:
rsync -av --exclude '*.svn' user@server:/my/dir .
(esta linha de cópia rsync da pasta distante para atual)
As versões recentes do túnel rsync através de uma conexão ssh automaticamente por padrão.
Uma vez que você pode scp
você deve estar ok para ssh
,
quer roteiro a seguir ou login e executar ...
# After reaching the server of interest
cd /usr/some/unknown/number/of/sub/folders
tar cfj pack.tar.bz2 $(find . -type f -name *.class)
retorno de volta (Sair) para o servidor local e 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
Se você encontrar o $(find ...)
é muito longo para sua mudança tar para,
find . -type f -name *.class | xargs tar cfj pack.tar.bz2
Finalmente, desde que você está mantendo-a em /usr/project/backup/
,
por que se preocupar extração? Basta manter o tar.bz2
, talvez com um + carimbo de data e hora.
Com a autenticação baseado em chave ssh habilitado, o seguinte script iria funcionar.
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
Abaixo de comando para arquivos.
scp `find. -maxdepth 1 -name "* .log" \! -name "hs_err_pid2801.log" root do tipo f` @ IP: / tmp / test /
- IP será destino endereço IP do servidor.
- -name "* .log" para incluir arquivos.
- \! -name "hs_err_pid2801.log" para excluir arquivos.
- . é atual dir de trabalho.
- -type f para o tipo de arquivo.
Abaixo de comando para o diretório.
scp -r `find. -maxdepth 1 -name "lo *" \! -name "localhost" -tipo d` root @ IP: / tmp / test /
Você pode personalizar comando acima como por sua exigência.
Se você de fato quer usar scp, há uma maneira indireta ??strong> .Say queremos copiar todos os arquivos .jpg na pasta local '/ src' para a pasta '/ dst' no servidor remoto 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
-
Copie a pasta de origem para
somedir
:cp -r
srcdir
somedir
-
remover todos os arquivos desnecessários:
Encontrar somedir -name '.svn' exec rm -rf {} \ +
-
lançamento scp a partir
somedir