Mac OS xargs combinan argumentos originales con nuevos argumentos

Mac OS xargs combinan argumentos originales con nuevos argumentos

Puedo enumerar archivos de audio con la ruta completa: (usando '-onlyin' para realizar pruebas)

$ 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

También puedo obtener la profundidad de bits y la frecuencia de muestreo ejecutando mdls como argumento en 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

Si agrego kMDItemFSName al mdls puedo obtener el nombre del archivo junto con la profundidad de bits y la frecuencia de muestreo, pero pierdo la ruta:

$ 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

Quiero buscar audio en varios directorios (omitiré '-onlyin' cuando lo implemente). ¿Cómo enumero la ruta completa con profundidad de bits y frecuencia de muestreo... así?

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

Respuesta1

Utilicé gfind (brew install findutils) para lograr algo similar a lo anterior:

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

Respuesta2

Llame a un breve script en línea desde 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

El bucle recibe lotes de nombres de rutas encontrados desde mdfind. Para cada nombre de ruta, mdlsse utiliza para extraer los dos atributos que le interesan, y los valores de estos se imprimen junto con el nombre de ruta mismo usando printf.

O intente usar el kMDItemPathatributo, que le permitiría llamar mdlssolo una vez por nombre de ruta:

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

información relacionada