Copie somente diretórios com arquivos .mp3 com rsync

4

Estou tentando copiar apenas pastas com arquivos .mp3 para outro dispositivo. E apenas os .mp3s neles . A estrutura é assim:

Band/Year - Album/*.flac
Band/Year - Album/*.txt
Band/Year - Album/*.mp3
Band/Year - Album/covers
Band/Year - Album/covers/*.jpg

Eu já li um monte de manuais e fóruns, mas não consigo resolver meu problema. Não importa o que eu faça, não importa como eu esteja tentando formular o que eu quero incluir na cópia, já que isso é excluído - ele se foi mesmo

--exclude=* --include=*

não copia nada. Eu testei em outro diretório, mesmo sem nenhum, caramba.

Me ajude,% username, você é minha última esperança.

EDIT: Lista do que tentei em vão:

rsync -rnv --exclude=** --include=*/ --include=*/*/ --include=*/*/*/ --include=*/*/*.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC
rsync -rnv --exclude=** --include=*/ --include=*/*/ --include=*/*/*/ --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC
rsync -rnv --exclude=** --include=*/ --include=*/* --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC
rsync -rnv --exclude=*/*/* --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC
rsync -rnv --exclude=*/*/*.* --include=**.mp3 "./Be'lakor" /media/moorindal/WALKMAN/MUSIC
rsync -rnv --exclude='*/*/*.*' --include='*/*/*.mp3' "./Be'lakor" /media/moorindal/WALKMAN/MUSIC

E muito mais, levaria uma hora só para copiar tudo.

    
por Moorindal 23.07.2015 / 19:11

3 respostas

3

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
    
por 24.07.2015 / 02:13
1

Você está tentando fazer muito com o rsync. A primeira coisa a fazer é produzir a lista de todos os arquivos MP3.

find Music -type f -iname '*.mp3'

Em seguida, converta a lista de arquivos em uma lista dos diretórios que contêm os arquivos.

sed 's:/[^/]*$::'

Elimine qualquer duplicação de diretórios na lista.

sort -u

Agora você tem a lista de diretórios que você precisa. Alimente-os para rsync um de cada vez. Use --relative para manter a árvore de diretórios intacta no destino.

while IFS= read -r dir; do rsync --archive --relative "$dir" /mnt; done

Completamente como um único canal:

find Music -type f -iname '*.mp3' |
   sed 's:/[^/]*$::' |
   sort -u |
   while IFS= read -r dir; do rsync --archive --relative "$dir" /mnt; done
    
por 23.07.2015 / 21:28
0

Você não precisa se preocupar com --include ou --exclude para essa situação. Basta informar rsync para copiar os arquivos mp3 que estão nos lugares conhecidos bem estruturados:

cd /path/to/source
rsync -avR */*/*.mp3 /path/to/target/

Talvez você queira copiar todos os arquivos em diretórios que contenham um mp3 . Você pode fazer isso com esse pequeno loop, novamente assumindo o layout bem estruturado:

for mp3 in */*/*.mp3
do
    rsync --exclude covers -avR "${mp3%/*}"/ /path/to/target/
done
    
por 24.07.2015 / 01:44