約 350 枚の画像 (スキャンされたレシピ) のフォルダーがあります。それらを見つけやすくするために、bash シェル スクリプトで検索プログラムを作成しました。Mac OS X 10.8 Mountain Lion で bash バージョン 3.2 を使用しています。
私のプログラムの基本的な考え方:
- ユーザーに検索語を尋ねます (osascript を使用)。
- mdfind を使用して、検索語のファイル (名前) を検索します。
- 一致するファイルを (xargs を介して) ln に送信します。
- 「結果」ディレクトリ内の一致するファイルのハードリンクを作成します。このディレクトリは、画像の同じフォルダ内に含まれています (このディレクトリは、プログラムの開始時に消去されます)。
ディレクトリは次のようになります。
+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
初めてでも問題なく動作します。同じものを 2 回検索すると、壊れます。
説明:「チキン」を検索するとしましょう。34 個のファイルが一致し、結果ディレクトリにハード リンクが作成されます。
ここで、もう一度プログラムを実行して、同じ「chicken」を検索します。ディレクトリが空になります (によってrm
)。しかし、現在、検索/リンクは機能しなくなり、6 つまたは 7 つのレシピのみがリンクされます。起こっているように見えるのは、結果が削除された後mdfind
、検索ディレクトリで結果が見つかり、リンクを作成できないことです。しかし、メインファイルが見つかりません...ln
ln: ~/Google Drive/Recipes/.search/results/recipe.jpg: no such file or directory
期待どおりに機能しないシンボリックリンクの作成に使用される mdfindを見ました。彼らは同様の問題を抱えています(しかし助けはありません)。
助けてくれてありがとう...これは長い間私を悩ませてきました。