Findは同じパスを2回返しますが、切り捨てられます。

Findは同じパスを2回返しますが、切り捨てられます。

私は次のfindコマンドを実行しています:

find $HOME * -depth -type d -iname *bowtie* | grep "bowtie*-*1[^2]"

私の予想結果は次のとおりです。

/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64

ただし、次を返します。

/home/user/Documents/scripts/bowtie1.3.0-linux-x86_64
/home/user/Documents/scripts/bowtie-1.3.0-linux-x86_64
Documents/scripts/bowtie1.3.0-linux-x86_64
Documents/scripts/bowtie-1.3.0-linux-x86_64

find最初の2つの結果のみを表示するようにコマンドを変更するにはどうすればよいですか?

答え1

find複数の同じ検索パスを使用して実行されています。生成された名前$HOMEと一緒に使用しています。*明らかに、それは*あなたが探している名前を含むいくつかのディレクトリに展開されます。

提案:

find "$HOME" -type d -name 'bowtie*1.[!2]*'

上記の方法を使用すると、テストをより創造的に使用してgrep心の負担を軽減できます。-name呼び出す前に、現在のディレクトリに基づいて拡張してはいけないスキーマを参照する必要がありますfind

このパターンはで始まり、を含むbowtie名前1.nとそれ以外のn名前と一致します2。代わりに[!2][13-9]forceを使用して、すべての文字であるExcept Exceptでは2なく、整数Except Exceptを一致させることができます2

答え2

その理由は、次の2つのパラメータを渡すためですfind

  • あなたの$HOMEディレクトリ
  • *これは、シェルによって現在のディレクトリにあるファイルとディレクトリの完全なリストに展開されます$HOME

したがって、最初に次のようなものをfind検索して返し、次にユーザーが提供したファイルとディレクトリのリストを検索します。これはシェルによって拡張されるため、パスです。$HOME/home/user/foo比較的現在のディレクトリに移動して先行がないため、/home/user次のようなものを返しますfoo

関連情報