Xargs do Mac OS combinam argumento original com novos argumentos

Xargs do Mac OS combinam argumento original com novos argumentos

Consigo listar arquivos de áudio com o caminho completo: (usando '-onlyin' para teste)

$ 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

Também consigo obter a profundidade de bits e a taxa de amostragem executando mdls como argumento em 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

Se eu adicionar kMDItemFSName aos mdls, posso obter o nome do arquivo junto com a profundidade de bits e a taxa de amostragem, mas perco o caminho:

$ 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

Quero procurar áudio em vários diretórios (omitirei '-onlyin' quando implantar). Como faço para listar o caminho completo com profundidade de bits e taxa de amostragem... assim:

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

Responder1

Eu usei gfind (brew install findutils) para obter algo semelhante ao acima:

$ 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)

Responder2

Chame um pequeno script in-line de 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

O loop recebe lotes de nomes de caminhos encontrados de arquivos mdfind. Para cada nome de caminho, mdlsé usado para extrair os dois atributos de seu interesse, e os valores destes são impressos junto com o próprio nome de caminho usando printf.

Ou tente usar o kMDItemPathatributo, que permitiria chamar mdlsapenas uma vez por nome de caminho:

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

informação relacionada