Скопируйте только каталоги с файлами .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 

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

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 
  • rsync для нескольких удаленных серверов
  • tunnel rsync: // протокол по ssh
  • rsync с облачным флагом
  • cron rsnapshot - еженедельно до ежемесячного
  • Действительно ли rsync или duplicity записывают файлы на смонтированном хранилище?
  • Что происходит, когда вы rsync без адресата?
  • Как запомнить пароль ssh с помощью lsyncd?
  • rsync с именем странных файлов
  • Может ли rsync определить, где остановился прерванный процессор?
  • rsync разреженного изображения qemu увеличивает размер диска
  • rsync самые последние x GB
  • Rsync ssh include & exclude
  • Interesting Posts

    Скопируйте текстовые строки из файла и добавьте их в один и тот же файл с префиксом средней линии или удалите префикс средней строки

    Удаление всех пользователей из группы

    Как принять переадресацию ICMP?

    Не осталось свободного места (недостаток inode)

    Установите два одинаковых USB-устройства. Всегда в том же порту UBUNTU

    Как отрезать сегмент или несколько сегментов из одной строки?

    Кейт против VIM / Emacs относительно скорости

    Ubuntu 16.04 Скрипты в файле /etc/profile.d

    Отсутствует индикатор активной видеокарты

    новый кошелек kde с использованием GPG-бэкэнд: «Ошибка при попытке дешифрования кошелька с использованием GPG»

    проверьте, установлен ли интерфейс eth0 (настроен)

    В эмуляторе терминологии нет общих игроков в Lubuntu 16.04

    Как создать постоянный псевдоним ip, принадлежащий разным подсетям в Centos

    Терминальный эмулятор для CygWin?

    Два способа блокировки пароля, но только один для разблокировки

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