web-dev-qa-db-ja.com

親と子のディレクトリで特定のパターンのファイルを見つける方法は?

単一のコマンドを使用して、現在の作業ディレクトリの親ディレクトリと子ディレクトリで特定のパターンのファイルを見つける方法は?

ファイル名-test.txt、ファイルのパターンはnslookup

このファイルは3つのディレクトリにあり、/ home/ home/1および/ home/1/2です。

私は現在/ home/1にいます。私は以下のコマンドを試しました:

find ../ -type f -name "test.txt"

出力:

../test.txt
../home/1/test.txt
../home/1/2/test.txt

ファイルを見つけることができたので、以下のコマンドを試しました:

$ find ../ -type f -exec grep "nslookup" {} \;
nslookup
nslookup
nslookup

これはファイル名を表示しません。

コマンド:

find . -type f -name "test.txt" | xargs grep "nslookup"

==> pwdおよび子ディレクトリのファイルを取得します:

./1/test.txt:nslookup
./test.txt:nslookup

しかし、以下に示すように親ディレクトリを検索しようとすると、結果が正しくありません。

find ../ -type f -name "test.txt" | xargs grep "nslookup"

User@User-PC ~/test
$ uname -a
CYGWIN_NT-6.1 User-PC 2.5.2(0.297/5/3) 2016-06-23 14:29 x86_64 Cygwin
2
Ashwin B

あなたの命令

find ../ -type f -exec grep "nslookup" {} \;

grepは、操作するファイルが1つしかない場合、デフォルトではファイル名を表示しないという事実を除けば、ほぼ正しいです。

これを修正する2つの方法があります:

  1. 非標準の(ただし一般的な)-Hオプションを持つgrepを使用して、常にファイル名を表示します。

    find ../ -type f -exec grep -H 'nslookup' {} \;
    
  2. grepに少なくとも2つのファイル名を与える:

    find ../ -type f -exec grep 'nslookup' /dev/null {} \;
    

onlyファイル名に興味がある場合は、次の2つの方法でこれを行うことができます。

  1. 標準の-lオプションをgrepとともに使用します。

    find ../ -type f -exec grep -l 'nslookup' {} \;
    
  2. 一致するファイルが含まれている場合は、findにファイルのパス名を出力させます。

    find ../ -type f -exec grep -q 'nslookup' {} \; -print
    

    ここでは、パターンが一致するかどうかを検出するためにgrepのみを使用します。その-qオプションは、何も出力しないようにし、findは、ユーティリティの終了ステータスを使用して、-printアクションを実行するかどうかを決定します。

4
Kusalananda