Unix でフォルダを 2 番目の文字から順に並べ替える

Unix でフォルダを 2 番目の文字から順に並べ替える

ディレクトリのリストを 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/

ディレクトリ名に改行が含まれている場合は失敗することに注意してください。

sortGNU では、次のように NUL で区切られたレコードを操作することでこれを回避できます。

printf '%s\0' */ | sort -zk1.2 | tr '\0' '\n'

また、 の展開には*/ディレクトリへのシンボリック リンクも含まれることに注意してください。

答え2

zsh

print -rC1 -- *(N/oe['REPLY=${REPLY#?}'])
  • print -rC1引数rawを1 C列に出力します
  • *(qualifiers): glob 修飾子付きの glob
  • N: Nullglob: 一致するものがない場合には何も展開されません
  • /: タイプのファイルのみを選択ディレクトリ
  • oe[expression]:式oの結果に基づいてリストを順序付けます(式によって操作された後のファイル名を最初に含むe値)$REPLY
  • REPLY=${REPLY#?}: ファイル名の最初の文字を削除します。

REPLY=${REPLY#?}.$REPLY[1]また、のように最初の文字を末尾に追加してasmithbsmithcsmithランダムではなくその順序で並べ替えられるようにすることもできます。

関連情報