Crie hardlinks em vez de copiar arquivos com rsync

1

O comando a seguir encontra recursivamente todos os arquivos contendo foo (mas não bar ) e preserva a estrutura de diretórios no diretório de destino, por exemplo, se eu tiver /path/to/2017/foo.ps e /path/to/2018/foo.pdf , criará os subdiretórios 2017 e 2018 sob ~/path/to/dir/ contendo foo.ps resp. foo.pdf .

find . -iname \*foo\*pdf -exec rsync -R --exclude='*bar*' {} ~/path/to/dir/ \;

Qual é o equivalente a esse comando, de modo que acabo com hardlinks em vez de cópias?

    
por Julia 25.10.2018 / 23:39

2 respostas

2

Isso não se parece muito com um trabalho para o rsync. O Rsync é útil principalmente para cópias recursivas, mas evidentemente você só pretende copiar arquivos regulares. A única vantagem de rsync over cp aqui é que ele cria os diretórios pais conforme necessário. Você poderia fazer isso com um pequeno script de shell chamando mkdir .

find . -type f -iname '*foo*.pdf' ! -name '*bar*' \
       -exec sh -c 'mkdir -p "~/path/to/dir/${0%/*}" && cp "$0" ~/path/to/dir/"$0"' {} \;
  • Adicione -type f ao comando find para excluir arquivos não regulares (por exemplo, diretórios). Use -xtype f para processar também links simbólicos para arquivos regulares.
  • ! -name '*bar*' é equivalente à opção rsync --exclude .
  • sh -c '…' {} executa o script de shell com $0 definido com o nome do arquivo encontrado por find .
  • mkdir -p … cria o diretório de destino e qualquer pai, conforme necessário.

Aqui você pode substituir ln de cp para criar um link físico.

Alternativamente, você pode usar zsh 's zmv . Em zsh:

setopt extended_glob
autoload zmv
mkdir_ln () {
  mkdir -p -- $2:h
  ln -- $1 $2
}
zmv -p mkdir_ln '**/(#i)*foo*.pdf~**/*bar*' ~/path/to/dir/'$f'
  • zmv -p mkdir_ln PATTERN REPLACEMENT chamadas mkdir_ln FILENAME REPLACEMENT para cada FILENAME que corresponde a PATTERN , com $f em REPLACEMENT substituído por FILENAME .
  • mkdir -p -- $2:h cria a parte do diretório $2 e qualquer diretório pai, conforme necessário.
  • **/… corresponde arquivos em subdiretórios de forma recursiva.
  • (#i) inicia uma correspondência sem distinção entre maiúsculas e minúsculas.
  • ~**/*bar* exclui arquivos cujo nome contenha bar .
por 26.10.2018 / 00:27
0

Parece um trabalho para pax :

find . -iname '*foo*pdf' ! -name '*bar*' -print0 |
  pax -0rwl ~/path/to/dir/

Se o seu pax não for compatível com o% não padrão-0, remova o 0 de -print0 e -0rwl , mas cuidado para não funcionar corretamente se você tiver caminhos de arquivo que contenham caractere de nova linha .

Se você não tem pax (POSIX, mas não GNU), tente substituir por cpio -0pd (GNU, mas não POSIX).

    
por 27.10.2018 / 00:36