Last active
September 24, 2019 21:56
-
-
Save ytomino/7d72c16aa51aa032850f8876db78222a to your computer and use it in GitHub Desktop.
cd to the result of mdfind (Spotlight) / baloosearch
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function mdcd { | |
local OPTARG OPTIND REPLY | |
local opt list dryrun query a s len home i ilen ihome | |
# switches | |
list= | |
dryrun= | |
OPTIND= | |
while getopts "ln" opt; do | |
case $opt in | |
l) list=1 ;; | |
n) dryrun=1 ;; | |
esac | |
done | |
shift $(( $OPTIND - 1 )) | |
# query | |
declare -a F | |
query="(kMDItemDisplayName == '$1' || kMDItemFSName == '$1') && kMDItemContentTypeTree == 'public.directory'" | |
while IFS= read -r -d ''; do a+=( "$REPLY" ); done \ | |
< <( mdfind -0 "$query" ) | |
# select | |
s= | |
len=0 | |
home= | |
for i in "${a[@]}"; do | |
[[ -z "$i" ]] && continue | |
ilen=${#i} | |
ihome= | |
[[ -n $list ]] && echo "$i" | |
[[ ${i:0:${#HOME}} == $HOME ]] && ihome=1 | |
[[ -n $home && -z $ihome ]] && continue | |
if [[ -z "$s" || $ilen -lt $len ]]; then | |
s="$i" | |
len=$ilen | |
home=$ihome | |
fi | |
done | |
# finish | |
if [[ -z "$s" ]]; then | |
echo "mdcd: no such file or directory: $1" > /dev/stderr | |
return 1 | |
else | |
[[ -n $list ]] && return 0 | |
[[ -n $dryrun ]] && echo "$s" && return 0 | |
cd "$s" | |
fi | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
function mdcd { | |
local OPTARG OPTIND REPLY | |
local opt list dryrun query a s len home i ilen ihome | |
# switches | |
list= | |
dryrun= | |
OPTIND= | |
while getopts "ln" opt; do | |
case $opt in | |
l) list=1 ;; | |
n) dryrun=1 ;; | |
esac | |
done | |
shift $(( $OPTIND - 1 )) | |
# query | |
declare -a F | |
query="filename:'$1'" | |
while IFS= read -r; do a+=( "$REPLY" ); done \ | |
< <( baloosearch -t folder "$query" 2> /dev/null ) | |
# select | |
s= | |
len=0 | |
home= | |
for i in "${a[@]}"; do | |
[[ -z "$i" ]] && continue | |
[[ "${i##/*/}" != "$1" ]] && continue # exact match | |
ilen=${#i} | |
ihome= | |
[[ -n $list ]] && echo "$i" | |
[[ ${i:0:${#HOME}} == $HOME ]] && ihome=1 | |
[[ -n $home && -z $ihome ]] && continue | |
if [[ -z "$s" || $ilen -lt $len ]]; then | |
s="$i" | |
len=$ilen | |
home=$ihome | |
fi | |
done | |
# finish | |
if [[ -z "$s" ]]; then | |
echo "mdcd: no such file or directory: $1" > /dev/stderr | |
return 1 | |
else | |
[[ -n $list ]] && return 0 | |
[[ -n $dryrun ]] && echo "$s" && return 0 | |
cd "$s" | |
fi | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment