私は次の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
。