ファイルの内容を再帰的に検索し、変更日ごとに並べ替えて表示します。

ファイルの内容を再帰的に検索し、変更日ごとに並べ替えて表示します。

次の条件をすべて満たすファイル検索を設定しようとしています。

  1. ワイルドカード文字を含むディレクトリで繰り返し検索します。
  2. ファイル内容の検索(例:「ファイルのテキスト」)
  3. 検索するファイル名を定義します(例:script.js)(おそらく#1と組み合わせることができますか?)
  4. 検索文字列のパスとコンテキストで結果を表示する(たとえば、/home/user/level_1/level_2/level_3/level_4/level_5/script.js Here is the text in file...正確な形式は異なる場合がありますが、この情報を含める必要があります。タイムスタンプは必要ありません。パス全体が表示されず、表示されたディレクトリのみが表示される場合例では追加の利点がありますが、level_2必須ではありません.)
  5. ファイルの変更日に基づいて、最も古いものから最新のものまでソートされた結果を表示します。

以下には、要件1-4を満たす次のコマンドがあります。

grep -r --include=\script.js "text in file" /home/user/level_1/*/level_3/*/level_5/

5番目の項目を含める方法についてのアイデアはありますか?私はzshを使って同様のことをする方法のさまざまな説明を見ましたが、それらをfindまとめることはできません。

ベストアンサー1

を使用しているのでzsh問題になることがあります。

grep -H 'text in file' /home/user/level_1/*/level_3/*/level_5/**/script.js(.Om)

**/サブディレクトリレベルを一致させる場合、.修飾子は次のように制限されます。定期的なファイルを変更し(GNUがgrep行うように-r)、Om O変更時間に基づいて逆順に並べ替えますm(例ls -rt:)。DGNUのように隠された修飾子を見つけるには、grepqualifiersを追加してください-r

-H-r(または同じGNU拡張子--include)は、ファイルが1つしか見つからなくてもファイル名が印刷されることを保証しますzsh

印刷するにはセカンダリディレクトリファイルパスに加えて、GNUを使用してgrep次のことができます。

for f (/home/user/level_1/*/level_3/*/level_5/**/script.js(N.Om))
  grep -H --label=${f:h5:t} 'text in file' < $f

:h55が必要な場所はどこですか?h電子ヘッドコンポーネント(/home/user/level_1/level_2in)/home/user/level_1/level_2/and/more...:ttエア中( level_2)。

タイムスタンプを含めるには、zshの組み込みstat関数を使用して検索できます。

zmodload zsh/stat
for f (/home/user/level_1/*/level_3/*/level_5/**/script.js(N.Om)) {
  stat -LF%FT%T.%3.%z -A t +mtime $f
  grep -H --label="${f:h5:t} ($t)" 'text in file' < $f
}

ここのタイムスタンプはミリ秒精度の標準形式(例:2022-12-01T09:30:00.895+0000)で明示的にフォーマットされていますが、必要に応じてフォーマットを調整できます-Fstrftime()フォーマットを使用)。

おすすめ記事