Linux ターミナルで特定の文字列を含むファイルの並べ替えられたリストを表示する方法

Linux ターミナルで特定の文字列を含むファイルの並べ替えられたリストを表示する方法

異なるディレクトリに 3 つのフォルダがあり、そのいくつかにさらにサブフォルダが含まれており、各フォルダ/サブフォルダに、、、などの名前のテキスト ファイルがあり、test1何らかの方法で文字列が含まれているとします。 だけの場合もあれば、などの場合もあります。test2test3hellohellohelloJASKFNASKFN

これらのファイルの並べ替えられたリストを表示するにはどうすればよいでしょうか。名前順、または変更日順に並べ替えたいとします。grepまたはfindコマンドを使用してこれらのファイルを検索して表示できることは理解していますが、並べ替えた状態で表示する方法がよくわかりません。

答え1

渡す前にまずファイルのリストをソートしておくと簡単ですgrep:

ではzsh、次のことができます。

grep -le hello -- **/test<->(.)

これは、隠しディレクトリをスキップして、現在の作業ディレクトリ内またはその下にある、名前の後に 1 つ以上の 10 進数字 (数値の範囲に一致するパターンの形式) が続くhelloファイルの内容を検索します。test<-><x-y>

デフォルトでは、glob 拡張は名前でソートされます。

変更時間で並べ替えるには、(.om)の代わりにを使用する(.)か、(.oL)サイズで並べ替えます。globinfo zsh qualifiers修飾子のリストと、o修飾子が並べ替えに使用できる基準のリストについては、 を参照してください。

順序を逆にするにはoを に置き換えます (名前の逆順に並べ替えるには を に置き換えます)。OOn

(.n)名前による並べ替えを数値で表すにはを使用します(との間ではなく のtest10後に来ます)。test9test1test2

もしあなたがあまりにも多くの引数execve()エラー(ほとんどのシステムのシステムコールの制限により発生):

autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --

GNU ツールと任意のシェル (コマンドを 1 行に入力する必要がある (t)csh を除く) を使用する場合:

名前で並べ替えるには:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -print0 |
  sort -z |
  xargs -r0 grep -le hello --

(数値による並べ替え-Vにはオプションを追加してください)sort

変更時間で並べ替えるには:

LC_ALL=C find . -regextype posix-extended -name '.?*' -prune -o \
  -regex '.*/test[0-9]+' -type f -printf '%T@\t%p\0' |
  sort -zrn |
  cut -zf2- |
  xargs -r0 grep -le hello --

順序を逆にするには、-rを追加/削除します。sort

関連情報