我试图从第二个字符开始对目录列表进行排序。
例如,如果我执行下面的代码,目录列表将根据第一个字符按顺序排列。
$ ls -1d */
lrodriguez/
mreynolds/
yalberto/
我想要完成的是将它们显示为:
yalberto/
mreynolds/
lrodriguez/
我查看了以下论坛: 如何按文件名的一部分对文件进行排序? 但没有成功。
我尝试过类似的事情:ls -1d -- *?[a-z]* | sort -t?[a-z] -k2
但没有得到任何结果。对 Unix 环境相当陌生,任何指示都会非常有帮助。先感谢您。
答案1
通过sort
,您可以使用表单的键F.C
来指定字符位置之内一个字段。例如
$ printf '%s\n' */ | sort -k1.2
yalberto/
mreynolds/
lrodriguez/
请注意,如果任何目录名称包含换行符,此操作将会失败。
这可以通过 GNU 来解决,sort
方法是使用 NUL 分隔的记录,而不是:
printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'
另请注意, 的扩展*/
还包括目录的符号链接。
答案2
和zsh
:
print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
print -rC1
在olumn上打印其参数r
aw1
C
*(qualifiers)
: 带有 glob 限定符的 globN
:N
ullglob: 如果没有匹配则扩展为空/
:仅选择文件类型目录oe[expression]
:o
根据表达式的结果(在表达式操作后最初包含文件名e
的值)对列表进行排序$REPLY
REPLY=${REPLY#?}
:去掉文件名的第一个字符。
您可能还想在末尾添加第一个字符,例如REPLY=${REPLY#?}.$REPLY[1]
, asmith
,bsmith
按csmith
该顺序排序而不是随机排序。