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


11

bashファイル名の拡張(グロビング)の最大数はありますか?ある場合、それは何ですか?参照してくださいグロブ tldp.orgに。

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

grep -e bar foo*
rm -f bar*

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

これらの操作を実行する別の方法を探していません(たとえばを使用してfind)。



2
参照:コマンドの単一引数の最大サイズを定義するものは何ですか?現在のLinuxシステムでは、単一の引数のサイズと合計サイズに異なる制限があります。後者は、スタックサイズの制限によって異なります。
ilkkachu 2017

回答:


17

bashグロブによって拡張できるファイルの数に制限はありません(使用可能なメモリ以外)。

ただし、これらのファイルが(シェルの組み込み関数や関数ではなく)実行されるコマンドの引数として渡されるexecve()と、一部のシステムでシステムコールの制限に達する場合があります。ほとんどのシステムでは、そのシステムコールは、渡される引数と環境の累積サイズに制限があり、Linuxでは、単一の引数のサイズにも個別の制限があります。

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

この制限を回避するには、次を使用できます(GNU xargsまたは互換性があると想定)。

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

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

zsh

autoload zargs
zargs foo* -- rm -f

ksh93

command -x rm -f foo*

7

引数の合計サイズの制限は、次のコマンドで確認できます。

getconf ARG_MAX

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


2
数ではなく、全長だと思いますか?
ilkkachu 2017

1
もちろんあなたは正しいです。これを反映するために、回答を更新しました。このため、引数の数の制限、引数の長さの関数なります。
DopeGhoti 2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.