find:ファイルが指定されていない場合は何もしません。

find:ファイルが指定されていない場合は何もしません。

find特定のファイル名に対してuseを呼び出したいと思います。

find $(do_something to find filenames) -print0 | xargs -r0 ls -ld

何も返されないと中断されます$(do_something to find filenames)。 find コマンドは再帰検索を開始します。

引数として明示的なファイル名/ディレクトリ名なしでfindに何もしないように指示する方法はありますか?

答え1

それでzsh私はそうします:

files=($(do_something to find filenames))
(($#files)) && find $files ...

そしてtcsh

set files=(`do_something to find filenames`)
if ($#files) find $files:q ...

bash、またはmkshksh93

set -f; files=($(do_something to find filenames))
((${#files[@]})) && find "${files[@]}" ...

POSIX的に:

set -f; set -- $(do_something to find filenames)
[ "$#" -gt 0 ] && find "$@" ...

(Bashや他のPOSIXシェルでは$(...)分割($IFSデフォルトでは空白、タブ、および改行)を実行しますが、結果の単語にはワイルドカードも実行します。ここでは必要ではないと予想されるため)set -f。 rc、es...)にはこの問題はありません)。

答え2

こうすればどうでしょうか?

paths=$(do_something to find filenames)
if [ "$paths" ]; then
    find "$paths" ...
fi

これはfind実装には関係ありません。

複数のパス名を使用するとfind "$paths"問題が発生する可能性があります。パス名にスペースが含まれていない場合は、次を使用できます。find $pathsそれ以外の場合は、次の関数を使用できます。

dofind() {
    set -f
    set -- $(do_something to find filenames)
    if [ $# -gt 0 ]; then
        find "$@" ...
    fi
    set +f
}

ファイルグロービングを無効にしてからset --シェル引数ベクトルを設定するために使用されます。これはすべてのPOSIXシェルで機能します。

答え3

次のように存在しない追加のディレクトリを提供することでfind起動できます。

find " " $(do_something to find filenames) -print0 | xargs -r0 ls -ld

これをきれいにするために、ドロップfindのエラー出力は次のようになります。

find " " $(do_something to find filenames) -print0 2>/dev/null | xargs -r0 ls -ld

(しかし、別のエラーが発生した場合は気付かないでしょう...)。

do_something to find filenamesファイル名を出力するとfind苦情が表示されますが、" "残りのコマンドラインは引き続き処理されます。ファイル名が出力されない場合は、再度find文句を" "言いますが、デフォルトは追加されません.

答え4

zsh(そしてBourneから派生していないほとんどのシェルから)、いつ(またはみんなシェルによって異なります)全体的な状況拡張しないと、コマンドは中断されます。

$(do_something to find filenames)globではありませんが、次にglob修飾子を追加してglobにすることができますzsh

 find $(do_something to find filenames)(#q) -print0...

上記では(#q)(空のglob修飾子なので他の操作は実行しません)、出力分割の最後の単語に追加されるため、コマンドが出力をdo_something to find filenames生成しないか空白の場合、コマンドは中断されますが、最後の単語(および最後の単語のみ)は既存のパスとして解決されませんではありません。これを分割で生成されたすべての単語に適用できます。したがって、これらの単語のいずれかが既存のファイルに解析されない場合、コマンドは中断されます。

 find ${^$(do_something to find filenames)}(#q) -print0...

関連情報