Скопируйте только каталоги с файлами .mp3 с помощью rsync

Я пытаюсь скопировать только папки с .mp3-файлами в них на другое устройство. И только .mp3s в них . Структура выглядит так:

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

Я уже читал shiton руководств и форумов, но не могу решить мою проблему. Независимо от того, что я делаю, независимо от того, как я пытаюсь сформулировать то, что я хочу включить в копирование, поскольку оно исключено – оно ушло даже

 --exclude=* --include=* 

ничего не копирует. Я тестировал его в другом каталоге, даже без него, черт возьми.

Помогите мне,% username, ты моя последняя надежда.

EDIT: Список того, что я пробовал безрезультатно:

 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 

И много и много больше, потребуется всего час, чтобы скопировать все.

  • rsync коварный отказ
  • наиболее эффективный и безопасный способ сделать полную дифференциальную резервную копию с помощью rsync
  • Где rsync копирует файл, если я не указываю удаленный путь?
  • Синхронизировать дерево каталогов с дедупликацией?
  • Использовать sudo для упрощения rsync?
  • Операция перемещения файла над SAMBA сохраняет номер inode?
  • sudo askpass: спросить у другого tty
  • Каково взаимодействие параметров rsync --size-only и -sparse?
  • 3 Solutions collect form web for “Скопируйте только каталоги с файлами .mp3 с помощью rsync”

    Во-первых, почему --exclude=* --include=* не работает: поскольку применяется первое правило сопоставления. * соответствует всем, поэтому все исключено, и rsync даже не пытается использовать второе правило для любого файла. См. Фильтр Rsync: копирование одного шаблона только для руководства по rsync-фильтрам.

    Чтобы включить файлы .mp3 , вам нужно

     rsync -a -m --include='*.mp3' --include='*/' --exclude='*' 

    т.е. включить MP3, включить все каталоги (если каталог не включен, ни один из файлов внутри него не включен) и исключить все остальное. Параметр -m (aka --prune-empty-dirs ) делает --prune-empty-dirs rsync, которые не содержат файлов, которые нужно скопировать. Но это не будет включать другие файлы в том же каталоге, что и файл .mp3 . Для этого вам нужна помощь из оболочки или других инструментов.

    В zsh вы можете сопоставлять файлы .mp3 в подкаталогах с **/*.mp3 , а затем использовать модификатор истории в качестве квалификатора glob, чтобы преобразовать результат в список каталогов, содержащих файлы .mp3 .

     rsync -a **/*.mp3(:h) /destination 

    Если у вас слишком много каталогов (точнее, если объединенная длина их имен слишком велика), это может нарушить ограничение командной строки. Удаление дубликатов может помочь:

     typeset -aU directories directories=(**/*.mp3(:h)) rsync -a $directories /destination 

    Это не устраняет риск того, что команда слишком длинная, она просто уменьшает ее. Чтобы устранить риск, используйте zargs для запуска rsync партиями.

     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 

    Вы пытаетесь сделать слишком много с помощью rsync. Первое, что нужно сделать, это создать список всех файлов MP3.

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

    Затем преобразуйте список файлов в список каталогов, содержащих файлы.

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

    Устраните любое дублирование каталогов в списке.

     sort -u 

    Теперь у вас есть список каталогов, в которых вы нуждаетесь. Подавайте их по rsync по одному. Используйте –relative, чтобы сохранить дерево каталогов целым в месте назначения.

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

    Всего как единый трубопровод:

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

    Вам не нужно беспокоиться о --include или --exclude для этой ситуации. Просто скажите rsync скопировать файлы mp3 которые находятся в хорошо структурированных известных местах:

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

    Возможно, вместо этого вы хотите скопировать все файлы в каталогах, содержащих mp3 . Вы можете сделать это с помощью этого небольшого цикла, снова принимая хорошо структурированный макет:

     for mp3 in */*/*.mp3 do rsync --exclude covers -avR "${mp3%/*}"/ /path/to/target/ done 
    Linux и Unix - лучшая ОС в мире.