ディレクトリ内のエントリのイニシャルをカンマで区切ったリストを取得しますか?

ディレクトリ内のエントリのイニシャルをカンマで区切ったリストを取得しますか?

重複なしで先行「」。エントリを除いて、ディレクトリ内のファイル名とディレクトリ名の最初の文字をカンマで区切って大文字と小文字を区別しないリストを生成するにはどうすればよいですか?再帰的である必要はありません。 1つのレベルの深さだけで済みます。

たとえば、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ファイル名のリスト(1行に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バイト境界で折りたたまれた結果から末尾のスペースは削除されます。 1行につき最大10個の結果を1行あたり74バイトにレンダリングする必要があり、fold文字は文字として解釈されます。(バイトではない)バックスペースとタブ文字は、末尾のスペースを削除せずに列を区切るように解釈することもできます。

dd2つの折りたたみ結果は次のとおりです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 *

関連情報