簡體   English   中英

可以在zsh中組合帶有替換的glob排序嗎?

[英]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-quxfoo1.3-qux (將在foo1.3foo1.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM