2016-08-29 12 views
2

は、私は自分のデスクトップ上のファイルのディレクトリを持っている:-nameは動作しますが、Mac端末で-regexを使用できないのはなぜですか?私のMacは、ヨセミテを実行する上で

29_foo10.bar 
29_foo2.bar 
29_foo20.bar 
29_foo3.bar 

私はfoo後に単一の数字を持つファイルをターゲットにしたいです。私はfind -nameを使用するとき、私は持つファイルの選択ターゲットにすることができます:

USERNAME=darthvader 
DIRECTORY="/Users/$USERNAME/desktop/test" 
for theProblem in $(find $DIRECTORY -type f -name '29_foo[0-9].bar'); do 
    cd $DIRECTORY 
    echo $theProblem 
done 

を、私は、端末(29_foo2.bar & 29_foo3.bar)で2つのファイルを返されていますが、私は-regexを使用しようとすると、それは何も返しません、コード:

for theProblem in $(find $DIRECTORY -type f -regex '29_foo[0-9].bar'); do 
    cd $DIRECTORY 
    echo $theProblem 
done 

私はいくつかの研究を行なったし、私はに私のコードを修正OS X Find in bash with regex digits \d not producing expected results

が見つかりました:

for theProblem in $(find -E $DIRECTORY -iregex '29_foo[0-9].bar'); do 

と私は戻っている:ので、私が試した

そのようなファイルまたはディレクトリ:

for theProblem in $(find -E $DIRECTORY -type f -regex '29_foo[0-9].bar'); do 

しかし、私はまだ取得していない:

そのようなファイルはありませんまたはディレクトリ

だから私はさらにいくつかの研究を行なったし、bash: recursively find all files that match a certain patternを発見し、テストした:

for theProblem in $(find $DIRECTORY -regex '29_foo[0-9].bar'); do 

と私は戻っている:

そのようなファイルやディレクトリはありません

をさらに私が見つけたウサギの穴の下にHow to use regex in file findを見つけたので、私は試しました:

for theProblem in $(find $DIRECTORY -regextype posix-extended -regex '29_foo[0-9].bar'); do 

と端末私に語った:

検索:-regextype:

原発不明またはオペレータヨセミテに私は-regexでファイルをターゲットにすることはできませんよ、なぜ?私がman regexを実行したとき、マニュアルが返されました。私のbashバージョンは3.2.57です。だからはなぜ-regexが動作しないのですか?

+0

あなたが見つけた解決策のいくつかは[OSX find](https:// developer。)の間に[GNU find](http://linux.die.net/man/1/find)で動作することに注意してください。 apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/find.1.html)は、 '-regextype'のようなオプションのいくつかを見逃しています。 – fedorqui

+0

@fedorquiあなたは、GNUとOSXの間に欠けていることを書き留めている文書を知っていますか? –

+1

えええええええええええええええええええええええええええええええええ: – fedorqui

答えて

2

あなたはfindでこの正規表現を使用する必要があります。

find "$DIRECTORY" -type f -regex '.*/29_foo[0-9]\.bar$' 

変更点は以下のとおりです。

  • .*/各ファイル名の前DOTまたは一部のディレクトリ・パスのいずれかが存在しますので、起動時に必要とされます。
  • このファイル名がすべて存在する場合は、一致を避けるために最後にアンカー$を追加しました。
  • DOTを-regexにエスケープする必要があります。それ以外の場合は任意の文字に一致します。
  • 以上findコマンドは、gnu-findのOSX-findでも同様に動作します。
+0

優れています。明確にするために私はあなたが編集したと思っていたので、 '-regex'を呼び出すときに常に'。*/'を使用するのが標準的な習慣であり、DOTは常にエスケープする必要があり、オプションではありませんか? –

+0

DOTはregexの良い習慣としてエスケープする必要があります。それ以外の場合、ファイル名は '29_foo2_bar'と一致します。 '-regex'が基本パス' '$ DIRECTORY" 'から始まるファイルの絶対パスと一致しているので、あなたの正規表現の前に'。*/'が必要です。 – anubhava

+1

と指摘してくれてありがとう、新しいことを学びました。 –

関連する問題