bash ファイル名の拡張 (グロビング) には上限がありますか? ある場合、それは何ですか?

bash ファイル名の拡張 (グロビング) には上限がありますか? ある場合、それは何ですか?

bashのファイル名拡張(グロブ)には上限がありますか?ある場合、それは何ですか?グロビングtldp.org で。

ファイルのサブセットに対してコマンドを実行したいとします。

grep -e bar foo*
rm -f bar*

bash が展開するファイルの数に制限はありますか? ある場合、制限は何ですか?

私はそれらの操作を実行するための別の方法(たとえば、 を使用するなど)を探しているわけではありませんfind

答え1

globによって拡張できるファイルの数には制限はありません (使用可能なメモリを除く) bash

しかし、これらのファイルがコマンドの引数として渡されると、処刑された(シェルの組み込み関数や関数とは異なり)、execve()一部のシステムではシステム コールの制限に遭遇する可能性があります。ほとんどのシステムでは、そのシステム コールには渡される引数と環境の合計サイズに制限があり、Linux では単一の引数のサイズにも別の制限があります。

詳細については、以下を参照してください。

この制限を回避するには、次を使用できます (GNUxargsまたは互換バージョンを想定)。

printf '%s\0' foo* | xargs -r0 rm -f

上記では、printfが組み込まれているため (bashおよびほとんどの Bourne 系シェル)、制限に達することはありませんexecve()。また、制限を回避するために必要な回数xargsだけ引数のリストを呼び出しに分割します。rmexecve()

zsh

autoload zargs
zargs foo* -- rm -f

ksh93

command -x rm -f foo*

答え2

引数の合計サイズの制限は次のように確認できます。

getconf ARG_MAX

これは通常、シェルではなく、基盤となるオペレーティングシステムによって決定されます。この答え

関連情報