異なるディレクトリに 3 つのフォルダがあり、そのいくつかにさらにサブフォルダが含まれており、各フォルダ/サブフォルダに、、、などの名前のテキスト ファイルがあり、test1
何らかの方法で文字列が含まれているとします。 だけの場合もあれば、などの場合もあります。test2
test3
hello
hello
helloJASKFNASKFN
これらのファイルの並べ替えられたリストを表示するにはどうすればよいでしょうか。名前順、または変更日順に並べ替えたいとします。grep
またはfind
コマンドを使用してこれらのファイルを検索して表示できることは理解していますが、並べ替えた状態で表示する方法がよくわかりません。
答え1
渡す前にまずファイルのリストをソートしておくと簡単ですgrep
:
ではzsh
、次のことができます。
grep -le hello -- **/test<->(.)
これは、隠しディレクトリをスキップして、現在の作業ディレクトリ内またはその下にある、名前の後に 1 つ以上の 10 進数字 (数値の範囲に一致するパターンの形式) が続くhello
ファイルの内容を検索します。test
<->
<x-y>
デフォルトでは、glob 拡張は名前でソートされます。
変更時間で並べ替えるには、(.om)
の代わりにを使用する(.)
か、(.oL)
サイズで並べ替えます。globinfo zsh qualifiers
修飾子のリストと、o
修飾子が並べ替えに使用できる基準のリストについては、 を参照してください。
順序を逆にするにはo
を に置き換えます (名前の逆順に並べ替えるには を に置き換えます)。O
On
(.n)
名前による並べ替えを数値で表すにはを使用します(との間ではなく のtest10
後に来ます)。test9
test1
test2
もしあなたがあまりにも多くの引数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