假設我在不同的目錄中有 3 個資料夾,其中一些包含更多子資料夾,並且在每個資料夾/子資料夾中我都有名為 、 等的文字文件test1
,test2
其中以某種方式test3
包含該字串。hello
可以是正義hello
,也可以是helloJASKFNASKFN
等等。
如何顯示這些文件的排序清單?假設我想按名稱或修改日期排序。我確實知道我可以使用grep
orfind
命令來搜尋和顯示這些文件,但我不確定如何以排序的方式顯示它們。
答案1
如果您先對文件清單進行排序,然後再將其傳遞給grep
:,會更容易:
在 中zsh
,您可以執行以下操作:
grep -le hello -- **/test<->(.)
它在目前工作目錄中或之下查找名稱後面跟著一個或多個十進制數字(是匹配數字範圍的模式的一種形式)hello
的文件內容,跳過隱藏目錄。test
<->
<x-y>
預設情況下,全域擴充會按名稱排序。
若要按修改時間排序,請使用(.om)
代替(.)
。或(.oL)
按尺寸。請參閱 參考資料 中的 全域限定符清單 以及限定符可以排序的info zsh qualifiers
標準清單。o
替換o
為O
以反轉順序(On
按名稱反向排序)。
用於(.n)
按數字名稱排序(test10
在 後面test9
,而不是在test1
和之間test2
)。
如果你遇到一個爭論太多execve()
錯誤(大多數系統的系統呼叫限制導致):
autoload -Uz zargs # best in ~/.zshrc
zargs -- **/test<->(.) -- grep -le hello --
使用 GNU 工具和任何 shell(除了 (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
顛倒順序。