"mdls"出力の解析

次のスクリプトは、ユーザー入力(マウントされたmacOSボリュームへのパス、たとえば/ Volumes / Macintosh \ HD /)を受け入れます。

#!/bin/bash
# Author: Swasti Bhushan Deb
# macOS 10.13.3
# kMDItemWhereFroms.sh

read -e -p "Enter the full path to the Mounted Volume (e.g /Volume /Macintosh HD):   " path
 var=$(mdfind -name 'kMDItemWhereFroms="*"' -onlyin "$path")
 echo "$var"        

出力:

/Users/swastibhushandeb/Documents/encase_examiner_v710_release_notes.pdf
/Users/swastibhushandeb/Desktop/AirPrint Forensics.pdf

次のステップで、各出力でスクリプトを実行したいmdls(ファイルに関連するすべてのメタデータ属性の値を印刷)。kMDItemWhereFroms.sh、または以下を使用して手動で実行できます。

 mdls /Users/swastibhushandeb/Documents/encase_examiner_v710_release_notes.pdf

しかし、これらの処理を自動化するためにどのようなbashコーディング戦略/オプションを使用できますか?各列にmdlsコマンド出力のフィールドが含まれるように出力をcsvファイルとして指定するにはどうすればよいですか?

ベストアンサー1

mdfind'-0オプションを使用すると、xargs見つかった名前がNUL文字で終わるようにすることができます(したがって、スペース/タブ/改行などを心配する必要はありません)。

read -e -p 'Path? ' path
mdfind -0 -name 'kMDItemWhereFroms="*"' -onlyin "$path" | xargs -0 mdls

出力だけでなく、パス/ファイル名も表示する方がmdls複雑になります。

mdfind -0 -name 'kMDItemWhereFroms="*"' -onlyin "$path" | \
    xargs -0 -n 1 sh -c 'echo "$1" && mdls "$1"' _

_最後は単に構文上の砂糖であり、sh最初の引数(通常はコマンド名)をに割り当てます$0。)

おすすめ記事