単一のコマンドを使用して、現在の作業ディレクトリの親ディレクトリと子ディレクトリで特定のパターンのファイルを見つける方法は?
ファイル名-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
あなたの命令
find ../ -type f -exec grep "nslookup" {} \;
grep
は、操作するファイルが1つしかない場合、デフォルトではファイル名を表示しないという事実を除けば、ほぼ正しいです。
これを修正する2つの方法があります:
非標準の(ただし一般的な)-H
オプションを持つgrep
を使用して、常にファイル名を表示します。
find ../ -type f -exec grep -H 'nslookup' {} \;
grep
に少なくとも2つのファイル名を与える:
find ../ -type f -exec grep 'nslookup' /dev/null {} \;
onlyファイル名に興味がある場合は、次の2つの方法でこれを行うことができます。
標準の-l
オプションをgrep
とともに使用します。
find ../ -type f -exec grep -l 'nslookup' {} \;
一致するファイルが含まれている場合は、find
にファイルのパス名を出力させます。
find ../ -type f -exec grep -q 'nslookup' {} \; -print
ここでは、パターンが一致するかどうかを検出するためにgrep
のみを使用します。その-q
オプションは、何も出力しないようにし、find
は、ユーティリティの終了ステータスを使用して、-print
アクションを実行するかどうかを決定します。