web-dev-qa-db-ja.com

特定の文字列を含む、ホームディレクトリ内の過去2分間の最終変更ファイルを検索します

過去2分間に変更され、特定の文字列も含むファイルをホームディレクトリで検索しています。私はこのコマンドで試しました:

 find -type d -mmin -2 -ls | grep -Ril "mystring" 

動作するようですが、明らかに、2分前に最後に変更された文字列を含むファイルではなく、指定された文字列が含まれているファイルのみを印刷します。コマンドの最初の部分が実行されていないようです。

5
Luca

あなたはあなた自身の提案で良い試みをしました

find -type d -mmin -2 -ls | grep -Ril "mystring"

これにより、ファイル(-type d)ではなく、過去2分間に変更されたディレクトリ(-type f)が特定されます。 -lsの出力をgrepにパイプすると、通常、生成されたファイル名でmystringが検索されます。ただし、この場合、-Rフラグはgrepの動作を変更し、ファイル名のリストを無視して、代わりに現在のディレクトリ以下のすべてのファイルを検索します。

では、問題を2つの部分に分けましょう

  1. ホームディレクトリで最後の2分間に最後に変更されたファイルを検索する

    find ~ -type f -mmin -2
    
  2. [ファイル]特定の文字列を含む

    grep -Fl 'certain String' {files...}
    

次に、それらを組み合わせる必要があります。 {}は、手順1のfindによって生成されたファイル名のプレースホルダーです。末尾の+は、{}を繰り返すことができることを示します複数回、つまり複数のファイル名

    find ~ -type f -mmin -2 -exec grep -Fl 'certain String' {} +

grepecho grepに変更すると、findコマンドによって実行されているものが表示されます。これは便利なデバッグ手法です。

    find ~ -type f -mmin -2 -exec echo grep -Fl 'certain String' {} +

man findman grep-Fなどのさまざまなオプションを確認するには、-lgrep -Flを実行することを検討してください。設定したエクササイズから何かを学ぶ。答えをコピーするだけです。

11
roaima

zshシェル:

grep -l -F -i 'string' ~/**/*(.Dmm-2)

... どこ **はサブディレクトリに再帰的に一致し、.D(.Dmm-2)は、「通常のファイルのみに一致する(.)、ただし隠しファイル(D)を含みます、そしてmm-2は、「過去2分間に変更された」ことを意味します。

4
Kusalananda