多くの場合、ファイルを見つける必要がありますが、次のようにファイル名が何であるかわかりません。
$ find -iname '*foo*' -o -iname '*bar*' -o -iname '*blah*'
ちょっと退屈です。次のように使いやすいエイリアスを作成したいと思います。
$ findany foo bar blah
私の試みは次のとおりです。
findany() {
args=("-iname" "'*$1*'")
shift
while [ $# -gt 0 ]; do
args+=("-o" "-iname" "'*$1*'")
shift
done
find ${args[@]}
}
問題は、ファイルがすぐそこにあっても結果がまったく生成されないことです。
$ ls
bar.txt blah.txt foo.txt
$ findany foo bar blah
# nothing
echo
コマンドの前に追加すると正しく表示されます。
$ findany foo bar blah
find -iname '*foo*' -o -iname '*bar*' -o -iname '*blah*'
上記の出力をコピーして実行すると正常に動作します。
$ find -iname '*foo*' -o -iname '*bar*' -o -iname '*blah*'
./bar.txt
./foo.txt
./blah.txt
パラメータの分割や引用に関連しているようですが、どのようにデバッグするのかわかりません。
私は主にzshを使用していますが、bashでも同じ動作を確認しました。
ベストアンサー1
あなたは非常に近いです!ただし、何らかの理由でファイル名自体に一重引用符を含めると、一致しません。
また、"${args[@]}"
これが正しく機能するには、見積もりを作成する必要があります。それ以外の場合はトークン化の影響を受け、すべてのglobはfind
表示される前にシェルから拡張されます。
以下を試してみてください(特に場合bash
)。
findany() {
local args=('-iname' "*$1*")
shift
while [ "$#" -gt 0 ]; do
args+=('-o' '-iname' "*$1*")
shift
done
find . "${args[@]}"
}