Скопируйте только каталоги с файлами .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
  • Как реализовать схему вращения с помощью rsync
  • Как настроить сервер и клиент rsync?
  • Синхронизация с Onedrive
  • Как rsync в другой каталог?
  • 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 
    Interesting Posts

    Можете ли вы представить новые пакеты для существующих выпусков Debian?

    Как grep определенную строку _and_ первую строку файла?

    Google Chrome имеет неправильный значок док-станции

    Fedora 20 сбой на старом ПК

    Может настроить задание cron для копирования моего сервера на Amazon S3

    Как выбрать только числа из имен файлов в bash с помощью regex

    вторая клавиатура для запуска команд

    как включить переменные в конфигурационные файлы Bind9?

    Как сопоставить несколько строк, начинающихся с TAB, и строку до 1-го в группе?

    bash / gnu readline multiline command: перемещать строку вверх / вниз

    Как переназначить мой ключ CapsLock для работы, как если бы это был ключ Return с помощью setxkbmap?

    Как загрузиться после сбоя RAID (программный RAID)?

    Как сделать следующее форматирование с помощью сценария sed или awk или bash на linux

    Как обернуть две строки в одну строку с разделителем

    узнайте, какой интерфейс я использую

    Linux и Unix - лучшая ОС в мире.