3

У меня есть папка с тоннами неорганизованных файлов всех типов с глубокими уровнями подпапок, и я хочу найти каждый аудиофайл с 320kpbs (битрейт) и запустить что-то для каждого из них, не перемещая их все в одно и то же место, чтобы сделать это , Что-то вроде:

find /some/folder -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -BITRATE_IS_320kbps -exec ... \;

Но я не знаю командной строки, которая могла бы выполнить такую задачу для меня.

Я уже думал о некоторых менее изящных способах достижения этого, но я все еще хочу знать, как find (возможно, что-то похожее) файлы по метаданным, как это?

2 ответа2

2

Используя информацию из связанного ответа @ blm, вы можете сделать что-то вроде:

find /some/folder -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -exec bash -c " file '{}' | grep '320 kbps'" \; -exec <do what you want>

первый -exec будет искать только файлы со скоростью 320 кбит / с, так как команда file сообщает нам об этом. Если grep ничего не совпадает, то -exec будет ложным, а второй -exec не будет выполнен. Если grep совпадает, тогда будет выполнен второй -exec

Для полноты этой функции -exec можно найти на странице руководства

-exec command ;  
     Execute command; true if 0 status is returned

Редактировать:

Что касается использования file в этом решении, он, кажется, не работает для всех. Итак, вот альтернативный способ получить битрейт с помощью mediainfo:

#!/bin/bash

bitrate=$(mediainfo "$1" | grep -Ei 'overall bit ?rate.*[[:digit:]]+.*$' | grep -Eo [[:digit:]]+)
echo $bitrate

Вы можете сохранить его в файле .sh с разрешением на выполнение, после чего он выдаст вам битрейт файла (только цифры) в соответствии с общей информацией битрейта mediainfo , который вы можете заменить

-exec bash -c " file '{}' | grep '320 kbps'" \;

с

-exec bash -c "BITRATE_SCRIPT_PATH '{}' | grep '320'" \;

(может плохо работать с аудиофайлами без потерь, скорость передачи которых составляет 1 Мбит / с +)

2

Не знаю, как вам удается получить битрейт из file cmd, но я не знаю ..

$: file 01\ -\ Trolleyed.flac
01 - Trolleyed.flac: FLAC audio bitstream data, 24 bit, stereo, 17842272 samples

$: file 01\ -\ Autumn\ Leaves.mp3
01 - Autumn Leaves.mp3: Audio file with ID3 version 2.4.0

В любом случае, вдохновленный этим постом, я нашел решение, которое требует внешнего инструмента (в данном случае mediainfo). Это не так привлекательно и сексуально, мне бы это понравилось, но это работает.

find . -type f -regextype posix-extended -regex '.*\.(flac|ape|wa?v|m(p3|4a))' -exec sh -c 'for x; do export BITRATE=$(mediainfo --inform="Audio;%BitRate%" "$x"); if [ $BITRATE = 320000 ]; then echo "$x"; fi; done' _ {} +

Здесь оператор then просто повторяет имя файла, но может быть заменен на что-то еще.

С Рождеством всех вас ..

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .