在 Unix 中按第二个字符开始对文件夹进行排序

在 Unix 中按第二个字符开始对文件夹进行排序

我试图从第二个字符开始对目录列表进行排序。

例如,如果我执行下面的代码,目录列表将根据第一个字符按顺序排列。

$ 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上打印其参数raw1 C
  • *(qualifiers): 带有 glob 限定符的 glob
  • N: Nullglob: 如果没有匹配则扩展为空
  • /:仅选择文件类型目录
  • oe[expression]o根据表达式的结果(在表达式操作后最初包含文件名e的值)对列表进行排序$REPLY
  • REPLY=${REPLY#?}:去掉文件名的第一个字符。

您可能还想在末尾添加第一个字符,例如REPLY=${REPLY#?}.$REPLY[1], asmith,bsmithcsmith该顺序排序而不是随机排序。

相关内容