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
、またはmksh
、ksh93
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...