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 fao comandofindpara excluir arquivos não regulares (por exemplo, diretórios). Use-xtype fpara processar também links simbólicos para arquivos regulares. -
! -name '*bar*'é equivalente à opção rsync--exclude. -
sh -c '…' {}executa o script de shell…com$0definido com o nome do arquivo encontrado porfind. -
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 REPLACEMENTchamadasmkdir_ln FILENAME REPLACEMENTpara cadaFILENAMEque corresponde aPATTERN, com$femREPLACEMENTsubstituído porFILENAME. -
mkdir -p -- $2:hcria a parte do diretório$2e 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 contenhabar.