디렉토리에 있는 항목의 이니셜이 쉼표로 구분된 목록을 얻으시겠습니까?

디렉토리에 있는 항목의 이니셜이 쉼표로 구분된 목록을 얻으시겠습니까?

중복 없이 선행 "." 항목을 제외하고 디렉터리에 있는 파일 및 디렉터리 이름의 첫 번째 문자를 쉼표로 구분하고 대소문자를 구분하지 않는 목록을 생성하려면 어떻게 해야 합니까? 재귀적일 필요는 없습니다. 한 수준 깊이만 있으면 됩니다.

예를 들어, 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 문자 긴 하위 문자열을 인쇄합니다.$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

...약간 다릅니다. dd80바이트 경계에서 접힌 결과에서 후행 공백이 제거됩니다. 줄당 최대 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 *

관련 정보