![Unix でフォルダを 2 番目の文字から順に並べ替える](https://rvso.com/image/168780/Unix%20%E3%81%A7%E3%83%95%E3%82%A9%E3%83%AB%E3%83%80%E3%82%92%202%20%E7%95%AA%E7%9B%AE%E3%81%AE%E6%96%87%E5%AD%97%E3%81%8B%E3%82%89%E9%A0%86%E3%81%AB%E4%B8%A6%E3%81%B9%E6%9B%BF%E3%81%88%E3%82%8B.png)
ディレクトリのリストを 2 番目の文字から並べ替えようとしています。
たとえば、以下のコードを実行すると、ディレクトリのリストは最初の文字に基づいて順序付けられます。
$ ls -1d */
lrodriguez/
mreynolds/
yalberto/
私が実現したいのは、次のように表示することです。
yalberto/
mreynolds/
lrodriguez/
私は次のフォーラムを見ました: ファイル名の一部でファイルを並べ替えるにはどうすればいいですか? しかし成功しなかった。
次のようなことを試してみましたls -1d -- *?[a-z]* | sort -t?[a-z] -k2
が、結果は得られませんでした。Unix 環境についてはまだ初心者なので、何かアドバイスがあれば大変助かります。よろしくお願いします。
答え1
ではsort
、形式のキーを使用してF.C
文字の位置を指定できます。内でフィールドです。例えば
$ printf '%s\n' */ | sort -k1.2
yalberto/
mreynolds/
lrodriguez/
ディレクトリ名に改行が含まれている場合は失敗することに注意してください。
sort
GNU では、次のように NUL で区切られたレコードを操作することでこれを回避できます。
printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'
また、 の展開には*/
ディレクトリへのシンボリック リンクも含まれることに注意してください。
答え2
とzsh
:
print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
print -rC1
引数r
awを1
C
列に出力します*(qualifiers)
: glob 修飾子付きの globN
:N
ullglob: 一致するものがない場合には何も展開されません/
: タイプのファイルのみを選択ディレクトリoe[expression]
:式o
の結果に基づいてリストを順序付けます(式によって操作された後のファイル名を最初に含むe
値)$REPLY
REPLY=${REPLY#?}
: ファイル名の最初の文字を削除します。
REPLY=${REPLY#?}.$REPLY[1]
また、のように最初の文字を末尾に追加してasmith
、bsmith
がcsmith
ランダムではなくその順序で並べ替えられるようにすることもできます。