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(Bourneに似たほとんどのシェルに)組み込まれているので、bash限界に達していませんexecve()。制限を避けるために、xargs引数リストを必要なだけの呼び出しに分割します。rmexecve()

そしてzsh

autoload zargs
zargs foo* -- rm -f

そしてksh93

command -x rm -f foo*

答え2

次のコマンドを使用して、合計パラメータサイズの制限を表示できます。

getconf ARG_MAX

これは通常、シェルによって決定されず、基本オペレーティングシステムによって決まります。この回答

関連情報