引数で find コマンドを書く

引数で find コマンドを書く

多くの場合、ファイルを見つける必要がありますが、次のようにファイル名が何であるかわかりません。

$ 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[@]}"
}

おすすめ記事