Como copio todos os arquivos e diretórios, exceto alguns no ssh?

23

Usando a linha de comando do Linux, eu uso o scpcomando para copiar todos os arquivos e pastas de um determinado diretório. No entanto, não gosto de consumir largura de banda, pois, para copiar coisas, raramente mudo como minha tiny_mcepasta. Qual é o truque para copiar tudo, mas pule uma pequena lista de pastas?

Michael Prokopec
fonte

Respostas:

19

rsyncfunciona bem e, na maioria dos casos, usa o SSH automaticamente como protocolo de transporte. Ele compara os arquivos e apenas carrega aqueles que foram alterados - mas você também pode usar uma lista de exclusão para especificar arquivos na árvore que não devem ser sincronizados de qualquer maneira.

Anthon
fonte
O rsync não usa o SSH automaticamente - você precisa fornecer os sinalizadores "-e ssh" para fazer isso.
4
Sim. Lançamento do Rsync 2.6.0 - O shell remoto padrão agora é "ssh", a menos que você diga ao configure que deseja tornar outra coisa o padrão. samba.org/rsync
12

Você pode tentar o rsync, que apenas copia arquivos que foram alterados, também funciona sobre o ssh.


fonte
9

Usar rsync --excludeé a escolha mais óbvia aqui, mas se você realmente deseja enviar apenas alguns arquivos ou pastas e tem algo específico a excluir, pode usar o shell globing scp. Primeiro, verifique se você tem as opções corretas de globing definidas no seu shell. Para bash run shopt -s extglobe para zsh use setopt ksh_glob. Então algo como isto:

scp /path/to/folder/!(tiny_mce|other_folder|*.bak) user@host:target_path

... copiava tudo na pasta de origem, exceto itens que correspondessem ao padrão especificado. Obviamente, você pode ser criativo com essa parte.

Caleb
fonte
7

rsync é uma boa solução, mas se você estiver procurando por uma alternativa:

Digamos, temos um diretório "test" que contém os diretórios "foo, bar, baz". Nestas dirs existem vários tipos de arquivos:

test
|____bar
| |____1.jpg
| |____1.png
| |____1.txt
| |____2.jpg
| |____2.png
| |____2.txt
|____baz
| |____1.avi
| |____2.avi
| |____3.png
|____foo
| |____test.blah
|____test.txt

Queremos copiar tudo, exceto os PNGs

scp $(find /location/of/test -type f ! -name "*.png") # -> Note the logical NOT!!

Neste exemplo, o comando colocará todos os arquivos no mesmo diretório de destino - esse pode não ser o comportamento desejado.

Anthon
fonte
1
Observe que esta resposta funciona apenas se os nomes de arquivos e diretórios envolvidos não contiverem caracteres especiais do shell (espaço em branco ou \[*?).
Gilles 'SO- stop be evil'
3

Uma ótima ferramenta que você pode querer experimentar é "lftp".

lftp sftp://etc.etc/ 
lftp> ls 
    --- remote listing ---
lftp> mirror -R -n local/ remote/

Você também pode usar o RSync sobre ssh

rsync -avzp -e ssh /this/dir/  remoteuser@remotehost:/remote/dir/

Deveria trabalhar.

Kent Fredric
fonte
0

Acabei de escrever como prefiro o uníssono para sincronizar a qualquer dia, já que

  • não precisa de um daemon, além do ssh para transporte
  • permite modificar arquivos de ambos os lados a qualquer momento - vários mestres facilmente, enquanto eu só preciso enviar uma solicitação de sincronização de um lado
  • Eu sou um defensor quando se trata de modtimes, atributos / permissões, softlinks etc. Não há problemas com isso; para um projeto, eu até uso 4 espelhos, sendo um deles um host cygwin. Veja meu exemplo de configuração do crontab.
  • suporta exclusões como *.bak. Amostras no meu arquivo de configuração
Marcos
fonte
0

Usando cópia protegida - scp

scp -r file user@host:

Para copiar muitos arquivos

scp /directory/* user@host:destinationPath

Para copiar alguns arquivos

scp /directory/!(*.doc) user@host:destinationPath

Ele copia o conteúdo do diretório, exceto os arquivos .doc

Yogeesh HT
fonte
0

Eu certamente recomendaria você rsync.

rsync -vra --exclude = "o que você deseja excluir" -e ssh folder user @ remotehost: / folder

Amit Singh
fonte
0

Foi isso que funcionou para mim quando o executei no servidor de destino.

rsync -av --progress user@servername:/sourcefolder /destinationfolder --exclude thefoldertoexclude
user2373210
fonte
0

Podemos fazer isso em duas etapas para ignorar o tiny_mcediretório. Supondo que todos os diretórios iniciem com letras minúsculas.

scp -r USER@HOSTNAME:~/FOLDER/[a-s]* .
scp -r USER@HOSTNAME:~/FOLDER/[u-z]* .

Além disso, altere USER, HOSTNAME e FOLDER para os valores reais.

Fady Ibrahim
fonte