web-dev-qa-db-ja.com

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

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

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

grep -e bar foo*
rm -f bar*

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

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

11
Thomas

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

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

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

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

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

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

zshの場合:

_autoload zargs
zargs foo* -- rm -f
_

_ksh93_の場合:

_command -x rm -f foo*
_
17

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

getconf ARG_MAX

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

7
DopeGhoti