2016-08-09 19 views
2

find utilでファイルを検索しようとしていますが、特別なディレクトリにあるファイル以外のファイルはすべて*.jsです。私はコマンドで見つけようとします:検索ツールの単語を除外する正規表現

find ./ -regex '\.((?\!node_modules).)*\.js' 

しかし、このシナリオでは何も見つかりません。

この正規表現は、私がテストしたサブライムテキスト3で動作します。

P.S.私は以下のような別のオプションで解決することを知っています。しかし、私は正規表現で問題を解決する方法を知りたいです

find ./ -path *node_modules -prune -o -name *.js 
+0

は、以下のことを試してみてください: '見つけます。 -name "* .js" | grep -v "" | grep -v "dir2" ... '(" grep -v "は" ...を含んでいない "という意味です) – Dominique

答えて

2

あなたは現時点でそれを行うことはできません。

GNU Findはいくつかの正規表現型をサポートしていますが、いずれもゼロ幅アサーションをサポートしていません。あなたのタスクのために

-regextype type 
      Changes the regular expression syntax understood by -regex and -iregex tests which occur later on the command line. Currently-implemented types are emacs (this is the default), > posix-awk, posix-basic, posix- 
      egrep and posix-extended. 

あなたは後読みアサーション、 を必要とし、それはまだサポートされていません。

もう一つの選択肢は、find式をPerlプログラムの に変換するfind2perlを使用して、式の意味を同じにすることです。

あなたの式がPCREとルックアヘッド/ルックアヘッドアサーションで動作するかどうかを確認するには、このプログラムを使用できます。

1

あなたのfind実装の正規表現エンジンは、ルックアラウンドをサポートしていないようです。 (man findで参照してください、とあなたはおそらく@IgorChubinを説明するもの見つけることができます。)あなたはまだ不要なパターンを除外するために! -regexを使用することができます

、例えば:

find . ! -regex '\./node_modules/.*' -name '*.js' 
+0

ありがとうございます、bashの感嘆符をエスケープして動作します。 Buiそれは正規表現だけでなく、 'find'の別のオプション("! ")を使用するので、私の質問に対する正確な答えではありません – Pasha

+0

Bashのために'! 'をエスケープする必要はありません。そして、あなたは 'find 'として' -name'の代わりに '-regex'を使うことができます。 ! -regex '\ ./ node_modules /.*' -regex '。* \。js''しかし、これは不必要に長くなりますので、私はお勧めしません – janos

関連する問題