globを「検索」に変換

globを「検索」に変換

私はこの問題に直面しています:正しいファイルと正確に一致するglobがありますが、Command line too long結果はfindgrep

たとえば、

./foo*bar/quux[A-Z]{.bak,}/pic[0-9][0-9][0-9][0-9]?.jpg

findglobを私が知らない式に変換できるツールはありますか?それとも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を使用します/

おすすめ記事