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

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

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

ファイル名 -テスト.txt、ファイルには次のパターンがあります。nslookup

このファイルは3つのディレクトリにあります。/家/ホームページ1そして/ホーム/1/2

私は現在/ホームページ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

ベストアンサー1

注文

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

grep単一のファイルしか使用できない場合、デフォルトではファイル名が表示されないことを除いて、ほぼ正確です。

この問題を解決する2つの方法は次のとおりです。

  1. 常にファイル名を表示するには、grep非標準(しかし一般的な)オプションでaを使用します。-H

    find ../ -type f -exec grep -H 'nslookup' {} \;
    
  2. grep複数のファイル名を指定してください。

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

興味があればただファイル名を入力した場合、これを行うには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

おすすめ記事