获取目录中项目首字母缩写的逗号分隔列表?

获取目录中项目首字母缩写的逗号分隔列表?

如何生成目录中文件和目录名称的第一个字符的逗号分隔、不区分大小写的列表,不包括开头的“.”项目,没有重复项?我不需要它是递归的 - 只需要一层深。

例如,从 ls 生成的目录......

drwxr-xr-x+ 10 bryan  staff   340B Jun  6 15:32 .
drwxrwx---@ 27 bryan  staff   918B Jun  6 15:29 ..
-rw-r--r--@  1 bryan  staff   6.0K Jun  6 15:32 .secrets
drwxr-xr-x+  2 bryan  staff    68B Jun  6 15:30 Apoptosis
drwxr-xr-x+  2 bryan  staff    68B Jun  6 15:32 Fanciful Notions
-rwxr-x---@  1 bryan  staff   351B Jun  2 16:57 Pungent
-rwxr-x---@  1 bryan  staff   351B Jun  2 16:57 Zoophilia
-rwxr-x---@  1 bryan  staff   351B Jun  2 16:57 addled_symbionts
-rwxr-x---@  1 bryan  staff   351B Jun  2 16:57 putrid
drwxr-xr-x+  2 bryan  staff    68B Jun  6 15:30 zuegma mandegreen

……我想回来……

a, f, p, z

我正在使用 BSD,我是一个 nube,但无法完全完成这项工作。

答案1

你可以使用 shell/coreutils 来做到这一点:

for f in *; do printf "%s\n"  "${f:0:1}" ; done | 
    tr '[A-Z]' '[a-z]' | sort | uniq | paste -d, -s

该语法打印从位置开始的${var:X:Y}变量的 Y 字符长子字符串$varX

答案2

你可以去

ls -1 |  cut -b1 | tr '[:upper:]' '[:lower:]' | sort -u | paste -d, -s

在哪里:

  • ls -1为您提供文件名列表(每行一个),
  • cut -b1每行只取第一个字符,
  • tr '[:upper:]' '[:lower:]'将全部转为较低的大写字母,
  • sort -u删除重复项,并且
  • paste -d, -s,使用分隔符将行放在一起。

答案3

printf %c,\\n * | 
sort -fu        |
dd cbs=8 conv=lcase,block

...将要...

  1. 将 glob中匹配的每个参数的第一个字符打印到stdout *,后跟逗号和ewline\n
  2. 对流进行排序,同时忽略大小写并压缩重复项
  3. 将该流折叠成一行 8(空格填充)每条记录的字符数,同时将所有大写字符转换为小写字符

我想我在这个目录中有一些奇怪的文件名需要删除,但是......

0,      1,      =,      a,      b,      c,      d,      e,      f,      g,      h,      i,      k,      l,      m,      n,      o,      p,      q,      r,      s,      t,      w,      x,      y,      z,      _,      ~,      
0+1 records in
0+1 records out
224 bytes (224 B) copied, 7.2813e-05 s, 3.1 MB/s

最后一位是dd处理报告。你可以看到它的速度相当快。您可以2>/dev/null根据需要删除报告。

可以选择在管道的尾部添加另一个dd或某些东西来控制线路长度。fold喜欢:

CMD | dd cbs=80 conv=unblock

...或者...

CMD | fold -w80

...仅略有不同 -dd将从 80 字节边界处的折叠结果中去除尾随空格 - 应该以每行 74 字节的方式呈现每行最多 10 个结果,同时fold将字符解释为字符(不是字节)还可以以列敏感的方式解释退格键和制表符,而不去除尾随空格。

dd传递的两次折叠结果sed -n l

0,      1,      =,      a,      b,      c,      d,      e,      f,      g,$
h,      i,      k,      l,      m,      n,      o,      p,      q,      r,$
s,      t,      w,      x,      y,      z,      _,      ~,$

答案4

#!/usr/bin/awk -f
BEGIN {
  OFS = ", "
  for (z in ARGV)
    y[tolower(substr(ARGV[z], 1, 1))]
  for (x in y)
    $(++w) = x
  print
}

像这样打电话

hello.awk *

相关内容