362 lines
16 KiB
Text
362 lines
16 KiB
Text
#compdef mdfind
|
|
|
|
|
|
|
|
# Author: W. G. Scott
|
|
# Revised for 10.5 on Jan 22 2009
|
|
# July 5 2005
|
|
# for Mac OS X v. 10.4 and above
|
|
|
|
# set -x
|
|
|
|
# Use a new version for 10.5 and above:
|
|
|
|
if [[ $(uname) == Darwin && $(sw_vers -productVersion) < 10.5 ]]; then
|
|
|
|
|
|
|
|
# Old version of completion function for OS X 10.4:
|
|
_mdfind () {
|
|
|
|
########################################################################################################
|
|
# These have to be put in the environment file to work the first time
|
|
#
|
|
zmodload zsh/complist 2>/dev/null
|
|
zstyle ':completion:*' menu select=10
|
|
zstyle ':completion:*' list-prompt '%S -- more -- %s'
|
|
zstyle ':completion:*' group-name ''
|
|
|
|
#########################################################################################################
|
|
# SYNOPSIS mdfind [-0] [-live] [-onlyin directory] query
|
|
#
|
|
# -0 Prints an ASCII NUL character after each result path. This
|
|
# is useful when used in conjunction with xargs -0.
|
|
#
|
|
# -live Causes the mdfind command to provide live-updates to the num-
|
|
# ber of files matching the query. When an update causes the
|
|
# query results to change the number of matches is updated.
|
|
# The find can be cancelled by typing ctrl-C.
|
|
#
|
|
# -onlyin dir
|
|
# Limit the scope of the search to the directory specified.
|
|
#
|
|
# example:
|
|
# mdfind -onlyin /Applications -onlyin /Developer "kMDItemContentType == 'com.apple.application-*'"
|
|
|
|
########################################################################################################
|
|
|
|
_arguments -C \
|
|
'-gui[use GUI menu of completions]: :->usethegui'\
|
|
'-0[used in conjunction with xargs -0]'\
|
|
'-live[live updates in search]'\
|
|
'-onlyin[specify the Directory]: :->mdsearchpath'\
|
|
'*: :->mdsearchstring'
|
|
|
|
####################################################################################
|
|
# These functions are for "mdsearchstring"
|
|
|
|
# This function corresponds to simply entering any unrestricted string.
|
|
# There isn't anything to complete, but we need to add a space to get it to
|
|
# work right. (The _nothing fuction I would think should work, but it doesn't.)
|
|
|
|
function _stringquery {
|
|
compadd -X %B' i.e., type in your search string at the prompt, %b' " "
|
|
#_message "Now type in your search string,"
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
# This function generates a template for a search that is to be confined to a specified
|
|
# metadata attribute. It uses mdimport -A to find the list of possibilities, and then
|
|
# generates a template as the completion. It terminates with a single and double quote.
|
|
# The quoting structure is important.
|
|
|
|
function _querycomp {
|
|
compadd -X %B' or select one of the metadata attributes for searching from the menu below %b' \
|
|
-Q -P \" -p kMDItem -S " == '*YourSearchStringGoesHere*'\"" $(/usr/bin/mdimport -A | awk '{print $1}' | \
|
|
perl -p -e "s;('|kMDItem);;g" )
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
# If we want to add a second metadata search template, we have to first remove the
|
|
# trailing double quote that follows the single quote generated by _querycomp
|
|
|
|
function _chomp { BUFFER=${BUFFER/\'\"/\'} } #'
|
|
|
|
########################################################################################
|
|
|
|
# This function first calls _chomp to chomp off the double quote, and then it appends the
|
|
# Boolean AND operator (&&) and then the second template, which closes with a single and
|
|
# then double quote. Any number of these can be added recursively, thanks to putting the
|
|
# _chomp function at the beginning.
|
|
|
|
function _queryandcomp {
|
|
# Boolean and to append a second query
|
|
compadd -R _chomp -X %B'The metadata attributes, below, alternate Boolian AND and OR %b' \
|
|
-Q -P \&\&\ -p kMDItem -S \
|
|
" == '*YourSearchStringGoesHere*'\"" $(/usr/bin/mdimport -A | awk '{print $1}' | \
|
|
perl -p -e "s;('|kMDItem);;g" )
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
# Same as _queryand, except uses the Boolean OR operator (||).
|
|
|
|
function _queryorcomp {
|
|
# Boolean or appends a second query
|
|
compadd -R _chomp -X %B'The metadata attributes, below, alternate Boolian AND and OR %b' \
|
|
-Q -P \|\|\ -p kMDItem -S \
|
|
" == '*YourSearchStringGoesHere*'\"" $(/usr/bin/mdimport -A | awk '{print $1}' | \
|
|
perl -p -e "s;('|kMDItem);;g" )
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
|
|
|
|
####################################################################################
|
|
####################################################################################
|
|
|
|
|
|
|
|
case "$state" in
|
|
|
|
(usethegui)
|
|
_message 'Using Pashua GUI menu: please select a completion category'
|
|
_mdfind_pashua
|
|
|
|
;;
|
|
|
|
(mdsearchstring)
|
|
if [[ $words == *kMDItem* && $words != *gui* ]];then
|
|
_message "Adding another searching criterion ..."
|
|
_alternative _queryandcomp _queryorcomp
|
|
elif [[ $words == *kMDItem* ]];then
|
|
_message "Adding another searching criterion ..."
|
|
_message 'Using Pashua GUI menu: please select a completion category'
|
|
_mdfind_pashua
|
|
else
|
|
_message "Enter any string either by itself or by replacing \"YourStringGoesHere\" in the metadata search template."
|
|
_alternative _stringquery _querycomp
|
|
fi
|
|
;;
|
|
|
|
(mdsearchpath)
|
|
_directories
|
|
_message 'possible search paths: prepend / for root-level directories'
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
|
|
}
|
|
|
|
else
|
|
|
|
# New version of completion function for OS X 10.5 and above:
|
|
|
|
_mdfind () {
|
|
|
|
########################################################################################################
|
|
# These have to be put in the environment file to work the first time
|
|
#
|
|
zmodload zsh/complist 2>/dev/null
|
|
zstyle ':completion:*' menu select=10
|
|
zstyle ':completion:*' list-prompt '%S -- more -- %s'
|
|
zstyle ':completion:*' group-name ''
|
|
|
|
#########################################################################################################
|
|
#
|
|
# SYNOPSIS
|
|
# mdfind [-live] [-count] [-onlyin directory] query
|
|
#
|
|
# DESCRIPTION
|
|
# The mdfind command consults the central metadata store and returns a list of files that match the given
|
|
# metadata query. The query can be a string or a query expression.
|
|
#
|
|
# The following options are available:
|
|
#
|
|
# -0 Prints an ASCII NUL character after each result path. This is useful when used in conjunc-
|
|
# tion with xargs -0.
|
|
#
|
|
# -live Causes the mdfind command to provide live-updates to the number of files matching the
|
|
# query. When an update causes the query results to change the number of matches is updated.
|
|
# The find can be cancelled by typing ctrl-C.
|
|
#
|
|
# -count Causes the mdfind command to output the total number of matches, instead of the path to the
|
|
# matching items.
|
|
#
|
|
# -onlyin dir
|
|
# Limit the scope of the search to the directory specified.
|
|
#
|
|
# -literal Force the provided query string to be taken as a literal query string, without interpreta-
|
|
# tion.
|
|
#
|
|
# -interpret Force the provided query string to be interpreted as if the user had typed the string into
|
|
# the Spotlight menu. For example, the string "search" would produce the following query
|
|
# string:
|
|
# (* = search* cdw || kMDItemTextContent = search* cdw)
|
|
#
|
|
# EXAMPLES
|
|
# The following examples are shown as given to the shell.
|
|
#
|
|
# This returns all files with any metadata attribute value matching the string "image":
|
|
#
|
|
# mdfind image
|
|
#
|
|
# This returns all files that contain "MyFavoriteAuthor" in the kMDItemAuthor metadata attribute:
|
|
#
|
|
# mdfind "kMDItemAuthor == '*MyFavoriteAuthor*'"
|
|
#
|
|
# This returns all files with any metadata attribute value matching the string "skateboard". The find
|
|
# continues to run after gathering the initial results, providing a count of the number of files that
|
|
# match the query.
|
|
#
|
|
# mdfind -live skateboard
|
|
#
|
|
# relevant example:
|
|
#
|
|
# mdfind -onlyin /Applications -onlyin /Developer "kMDItemContentType == 'com.apple.application-*'"
|
|
|
|
########################################################################################################
|
|
|
|
|
|
_arguments -C \
|
|
'-0[used in conjunction with xargs -0]: :->supply_pattern'\
|
|
'-s[show contents of smart folder <name>]: :->savedSearch'\
|
|
'-count[output total number of matches]: :->supply_pattern' \
|
|
'-interpret[user-friendly Spotlight string query]: :->supply_pattern'\
|
|
'-literal[force over-rides interpret]: :->mdsearchstring'\
|
|
'-live[live updates in search]: :->supply_pattern'\
|
|
'-onlyin[specify the Directory]: :->mdsearchpath'\
|
|
'*: :->supply_pattern_or_option'
|
|
|
|
|
|
# '*:pattern: '
|
|
|
|
|
|
####################################################################################
|
|
# This function is for "savedSearch"
|
|
|
|
function _SavedSearches {
|
|
compadd \
|
|
"${(f)"$( command ls ~/Library/Saved\ Searches/**/*.savedSearch | perl -p -e "s|$HOME/Library/Saved\ Searches/||g",'s|.savedSearch||g' )"}"
|
|
}
|
|
|
|
|
|
####################################################################################
|
|
# These functions are for "mdsearchstring"
|
|
|
|
# This function corresponds to simply entering any unrestricted string.
|
|
# There isn't anything to complete, but we need to add a space to get it to
|
|
# work right. (The _nothing fuction I would think should work, but it doesn't.)
|
|
|
|
function _stringquery {
|
|
compadd -X %B' i.e., type in your search string at the prompt, %b' " "
|
|
#_message "Now type in your search string,"
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
# This function generates a template for a search that is to be confined to a specified
|
|
# metadata attribute. It uses mdimport -A to find the list of possibilities, and then
|
|
# generates a template as the completion. It terminates with a single and double quote.
|
|
# The quoting structure is important.
|
|
|
|
function _querycomp {
|
|
compadd -X %B' or select one of the metadata attributes for searching from the menu below %b' \
|
|
-Q -P \" -p kMDItem -S " == '*YourSearchStringGoesHere*'\"" $(/usr/bin/mdimport -A | awk '{print $1}' | \
|
|
perl -p -e "s;('|kMDItem);;g" )
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
# If we want to add a second metadata search template, we have to first remove the
|
|
# trailing double quote that follows the single quote generated by _querycomp
|
|
|
|
function _chomp { BUFFER=${BUFFER/\'\"/\'} } #'
|
|
|
|
########################################################################################
|
|
|
|
# This function first calls _chomp to chomp off the double quote, and then it appends the
|
|
# Boolean AND operator (&&) and then the second template, which closes with a single and
|
|
# then double quote. Any number of these can be added recursively, thanks to putting the
|
|
# _chomp function at the beginning.
|
|
|
|
function _queryandcomp {
|
|
# Boolean and to append a second query
|
|
compadd -R _chomp -X %B'The metadata attributes, below, alternate Boolian AND and OR %b' \
|
|
-Q -P \&\&\ -p kMDItem -S \
|
|
" == '*YourSearchStringGoesHere*'\"" $(/usr/bin/mdimport -A | awk '{print $1}' | \
|
|
perl -p -e "s;('|kMDItem);;g" )
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
# Same as _queryand, except uses the Boolean OR operator (||).
|
|
|
|
function _queryorcomp {
|
|
# Boolean or appends a second query
|
|
compadd -R _chomp -X %B'The metadata attributes, below, alternate Boolian AND and OR %b' \
|
|
-Q -P \|\|\ -p kMDItem -S \
|
|
" == '*YourSearchStringGoesHere*'\"" $(/usr/bin/mdimport -A | awk '{print $1}' | \
|
|
perl -p -e "s;('|kMDItem);;g" )
|
|
}
|
|
|
|
########################################################################################
|
|
|
|
|
|
|
|
####################################################################################
|
|
####################################################################################
|
|
|
|
|
|
|
|
case "$state" in
|
|
|
|
(mdsearchstring)
|
|
if [[ $words == *kMDItem* && $words != *gui* ]];then
|
|
_message "Adding another searching criterion ..."
|
|
_alternative _queryandcomp _queryorcomp
|
|
elif [[ $words == *kMDItem* ]];then
|
|
_message "Adding another searching criterion ..."
|
|
_message 'Using Pashua GUI menu: please select a completion category'
|
|
_mdfind_pashua
|
|
else
|
|
_message "Enter any string either by itself or by replacing \"YourStringGoesHere\" in the metadata search template."
|
|
_alternative _stringquery _querycomp
|
|
fi
|
|
;;
|
|
|
|
(mdsearchpath)
|
|
_directories
|
|
_message 'possible search paths: prepend / for root-level directories'
|
|
;;
|
|
|
|
(savedSearch)
|
|
_SavedSearches
|
|
_message 'possible Saved Searches in $HOME/Library/Saved\ Searches'
|
|
;;
|
|
|
|
(supply_pattern)
|
|
_message "Enter any string you would supply to SpotLight."
|
|
;;
|
|
|
|
|
|
(supply_pattern_or_option)
|
|
_message "Enter \"-<tab>\" to choose an option, or simply type any string you would supply to SpotLight."
|
|
;;
|
|
|
|
esac
|
|
|
|
|
|
}
|
|
|
|
fi # Test OS X 10.5 or above
|
|
|
|
_mdfind "$@"
|
|
|
|
|
|
|