%20%E3%81%AB%E3%81%AF%E4%B8%8A%E9%99%90%E3%81%8C%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F%20%E3%81%82%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E3%81%9D%E3%82%8C%E3%81%AF%E4%BD%95%E3%81%A7%E3%81%99%E3%81%8B%3F.png)
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
だけ引数のリストを呼び出しに分割します。rm
execve()
とzsh
:
autoload zargs
zargs foo* -- rm -f
とksh93
:
command -x rm -f foo*