Mac OS xargs kombinieren ursprüngliche Argumente mit neuen Argumenten

Mac OS xargs kombinieren ursprüngliche Argumente mit neuen Argumenten

Ich kann Audiodateien mit dem vollständigen Pfad auflisten: (zum Testen verwende ich „-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

Ich kann die Bittiefe und Abtastrate auch ermitteln, indem ich mdls als Argument in xargs ausführe:

$ 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

Wenn ich kMDItemFSName zu den MDLS hinzufüge, kann ich den Dateinamen zusammen mit der Bittiefe und der Abtastrate abrufen, aber ich verliere den Pfad:

$ 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

Ich möchte in mehreren Verzeichnissen nach Audiodaten suchen (bei der Bereitstellung werde ich „-onlyin“ weglassen). Wie liste ich den vollständigen Pfad mit Bittiefe und Abtastrate auf … etwa so:

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

Antwort1

Ich habe gfind (brew install findutils) verwendet, um ein ähnliches Ergebnis wie oben zu erzielen:

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

Antwort2

Rufen Sie ein kurzes Inline-Skript auf von 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

Die Schleife empfängt Stapel gefundener Pfadnamen von mdfind. Für jeden Pfadnamen mdlswerden die beiden Attribute extrahiert, die Sie interessieren, und deren Werte werden zusammen mit dem Pfadnamen selbst mithilfe von ausgedruckt printf.

Oder versuchen Sie es mit dem Attribut, das Ihnen nur einen Aufruf pro Pfadnamen kMDItemPatherlaubt :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

verwandte Informationen