Bash

解析“mdls”輸出

  • April 17, 2019

以下腳本接受使用者輸入(已安裝的 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.shmdls的每個輸出上執行(列印與文件關聯的所有元數據屬性的值),也可以通過以下方式手動執行:

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

引用自:https://unix.stackexchange.com/questions/512811