重複なしで先行「」。エントリを除いて、ディレクトリ内のファイル名とディレクトリ名の最初の文字をカンマで区切って大文字と小文字を区別しないリストを生成するにはどうすればよいですか?再帰的である必要はありません。 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文字の長い部分文字列を出力します。$var
X
答え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
...するでしょう...
- 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バイト境界で折りたたまれた結果から末尾のスペースは削除されます。 1行につき最大10個の結果を1行あたり74バイトにレンダリングする必要があり、fold
文字は文字として解釈されます。(バイトではない)バックスペースとタブ文字は、末尾のスペースを削除せずに列を区切るように解釈することもできます。
dd
2つの折りたたみ結果は次のとおりです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 *