Primeiro, porque --exclude=* --include=*
não funciona: porque a primeira regra de correspondência se aplica. *
corresponde a tudo, então tudo é excluído e o rsync nem mesmo tenta a segunda regra para qualquer arquivo. Consulte filtro Rsync: copiando apenas um padrão para um guia para filtros de rsync.
Para incluir arquivos .mp3
, você precisa
rsync -a -m --include='*.mp3' --include='*/' --exclude='*'
i.e. inclua MP3, inclua todos os diretórios (se um diretório não estiver incluído, então nenhum dos arquivos dentro dele será incluído) e exclua todo o resto. A opção -m
(a.k.a. --prune-empty-dirs
) torna os diretórios rsync skip que não contêm arquivos a serem copiados. Mas isso não incluirá outros arquivos no mesmo diretório que o arquivo .mp3
. Para isso, você precisa de ajuda do shell ou de outras ferramentas.
Em zsh, você pode combinar .mp3
arquivos em subdiretórios com **/*.mp3
e, em seguida, usar um modificador de histórico como qualificador para transformar o resultado na lista de diretórios contendo .mp3
arquivos.
rsync -a **/*.mp3(:h) /destination
Se você tiver muitos diretórios (ou, mais precisamente, se o tamanho combinado de seus nomes for muito grande), isso pode quebrar o limite da linha de comando. Remover duplicatas pode ajudar:
typeset -aU directories
directories=(**/*.mp3(:h))
rsync -a $directories /destination
Isso não elimina o risco de que o comando seja muito longo, apenas o reduz. Para eliminar o risco, use zargs
para executar o rsync em lotes. / p>
autoload -U zargs
typeset -aU directories
directories=(**/*.mp3(:h))
do_rsync () { rsync -a $@ /destination; }
zargs --max-chars=$(($(get_conf ARG_MAX) - 500)) -- $directories -- do_rsync