我有一个包含大约 350 张图像的文件夹(它们是扫描的食谱)。为了更容易找到它们,我用 bash shell 脚本编写了一个搜索程序。我在 Mac OS X 10.8 Mountain Lion 上有 bash 版本 3.2。
我的程序的基本思想:
- 向用户询问搜索词(使用 osascript)。
- 使用 mdfind 在文件(名称)中搜索搜索词。
- 将匹配的文件发送到 ln(通过 xargs)。
- 在“结果”目录中创建匹配文件的硬链接。此目录包含在同一图像文件夹中(此目录在程序开始时被清理)。
目录的样子:
+Recipes
-files
-files
-files
+.search
-search (shell script)
+results
-links
-links
这是我的代码:
#!/bin/bash
#
# Search program for recipes.
# version 2
# Clean out results folder
rm -rf ~/Google\ Drive/Recipes/.search/results/*
# Display the search dialog
query=$(osascript <<-EOF
set front_app to (path to frontmost application as Unicode text)
tell application front_app to get text returned of (display dialog "Search for:" default answer "" with title "Recipe Search")
EOF)
# If query is empty (nothing was typed), exit
if [ "$query" = "" ]
then
exit
fi
echo "Searching for \"$query\"."
# Search for query and (hard) link. The output from 'ln -v' is stored in results
# 'ln' complains if you search for the same thing twice... mdfind database lagging?
results=$(mdfind -0 -onlyin ~/Google\ Drive/Recipes/ "$query" | xargs -0 -J % ln -fv % ~/Google\ Drive/Recipes/.search/results)
if [ "$results" ]
then
# Results were found, open the folder
open ~/Google\ Drive/Recipes/.search/results/
else
# No results found, display a dialog
osascript <<-EOF
beep
set front_app to (path to frontmost application as Unicode text)
tell application front_app to display dialog "No results found for \"" & "$query" & "\"." buttons "Close" default button 1 with icon 0
EOF
fi
它工作得很好——第一次。如果你搜索相同的东西两次,它就会中断。
解释:假设我搜索“鸡”。34 个文件匹配,并在结果目录中建立硬链接。
现在,我再次运行程序,并搜索相同的东西——“鸡”。目录被清空(按rm
)。但是现在,查找/链接停止工作——只有 6 或 7 个食谱将被链接。似乎正在发生的事情是mdfind
在搜索目录中找到结果,在它们被删除之后,然后ln
无法建立链接。但它没有找到主要文件......我明白了
ln: ~/Google Drive/Recipes/.search/results/recipe.jpg: no such file or directory
我查看了用于创建符号链接的 mdfind 未按预期工作;他们有类似的问题(但没有帮助)。
感谢您的帮助...这一直困扰着我很长时间。