중복 없이 선행 "." 항목을 제외하고 디렉터리에 있는 파일 및 디렉터리 이름의 첫 번째 문자를 쉼표로 구분하고 대소문자를 구분하지 않는 목록을 생성하려면 어떻게 해야 합니까? 재귀적일 필요는 없습니다. 한 수준 깊이만 있으면 됩니다.
예를 들어, 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를 사용하고 있고 멍청하지만 이 작업을 제대로 수행할 수 없습니다.
답변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바이트 경계에서 접힌 결과에서 후행 공백이 제거됩니다. 줄당 최대 10개의 결과는 줄당 74바이트로 렌더링되어야 하며 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 *