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 comandofind
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 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 REPLACEMENT
chamadasmkdir_ln FILENAME REPLACEMENT
para cadaFILENAME
que corresponde aPATTERN
, com$f
emREPLACEMENT
substituído porFILENAME
. -
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 contenhabar
.