私はこの問題に直面しています:正しいファイルと正確に一致するglobがありますが、Command line too long
結果はfind
。grep
たとえば、
./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
find
globを私が知らない式に変換できるツールはありますか?それともfind
、サブディレクトリに同じglobを一致させずにglobを一致させるオプションはありますか(例:foo/*.jpg
一致は許可されていませんbar/foo/*.jpg
)?
ベストアンサー1
引数リストが長すぎるというエラーが発生する問題がある場合は、ループまたは組み込みシェルを使用してください。command glob-that-matches-too-much
間違っている可能性がありますが、そうではfor f in glob-that-matches-too-much
ありません。したがって、次のようにすることができます。
for f in foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg
do
something "$f"
done
ループは非常に遅いかもしれませんが、うまくいくはずです。
または:
printf "%s\0" foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg |
xargs -r0 something
(printf
上記はほとんどのシェルに組み込まれているため、システムコールの制限を解決できますexecve()
。)
$ cat /usr/share/**/* > /dev/null
zsh: argument list too long: cat
$ printf "%s\n" /usr/share/**/* | wc -l
165606
bashでも動作します。これが正確にどこに文書化されているのかよくわかりません。
Vim 2個glob2regpat()
そしてPythonfnmatch.translate()
globは正規表現に変換できますが、両方とも.*
for *
、acrossを使用します/
。