2015-09-24 2 views
1

В поисках раковине-только [1] способ взять этот список директорий:Можно комбинировать сортировку glob с чередованием в zsh?

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 

И вернуть его отсортирован численно, с SUBDIRS появляется сразу после их родителей:

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] Мне нужно это, чтобы иметь возможность работать с самыми разными системами, поэтому использование -V или GNU sort -V или GNU-sort или не будет работать.

ответ

0

Вы можете легко сделать это в два этапа: список, затем отсортировать.

dirs=(* */bar) 
dirs=(${(on)dirs}) 

Это зависит от / сортируется перед любым суффиксом существующего каталога, поэтому он не будет работать, если у вас есть каталоги с именами, как foo1.3-qux (он будет отсортирован между foo1.3 и foo1.3/bar. Поскольку все файлы каталоги, вы могли бы работать вокруг этого с временным / суффикса, если это нормально, чтобы иметь foo1.3-qux сортируется перед тем foo1.3:

dirs=(*/ */bar) 
dirs=(${${(on)dirs}%/}) 

для дополнительной надежности можно временно заменить / символов с нулевым байтом, который гарантированно будет отсортирован перед любым другим (по крайней мере, в локали C) и не будет отображаться в имени файла.

dirs=(* */bar) 
dirs=(${${(on)${dirs//\//$'\0'}}//$'\0'//})