如何生成目录中文件和目录名称的第一个字符的逗号分隔、不区分大小写的列表,不包括开头的“.”项目,没有重复项?我不需要它是递归的 - 只需要一层深。
例如,从 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 字符长子字符串$var
X
答案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
...将要...
- 将 glob中匹配的每个参数的第一个字符打印到stdout
*
,后跟逗号和ewline\n
- 对流进行排序,同时忽略大小写并压缩重复项
- 将该流折叠成一行 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 *