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?

Foi útil?

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 /

  1. IP será destino endereço IP do servidor.
  2. -name "* .log" para incluir arquivos.
  3. \! -name "hs_err_pid2801.log" para excluir arquivos.
  4. . é atual dir de trabalho.
  5. -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 .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
  1. Copie a pasta de origem para somedir:

    cp -r srcdir somedir

  2. remover todos os arquivos desnecessários:

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

  3. lançamento scp a partir somedir

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top