Como posso manipular o comando find para “encontrar” os diretórios nos quais o arquivo “found” está?

3

Então, estou tentando usar o comando find para localizar todos os arquivos no meu sistema com mtime -x . Ele faz isso, mas não "encontra" os diretórios do arquivo.

find . -mtime -2 -exec rsync -av {} /destination/ \;

Eu pensei que se eu pudesse trazer todos os diretórios que eles alimentariam para eles se pudesse, tentei:

rsync -a -f"+ */" -f"- *" source/ destination/

O que funciona bem para trazer a árvore de diretórios, mas quando eu tento puxar os arquivos para dentro dela, eles não entram nos diretórios separados, eles simplesmente entram no diretório principal para o qual eu os copiei.

Alguma idéia de como eu posso obter o comando find para encontrar os diretórios também ou outra maneira de contornar este problema?

    
por user768352 11.03.2014 / 11:10

1 resposta

3

Existem dois problemas com esta linha de comando:

find . -mtime -2 -exec rsync -av {} /destination/ \;'

Transferindo nomes de caminho

Primeiro, ao dar nomes de arquivo (único) a rsync e não simplesmente a um diretório, ele deve ser explicitamente explicado para usar o caminho inteiro e não apenas o nome do arquivo para o destino. Para isso, use a opção -R . Da página de manual para rsync (1):

-R, --relative Use relative paths. This means that the full path names specified on the command line are sent to the server rather than just the last parts of the filenames. This is particularly useful when you want to send several different directories at the same time. For example, if you used this command: rsync -av /foo/bar/baz.c remote:/tmp/ ... this would create a file named baz.c in /tmp/ on the remote machine. If instead you used rsync -avR /foo/bar/baz.c remote:/tmp/ then a file named /tmp/foo/bar/baz.c would be created on the remote machine, preserving its full path. These extra path elements are called "implied directories" (i.e. the "foo" and the "foo/bar" directories in the above example). [...]

A manpage continua como manipular o caminho de modo que somente partes dele estarão presentes no lado do recebedor, mas isso está fora do escopo aqui.

Pesquisar apenas por arquivos, não por diretórios

Em segundo lugar, find , chamado acima, não só informa os arquivos, mas também os diretórios. Quando um nome de diretório é fornecido para rsync como uma origem, ele sincronizará esse diretório inteiro com o destino. Isso pode ser evitado usando o teste adicional -type f ("type must be file") para find . Esteja ciente, no entanto, de que isso não apenas excluirá os diretórios, mas também os soquetes, os pipes nomeados, os dispositivos block e char e os links simbólicos. Para links simbólicos, você pode usar o parâmetro -xtype , que verificará o tipo de destino da ligação simbólica.

Solução

Assim, a linha de comando modificada ficaria assim:

find . -type f -mtime -2 -exec rsync -av -R {} /destination/ \;

Isso representará find de todos os arquivos ( -type f ) no caminho atual ( . ) que foram modificados nos últimos dois dias ( -mtime -2 ) e para cada um deles: execute ( -exec ) rsync , copiando o arquivo com o nome dado ( {} ) para /destination/ , preservando a maioria dos atributos ( -a ), dando saída detalhada ( -v ) e reproduzindo todo o caminho no destino ( -R ).

    
por 11.03.2014 / 16:50