Я могу вывести список аудиофайлов с полным путем: (используя '-onlyin' для тестирования)
$ mdfind -0 -onlyin ~/Music kind:audio | xargs -0 -n 1
/Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1998-04-29_OB07264seg6of6_Z86.wav
/Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1998-04-29_OB07264seg4of6_Z86.wav
/Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1998-04-29_OB07264seg1of6_Z86.wav
/Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1993-11-04_illiteracy_laura_jaeger_jim_latemer_2448.wav
Я также могу получить битовую глубину и частоту дискретизации, запустив mdls в качестве аргумента в xargs:
$ mdfind -0 -onlyin ~/Music kind:audio | xargs -0 mdls -name kMDItemAudioSampleRate -name kMDItemBitsPerSample -raw | xargs -0 -n 2
44100 24
44100 24
44100 24
48000 24
Если я добавлю kMDItemFSName в mdls, я смогу получить имя файла вместе с битовой глубиной и частотой дискретизации, но потеряю путь:
$ mdfind -0 -onlyin ~/Music kind:audio | xargs -0 mdls -name kMDItemAudioSampleRate -name kMDItemBitsPerSample -name kMDItemFSName -raw | xargs -0 -n 3
44100 24 1998-04-29_OB07264seg6of6_Z86.wav
44100 24 1998-04-29_OB07264seg4of6_Z86.wav
44100 24 1998-04-29_OB07264seg1of6_Z86.wav
48000 24 1993-11-04_illiteracy_laura_jaeger_jim_latemer_2448.wav
Я хочу сканировать аудио в нескольких каталогах (я опущу '-onlyin' при развертывании). Как мне указать полный путь с битовой глубиной и частотой дискретизации... например так:
44100 24 /Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1998-04-29_OB07264seg6of6_Z86.wav
44100 24 /Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1998-04-29_OB07264seg4of6_Z86.wav
44100 24 /Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1998-04-29_OB07264seg1of6_Z86.wav
48000 24 /Users/rrasch/Music/iTunes/iTunes Media/Music/Unknown Artist/Unknown Album/1993-11-04_illiteracy_laura_jaeger_jim_latemer_2448.wav
решение1
Я использовал gfind (brew install findutils) для достижения результата, похожего на приведенный выше:
$ gfind /tmp/temp -iname "*.mp4" -printf '\n' -exec ls {} \; -exec mdls -name kMDItemAudioSampleRate -name kMDItemBitsPerSample -raw {} \; | xargs -0 -n 2
/tmp/temp/a.mp4
(null) (null)
/tmp/temp/b.mp4
(null)
(null)
/tmp/temp/c.mp4
(null) (null)
/tmp/temp/d.mp4
(null)
(null)
решение2
Вызов короткого встроенного скрипта из xargs
:
mdfind -0 -onlyin ~/Music kind:audio | xargs -0 sh -c '
for pathname do
printf "%s %s %s\n" \
"$( mdls -name kMDItemAudioSampleRate -raw "$pathname" )" \
"$( mdls -name kMDItemBitsPerSample -raw "$pathname" )" \
"$pathname"
done' sh
Цикл получает пакеты найденных путей из mdfind
. Для каждого пути mdls
используется для извлечения двух интересующих вас атрибутов, а их значения выводятся вместе с самим путем с помощью printf
.
Или попробуйте использовать kMDItemPath
атрибут, который позволит вам вызывать mdls
только один раз для каждого пути:
mdfind -0 -onlyin ~/Music kind:audio | xargs -0 sh -c '
for pathname do
mdls -name kMDItemAudioSampleRate \
-name kMDItemBitsPerSample \
-name kMDItemPath \
-raw "$pathname" | tr "\0" " "
echo
done' sh