-nameまたは-regexを使用してディレクトリが見つからないのはなぜですか?

-nameまたは-regexを使用してディレクトリが見つからないのはなぜですか?

ディレクトリがあります~/Documents/machine_learning_coursera/

注文する

find . -type d -name '^machine'

何も見つかりません

私も試しました

find . -type d -regextype posix-extended -regex '^machine'

何も一致せず、文字列の先頭に一致します。

私も次のことを試しました-name

find . -type d -regextype posix-extended -regex -name '^machine'

エラーが発生しました。

find: paths must precede expression: `^machine'

私がここで何を間違っているのか?

答え1

findは正規表現ではなく、-nameシェル/glob/ワイルドカードパターンを使用します。fnmatch()

GNUfind-regex非標準拡張は正規表現(デフォルトでは古いemacsタイプ)を使用しますが、ファイル-path名だけでなくフルパス(ワイルドカードも使用する標準など)に適用されます(暗黙的に固定されています)。

したがって、次の種類のファイルを見つけるには目次名前がで始まるmachine場合は、次のものが必要です。

find . -name 'machine*' -type d

または:

find . -regextype posix-extended -regex '.*/machine[^/]*' -type d

-regextype posix-extended(特定の正規表現の場合、基本的な正規表現エンジンも機能するため、必要はありません。)

ちなみに最初の試合では名前さらに、ファイルはロケールで有効なテキストでなければならず、2番目のファイルの場合はフルパスが有効なテキストでなければなりません。

答え2

引数は-nameシェルglobとよく似ているため、一致するファイル名の先頭と末尾に暗黙的にバインドされていることを*示す必要があります。

find . -type d -name 'machine*'

あるいは、-regex記録(参照man find)は「検索するのではなく、フルパスで一致」は、暗黙的に一致の開始と終了にもバインドされているため、次のものが必要です。

find . -type d -regextype posix-extended -regex '(.*/)?machine[^/]*'

「と言うとまた試み-name「パラメータが必須であるという事実を忘れてしまい、そのパラメータ-regexとして使用して誤って息を止めました。-name'^machine'

答え3

-name、テストではfind正規表現ではなくファイルglobを使用します。 globには特別な意味がないため、^コマンドは実際に名前付きディレクトリを探します^machine。名前が次から始まるすべてのディレクトリを検索したいですmachine

find . -type d -name 'machine*'

有効にするフラグではないため、他の試みは失敗しました。正規表現を入力として渡す必要が-regexあります。-nameここでは何も与えないのでfind文句を言ってください。また、-regexテストでは、名前だけでなくパス全体を一致させようとします。テストで実行したいタスクを実行する正しい方法は-regex次のとおりです。

find . -maxdepth 1 -type d -regex '.*/machine.*' 

関連情報