[英]Possible to combine glob sort w/ alternation in zsh?
尋找僅shell [1]方式獲取此目錄列表:
foo1.1
foo1.10
foo1.10/bar
foo1.2
foo1.3
foo1.3/bar
foo1.4
foo1.5
foo1.5/bar
foo1.6
foo1.7
foo1.8
foo1.9
foo2.1
並返回按數字排序的子目錄,其子目錄顯示在其父目錄之后:
foo1.1
foo1.2
foo1.3
foo1.3/bar
foo1.4
foo1.5
foo1.5/bar
foo1.6
foo1.7
foo1.8
foo1.9
foo1.10
foo1.10/bar
foo2.1
(*|*/bar)(n)
被拒絕為錯誤模式,而*/{,bar}(n)
擴展為*/(n) ~/bar(n)
因此子目錄顯示在末尾。
[1]我需要它能夠在各種各樣的系統上工作,因此使用GNU sort的-V或GNU ls的-v等將不起作用。
您可以通過兩個步驟輕松地完成此操作:列出然后排序。
dirs=(* */bar)
dirs=(${(on)dirs})
這依賴於/
在現有目錄的任何后綴之前進行排序,因此,如果您的目錄具有foo1.3-qux
類foo1.3-qux
(將在foo1.3
和foo1.3/bar
之間進行排序), foo1.3
foo1.3/bar
。這些文件是目錄,如果可以在foo1.3-qux
之前對foo1.3-qux
進行排序,則可以使用一個臨時/
后綴來foo1.3
:
dirs=(*/ */bar)
dirs=(${${(on)dirs}%/})
為了提高魯棒性,您可以用一個空字節臨時替換/
字符,這保證了它們都將排在其他任何字符之前(至少在C語言環境中),並且不會出現在文件名中。
dirs=(* */bar)
dirs=(${${(on)${dirs//\//$'\0'}}//$'\0'//})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.