Bash
解析“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
作為下一步,我希望腳本在kMDItemWhereFroms.sh
mdls
的每個輸出上執行(列印與文件關聯的所有元數據屬性的值),也可以通過以下方式手動執行:mdls /Users/swastibhushandeb/Documents/encase_examiner_v710_release_notes.pdf
但是,如果要使此類處理自動化,有哪些可用的 bash 編碼策略/選項可用?如何將輸出定向到 csv 文件,以便每列包含來自
mdls
命令輸出的欄位?
您可以使用
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
)