Never been to CodeSnippets before?

Snippets is a public source code repository. Easily build up your personal collection of code snippets, categorize them with tags / keywords, and share them with the world (or not, you can keep them private!)

mdlocate

function mdlocate() {  
   if [[ $# -eq 1 ]]; then
      /usr/bin/mdfind "kMDItemDisplayName == '${1}'wc"; 
   elif [[ $# -eq 2 ]]; then
      /usr/bin/mdfind -onlyin "${1}" "kMDItemDisplayName == '${2}'wc"; 
   fi
   return 0
}


function mdlocate0() {  
   if [[ $# -eq 1 ]]; then
      /usr/bin/mdfind -0 "kMDItemDisplayName == '${1}'wc"; 
   elif [[ $# -eq 2 ]]; then
      /usr/bin/mdfind -0 -onlyin "${1}" "kMDItemDisplayName == '${2}'wc"; 
   fi
   return 0
}


# usage: mdlocate [optional: directory] [file name]

mdlocate ~ '*file*' | nl | tail
mdlocate ~ '*file' | nl | tail
mdlocate ~ 'file' | nl | tail


# cf. http://www.imasuper.com/66/technology/flash-cookies-the-silent-privacy-killer/
mdlocate .sol | nl
mdlocate0 .sol | xargs -0 basename
mdlocate ~/Library/Preferences/Macromedia/Flash\ Player/ .sol | nl
mdlocate0 ~/Library/Preferences/Macromedia/Flash\ Player/ .sol | /usr/bin/xargs -0 /usr/bin/srm -v

List the names & version numbers of applications

# lsregister
/usr/bin/sudo /bin/ln -is $(/usr/bin/locate lsregister | /usr/bin/head -n 1) /bin/lsregister 


# first rebuild the Launch Services database
lsregister -kill -r -f -all system,local,user     # Mac OS X 10.5
lsregister -kill -r -f -domain local -domain system -domain user


# print the lines between :path ... version: ...
time -p lsregister -dump | sed -E -n -e '/^.+path: .+\.app$/{N;N;N;p;}' | nl
time -p lsregister -dump | sed -E -n -e '/\.app$/{N;N;N;p;}' | nl

time -p lsregister -dump | sed -E -n -e '/path: .+\.app$/,/version:/p' | nl
time -p lsregister -dump | sed -E -n -e '/\.app$/,/version:/p' | nl

time -p lsregister -dump | egrep -A 3 -i "path: +\/.+\\.app$" | nl


# list application paths with lsregister
time -p lsregister -dump | sed -E -n -e '/path: .+\.app$/,/version:/s/^.+path: +(.+\.app)$/\1/p' | nl
time -p lsregister -dump | sed -E -n -e '/\.app$/,/version:/s/^.+path: +(.+\.app)$/\1/p' | nl

# list application names with lsregister
time -p lsregister -dump | sed -E -n -e '/path: .+\.app$/,/version:/s/^.+path: +\/?.*\/([^\/]+\.app)$/\1/p' | nl
time -p lsregister -dump | sed -E -n -e '/\.app$/,/version:/s/^.+path: +\/?.*\/([^\/]+\.app)$/\1/p' | nl

# list version numbers of applications with lsregister
time -p lsregister -dump | sed -E -n -e '/path: +.+\.app$/,/version/s/^.+version: +(.*)$/\1/p' | nl
time -p lsregister -dump | sed -E -n -e '/\.app$/,/version/s/^.+version: +(.*)$/\1/p' | nl


# list the names & version numbers of applications based on lsregister

function lsvers() {

   if [[ "$1" == '-fp' ]]; then     # full path option

      while read -d $'\n' file; do

         path="${file% -*}"
         lsregister_version="${file##*- }"

         mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${path}" 2>/dev/null | \
            /usr/bin/awk -F '"' '/kMDItemVersion/ {print $2}' 2>/dev/null)"
         #mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${path}" 2>/dev/null | \
         #   /usr/bin/awk -F '"' 'END {print $2}' 2>/dev/null)"

         if [[ -n "$mdls_version" ]]; then
            printf "%s\n" "${path}   --   ${mdls_version}"
         else
            printf "%s\n" "${path}   --   ${lsregister_version}"
         fi

done < <(
/bin/lsregister -dump | /usr/bin/egrep -A 3 '^[[:space:]]+path:[[:space:]]+([^[:space:]].*\.app)$' | \
/usr/bin/sed -E -n -e 's/^[[:space:]]+version:[[:space:]]+(.*)$/\1/p' -e 's/^[[:space:]]+path:[[:space:]]+(\/.*\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n"
)

   else

      while read -d $'\n' file; do

         path="${file% -*}"
         bname="$(/usr/bin/basename "${path}")"
         lsregister_version="${file##*- }"

         mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${path}" 2>/dev/null | \
            /usr/bin/awk -F '"' '/kMDItemVersion/ {print $2}' 2>/dev/null)"

         if [[ -n "$mdls_version" ]]; then
            printf "%s\n" "${bname}   --   ${mdls_version}"
         else
            printf "%s\n" "${bname}   --   ${lsregister_version}"
         fi

done < <(
/bin/lsregister -dump | /usr/bin/egrep -A 3 '^[[:space:]]+path:[[:space:]]+([^[:space:]].*\.app)$' | \
/usr/bin/sed -E -n -e 's/^[[:space:]]+version:[[:space:]]+(.*)$/\1/p' -e 's/^[[:space:]]+path:[[:space:]]+(\/.*\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n"
)

   fi


: <<-'COMMENT'

time -p /bin/lsregister -dump | /usr/bin/egrep -A 3 '^[[:space:]]+path:[[:space:]]+([^[:space:]].*\.app)$' | \
/usr/bin/sed -E -n -e 's/^[[:space:]]+version:[[:space:]]+(.*)$/\1/p' -e 's/^[[:space:]]+path:[[:space:]]+(\/.*\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

# alternatives with sed pattern matching across several lines (here matching the lines containing: path: ... :version ...)

time -p /bin/lsregister -dump | /usr/bin/sed -E -n -e '/path:.+\.app$/,/version:/s/^.+path: +(\/.+\.app)$|^.+version: +(.+)$/\1\2/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

time -p /bin/lsregister -dump | /usr/bin/sed -E -n -e '/path:.+\.app$/,/version:/s/path: +(\/.+\.app)$|version: +(.+)$/\1\2/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

time -p /bin/lsregister -dump | /usr/bin/sed -E -n -e '/\.app$/,/version:/s/path: +(\/.+\.app)$|version: +(.+)$/\1\2/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

COMMENT


return 0

}


lsvers | nl
lsvers | egrep -i system | nl
lsvers -fp | egrep -i system | nl     # print full paths to applications
lsvers -fp | egrep -i '\/[^\/]*system[^\/]*$' | nl     # print full paths to applications


# check
app="VerifiedDownloadAgent.app"
app="Crash Reporter.app"
app="SyncServer.app"
app="SecurityAgent.app"
app="SystemUIServer.app"

lsregister -dump | egrep -A 3 "${app}$"

path="$(lsregister -dump | grep -A 3 "${app}$" | sed -E -n -e 's/^[[:space:]]+path:[[:space:]]+(\/.*\.app)$/\1/p')"
echo "$path"
mdls -name kMDItemVersion "$path"


#-------------------------------------------


# list the names and version numbers of specified applications using lsregister
function appversion() {

/bin/lsregister -dump | /usr/bin/egrep -i -A 3 "^[[:space:]]+path:[[:space:]]+\/?.*\/([^\/]*${@}[^\/]*\\.app)$" | \
/usr/bin/sed -E -n -e 's/^[[:space:]]+version:[[:space:]]+(.*)$/\1/p' -e 's/^[[:space:]]+path:[[:space:]]+\/.*\/([^\/]+\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s   --   %s\n"


: <<-'COMMENT'

set -- System
echo "${@}"

time -p /bin/lsregister -dump | /usr/bin/egrep -i -A 3 "^[[:space:]]+path:[[:space:]]+\/?.*\/[^\/]*${@}[^\/]*\\.app$" | \
/usr/bin/sed -E -n -e 's/^[[:space:]]+version:[[:space:]]+(.*)$/\1/p' -e 's/^[[:space:]]+path:[[:space:]]+\/.*\/([^\/]+\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

# alternatives
time -p /bin/lsregister -dump | /usr/bin/egrep -A 3 -i "path: +\/?.*\/[^\/]*${@}[^\/]*\\.app$" | /usr/bin/sed -E -n \
-e 's/version: +(.*)$/\1/p' -e 's/path: +\/?.*\/([^\/]+\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

time -p /bin/lsregister -dump | /usr/bin/egrep -A 3 -i " +\/?.*\/[^\/]*${@}[^\/]*\\.app$" | /usr/bin/sed -E -n \
-e 's/version: +(.*)$/\1/p' -e 's/path: +\/?.*\/([^\/]+\.app)$/\1/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl


# alternative with sed pattern matching across several lines
# here: matching the lines between: path: ... :version ...

time -p /bin/lsregister -dump | /usr/bin/egrep -A 3 -i "path: +\/?.*\/[^\/]*${@}[^\/]*\\.app$" | /usr/bin/sed -E -n \
-e '/\.app$/,/version:/s/path: +\/?.*\/([^\/]+\.app)$|version: +(.+)$/\1\2/p' | \
/usr/bin/sed 's/ /\\ /g' | /usr/bin/xargs -n 2 printf "%s - %s\n" | nl

COMMENT

return 0
}


appversion mail
appversion finder
appversion safari

appversion system
appversion uiserver
appversion server
appversion window


#----------------------------------------------------------------------


# list names & mdls version numbers of applications (based on mdfind & com.apple.application-bundle)
function lsmdvers() {

   if [[ "$1" == '-fp' ]]; then     # full path option

      while read -d $'\000' file; do

         mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${file}" 2>/dev/null | \
            /usr/bin/awk -F '"' '/kMDItemVersion/ {print $2}' 2>/dev/null)"

         if [[ -n "$mdls_version" ]]; then
            printf "%s\n" "${file}   --   ${mdls_version}"
         else
            printf "%s\x21\n" "${file}   --   No mdls version number specified"
         fi

      done < <(/usr/bin/mdfind -0 'kMDItemContentTypeTree == "com.apple.application-bundle"wc')

   else

      while read -d $'\000' file; do

         bname="$(/usr/bin/basename "${file}")"

         mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${file}" 2>/dev/null | \
            /usr/bin/awk -F '"' '/kMDItemVersion/ {print $2}' 2>/dev/null)"

         if [[ -n "$mdls_version" ]]; then
            printf "%s\n" "${bname}   --   ${mdls_version}"
         else
            printf "%s\x21\n" "${bname}   --   No mdls version number specified"
         fi

      done < <(/usr/bin/mdfind -0 'kMDItemContentTypeTree == "com.apple.application-bundle"wc')

   fi

   return 0

}


lsmdvers | nl
lsmdvers -fp | nl    # print full paths to applications

lsmdvers | grep -i system | nl && echo && lsvers | grep -i system | nl



# list the names and version numbers of specified applications using mdfind & com.apple.application-bundle
function appmdversion() {

   if [[ "$1" == '-fp' ]]; then     # full path option

      while read -d $'\000' file; do

         mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${file}" 2>/dev/null | \
            /usr/bin/awk -F '"' '/kMDItemVersion/ {print $2}' 2>/dev/null)"

         if [[ -n "$mdls_version" ]]; then
            printf "%s\n" "${file}   --   ${mdls_version}"
         else
            printf "%s\x21\n" "${file}   --   No mdls version number specified"
         fi

      done < <(/usr/bin/mdfind -0 "kMDItemContentTypeTree == 'com.apple.application-bundle'wc && kMDItemDisplayName == '*${2:-*}*'wc")

   else

      while read -d $'\000' file; do

         bname="$(/usr/bin/basename "${file}")"

         mdls_version="$(/usr/bin/mdls -name kMDItemVersion "${file}" 2>/dev/null | \
            /usr/bin/awk -F '"' '/kMDItemVersion/ {print $2}' 2>/dev/null)"

         if [[ -n "$mdls_version" ]]; then
            printf "%s\n" "${bname}   --   ${mdls_version}"
         else
            printf "%s\x21\n" "${bname}   --   No mdls version number specified"
         fi

      done < <(/usr/bin/mdfind -0 "kMDItemContentTypeTree == 'com.apple.application-bundle'wc && kMDItemDisplayName == '*${@:-*}*'wc")

   fi

   return 0

}


appmdversion play | nl
appmdversion -fp play | nl   # print full paths to applications

appversion play && echo && appmdversion play


#----------------------------------------------------


# experimental

function cmdversion() {

declare cmd last_modified vers

while [ $# -gt 0 ]; do

   cmd="$(/usr/bin/which ${1})"   # get the full cmd path

   # cmd was not found in $PATH
   if [[ -n "$(echo "$cmd" | /usr/bin/egrep "^no +${1} +in ")" ]]; then echo; echo "${cmd}"; echo; shift; continue; fi
   #if [[ -n "$(echo "$cmd" | /usr/bin/egrep '^no +[^[:space:]]+ +in ')" ]]; then echo; echo "${cmd}"; echo; shift; continue; fi


   # handle special cases such as ls, echo, ...
   if [[ "${1##*/}" == "ls" ]] || [[ "${1##*/}" == "echo" ]] || [[ "${1##*/}" == "getopt" ]]; then
      vers="$(/usr/bin/egrep -ao '(.{0,10}[Vv]ersion:? +"?[\.\_[:digit:]]+"?.{0,15}|.{0,10}[Vv]\.? +"?[\.\_[:digit:]]+"?.{0,15})' "${cmd}")"
      last_modified="$(/usr/bin/stat -f $'last modified:   %Sm\n' "${cmd}")"
      #printf "\e[1m%s\e[m (guess):\n%s\n" "${cmd}" "${vers}"
      printf "\e[1m%s\e[m (guess):\n%s\n%s\n" "${cmd}" "${vers}" "${last_modified}"
      shift
      continue
   fi

   if [[ "${1##*/}" == "python" ]]; then
      vers="$(${cmd} -V 2>&1)"
      printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${vers}"
      shift
      continue
   fi

   # cases that require sudo
   if [[ "${1##*/}" == "fibreconfig" ]]; then
      vers="$(/usr/bin/sudo ${cmd} --version 2>&1)"
      printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${vers}"
      shift
      continue
   fi


   if [[ -n "$(${cmd} --version 2>/dev/null)" ]]; then
      vers="$(${cmd} --version)"
      printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${vers}"

   elif [[ -n "$(${cmd} -version 2>/dev/null)" ]]; then
      vers="$(${cmd} -version)"
      printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${vers}"

   elif [[ -n "$(${cmd} --version 2>&1 | /usr/bin/egrep -ao '([Vv]ersion:? *"?[\.\_[:digit:]]+"?|[Vv]\.? +"?[\.\_[:digit:]]+"?)')" ]]; then
      vers="$(${cmd} --version 2>&1)"
      printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${vers}"

   elif [[ -n "$(${cmd} -version 2>&1 | /usr/bin/egrep -ao '([Vv]ersion:? *"?[\.\_[:digit:]]+"?|[Vv]\.? +"?[\.\_[:digit:]]+"?)')" ]]; then
      vers="$(${cmd} -version 2>&1)"
      printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${vers}"

   elif [[ -n "$(/usr/bin/egrep -ao '([Vv]ersion:? +"?[\.\_[:digit:]]+"?|[Vv]\.? +"?[\.\_[:digit:]]+"?)' "${cmd}" 2>/dev/null) 2>/dev/null)" ]]; then
      vers="$(/usr/bin/egrep -ao '(.{0,10}[Vv]ersion:? +"?[\.\_[:digit:]]+"?.{0,15}|.{0,10}[Vv]\.? +"?[\.\_[:digit:]]+"?.{0,15})' "${cmd}")"
      #vers="$(/usr/bin/egrep -ao '(.{0,30}[Vv]ersion:? +"?[\.\_[:digit:]]+"?.{0,30}|.{0,30}[Vv]\.? +"?[\.\_[:digit:]]+"?.{0,30})' "${cmd}")"
      #vers="$(/usr/bin/egrep -ao '([Vv]ersion:? +"?[\.\_[:digit:]]+"?|[Vv]\.? +"?[\.\_[:digit:]]+"?)' "${cmd}")"

      last_modified="$(/usr/bin/stat -f $'last modified:   %Sm\n' "${cmd}")"

      if [[ -z "${vers}" ]]; then 
         printf "\e[1m%s\e[m:\n%s\n" "${cmd}" "${last_modified}"
         shift
         continue
      fi

      #printf "\e[1m%s\e[m (guess):\n%s\n" "${cmd}" "${vers}"
      printf "\e[1m%s\e[m (guess):\n%s\n%s\n" "${cmd}" "${vers}" "${last_modified}"

   fi

   shift

done

return 0
}


cmdversion bash
cmdversion /bin/bash

cmdversion sh java sed ls echo printf tr

cmdversion rm srm rmdir unlink kill killall

cmdversion read stat chown w tcl tk getopt getopts symlink ln locate

cmdversion chmod cp dd ed ssh

cmdversion bzcat openssl cat open alias uuidgen bc apropos man perl python ruby

cmdversion /sbin/fibreconfig


#-----------------------------------------------


# list the version numbers of dynamically loaded kernel extensions
man kextstat   
/usr/sbin/kextstat | /usr/bin/sed -E -n -e 's/^([[:space:]]+[^[:space:]]+){5}[[:space:]]+([^[:space:]]+)[[:space:]]+\(([^[:space:]]+)\).*$/\2  --  \3/p'

Searching with grep & Spotlight's kMDItemDisplayName


# search for a file or folder (path) name that contains the specified search string
mdfind 'kMDItemDisplayName == "*apple*"wc'
mdfind -0 'kMDItemDisplayName == "*apple*"wc' | xargs -0 basename
mdfind -0 'kMDItemDisplayName == "*apple*"wc' | xargs -0 basename | grep Apple
mdfind -0 -onlyin ~/Desktop 'kMDItemDisplayName == "*apple*"wc' | xargs -0 basename
mdfind '*==*' | grep -i apple
mdfind '*==*' | grep -i -E '/[^/]*apple[^/]*$'
mdfind '*==*' | grep -i -E '/[^/]*apple[^/]*$' | while read filename; do basename "$filename"; done



# the following is an example of bash process substitution
# http://wooledge.org:8000/BashFAQ (FAQ 20 & 24)
# http://wooledge.org:8000/ProcessSubstitution

# read matched file names into an array

unset -v ar i
dir="$HOME/Desktop"
mdfind_search="'*search_string*'wc"
mdfind_search="\"*search_string*\"wc"   # alternative

while read -d $'\0' filename; do 
   ar[i++]="$filename"
done < <(mdfind -0 -onlyin ${dir} "kMDItemDisplayName == ${mdfind_search}")

echo ${ar[*]}; echo; echo ${ar[0]}; echo ${ar[1]}; echo



# let mdfind & kMDItemDisplayName search for the fixed part of the search string, and grep for the variable one
# read the matched file names into an array

unset -v ar i
dir="$HOME/Desktop"
mdfind_search="'*search_string*'wc"
grep_search="[0-5]"

while read -d $'\0' filename; do
   #if [[ -n $(echo "$filename" | grep -Eos -m1 "$grep_search") ]]; then     # match entire path name with grep
   if [[ -n $(basename "$filename" | grep -Eos -m1 "$grep_search") ]]; then     # match last part of path name with grep
      #ar[i++]="$filename"
      ar[i++]="$(basename "$filename")"
   fi 
done < <(mdfind -0 -onlyin ${dir} "kMDItemDisplayName == ${mdfind_search}") 

echo ${ar[*]}; echo; echo ${ar[0]}; echo ${ar[1]}; echo



# To search only for files add: 'kMDItemKind != "Folder" && ...'

unset -v ar i
dir="$HOME/Desktop"
mdfind_search="'*search_string*'wc"
grep_search="[0-5]"

item1="'*text*'wc"
item2="'*document*'wc"
item3="'*source*'wc"

while read -d $'\0' filename; do
   #if [[ -n $(echo "$filename" | grep -Eos -m1 "$grep_search") ]]; then 
   if [[ -n $(basename "$filename" | grep -Eos -m1 "$grep_search") ]]; then 
      #ar[i++]="$filename"
      ar[i++]="$(basename "$filename")"
   fi 
done < <(mdfind -0 -onlyin ${dir} "kMDItemKind != 'Folder' && kMDItemDisplayName == ${mdfind_search}"); 
#done < <(mdfind -0 -onlyin ${dir} "( kMDItemKind != 'Folder' && ( kMDItemKind == ${item1} || kMDItemKind == ${item2} || kMDItemKind == ${item3}) ) && kMDItemDisplayName == ${mdfind_search}"); 

echo ${ar[*]}; echo; echo ${ar[0]}; echo ${ar[1]}; echo



# To search only for folders add: 'kMDItemKind == "Folder" && ...'

unset -v ar i
dir="$HOME/Desktop"
mdfind_search="'*search_string*'wc"
grep_search="[0-5]"

while read -d $'\0' filename; do
   #if [[ -n $(echo "$filename" | grep -Eos -m1 "$grep_search") ]]; then 
   if [[ -n $(basename "$filename" | grep -Eos -m1 "$grep_search") ]]; then 
      #ar[i++]="$filename"
      ar[i++]="$(basename "$filename")"
   fi 
done < <(mdfind -0 -onlyin ${dir} "kMDItemKind == 'Folder' && kMDItemDisplayName == ${mdfind_search}"); 

echo ${ar[*]}; echo; echo ${ar[0]}; echo ${ar[1]}; echo

grep-based phrase search with Spotlight

Some examples:


# for mdfind "phrase* " and "phrase! " also work, but not "phrase ! "
mdfind -0 -onlyin ~ "phrase This is a" | xargs -0 grep -ails -E 'This is a phrase!'

mdfind -0 "It's just $8.99!" | xargs -0 grep -ails -E "It's just \\\$8\\.99\\!"

mdfind -0 'Fr\303\251d\303\251ric Chopin' | xargs -0 grep -ails -Z -E 'Fr.d.ric Chopin' | xargs -0 basename

Regex-based file/folder search with Spotlight

To get more Spotlight search options use the commands mdimport -A and mdls file.txt in Terminal.app.


mdfind -onlyin ~ "*==*" | grep -i -E 'part.*of.*name'

mdfind -onlyin ~ 'kMDItemContentType == "text"wc' | grep -i -E '.*\.txt$'
#mdfind -onlyin ~ '*==* && kMDItemContentType == "text"wc' | grep -i -E '.*\.txt$'

mdfind -onlyin ~ 'kMDItemKind == "Folder"' | grep -i -E '.*photos.*[0-5]'