Alguém pode me dizer por que o rsync não copia arquivos das subpastas da fonte? [duplicado]

0

Eu tenho tentado usar rsync para simplesmente copiar todos os arquivos de imagens TIF da pasta atual para uma pasta 'HR' em 'Documents' sem sucesso até o momento, com o seguinte comando:

rsync -r *.tif /home/myusername/Documents/HR

Como eu vejo, a opção -r é aquela usada para cópia recursiva, mas o comando só copia qualquer arquivo TIF existente na pasta atual.

Alguém poderia me dizer onde eu errei?

Basta dizer que a pasta atual tem várias subpastas de vários níveis contendo centenas de arquivos TIF.

    
por Scott Carey 10.07.2017 / 17:04

2 respostas

2

Você tem um curinga ( * ) em sua linha de comando, que é expandida pelo shell, portanto, rsync vê que recebeu uma lista de arquivos TIFF no diretório atual. Por exemplo, sua linha de comando pode ser expandida para isso:

rsync -r cry.tif frown.tif smile.tif /home/myusername/Documents/HR

Nenhum desses arquivos TIFF é um diretório, portanto, rsync não possui nenhum lugar onde possa recorrer.

Por outro lado, se você tentar isso, rsync poderá usar a oportunidade de encontrar diretórios e recursá-los. Eu usei o -a flag para manter os metadados do arquivo (permissões, timestamps). Essa tentativa copia todos os arquivos, não apenas os que terminam com .tif , mas se isso for suficiente, essa é uma solução fácil de compreender:

rsync -a . /home/myusername/Documents/HR/

Agora, para a última parte do quebra-cabeça. Se você deseja copiar apenas arquivos TIFF (correspondentes a *.tif ), precisará informar rsync que, embora possa reciclar, deve copiar apenas esses arquivos. Esta é a parte mais complexa de um comando rsync , mas felizmente é citado quase exatamente como um exemplo na página de manual (veja man rsync e procure por "hide"):

rsync -am --include '*.tif' --filter 'hide,! */' . /home/myusername/Documents/HR/
    
por 10.07.2017 / 17:23
-1

Eu costumo ler a página man antes de usar um comando.

Então, quando eu uso rsync , eu uso as opções -av , que é semelhante a -rlptgoDv , ou -rlptgoD ( -a ) e -v (verbose).

EDIT (após seu comentário):

O mesmo aconteceu comigo, maaaany luas atrás, eu li a seção USAGE e com certeza, está escrito lá (DEPOIS DO PRIMEIRO EXEMPLO): Note that the expansion of wildcards on the commandline (*.c) into a list of files is handled by the shell... . Também notei que -r não preserva datas e -v também é útil, achei que -av seria perfeito.

Da página do manual:

[..]
USAGE
   You use rsync in the same way you use rcp. You must specify a source and a destination, one of which may be remote.

   Perhaps the best way to explain the syntax is with some examples:

          rsync -t *.c foo:src/

   This  would  transfer  all  files matching the pattern *.c from the current directory to the directory src on the machine foo. If any of the files already exist on the remote system then the rsync remote-update protocol is used to update the file by sending
   only the differences in the data.  Note that the expansion of wildcards on the commandline (*.c) into a list of files is handled by the shell before it runs rsync and not by rsync itself (exactly the same as all other posix-style programs). 

          rsync -avz foo:src/bar /data/tmp

   This would recursively transfer all files from the directory src/bar on the machine foo into the /data/tmp/bar directory on the local machine. The files are transferred in "archive" mode, which ensures that symbolic links, devices, attributes,  permissions,
   ownerships, etc. are preserved in the transfer.  Additionally, compression will be used to reduce the size of data portions of the transfer.

          rsync -avz foo:src/bar/ /data/tmp

   A  trailing slash on the source changes this behavior to avoid creating an additional directory level at the destination.  You can think of a trailing / on a source as meaning "copy the contents of this directory" as opposed to "copy the directory by name",
   but in both cases the attributes of the containing directory are transferred to the containing directory on the destination.  In other words, each of the following commands copies the files in the same way, including  their  setting  of  the  attributes  of
   /dest/foo:

          rsync -av /src/foo /dest
          rsync -av /src/foo/ /dest/foo
   Note also that host and module references don’t require a trailing slash to copy the contents of the default directory.  For example, both of these copy the remote directory’s contents into "/dest":

          rsync -av host: /dest
          rsync -av host::module /dest

   You can also use rsync in local-only mode, where both the source and destination don’t have a ’:’ in the name. In this case it behaves like an improved copy command.

   Finally, you can list all the (listable) modules available from a particular rsync daemon by leaving off the module name:

          rsync somehost.mydomain.com::
  [...]
    
por 10.07.2017 / 17:08