Linuxプログラム「sort」は、ファイルや他のプログラムの出力をソートできます。 sort を使用して ls コマンドの出力を 1) ファイル名 2) ファイルサイズでソートする方法です。
"ls"コマンドにこれを実行するためのいくつかのオプションがあることがわかりましたが、次のソートを試してみました。 「ls」コマンドはサイズを表示し、「sort」コマンドオプションはソートを制御し、パイプを使用しました。
この目標をどのように達成できますか?
答え1
そしてGNUの実装stat
1、ファイル名に改行文字が含まれておらず、-
現在のディレクトリから呼び出されるファイルがないとします。
stat -c '%s %n' -- * | sort -t' ' -k1,1n -k2
ソートキー:
- まず、フィールド1(サイズ)に基づいて数値順(昇順)でソートします。
- 次のフィールド2 - 終了(ファイル名)語彙(昇順)
¹stat
これは標準コマンドではなく、互換性のない実装が複数あることに注意してください。
答え2
Unixシリーズシステムのファイル名は、ゼロとエンコーディングを除いて、1つ以上の(通常は特定の制限まで)バイトのシーケンスです/
。
sort
行ソート、つまり0以上の配列(一部の実装では特定の制限まで)数値その他および改行文字(および一部の実装ではNUL)は、コマンドラインで提供されているソートキーの仕様に基づいています。
GNU実装(および対応するレプリカ)は、sort
標準拡張で入力時にNULを処理でき、行ではなくNULで区切られたレコードをソートすることもできます(optionsを使用-z
)。
C
ロケールを次に変更すると(実際にローカライズを無効にした場合)、byte ==文字マップを持つことができます。
ls
たとえば、ast-open の実装により、次のような結果が得られます。
ls --format='%(size)d\t%(name)s'
ただし、これは NUL で区切られたレコードではなく、改行で区切られたレコードなので、改行はファイル名のすべての文字と同じくらい有効であるため機能しません。
NULを取得するためにinを使用することはできませんが、\0
次のようにすることができます。
ls --format='%(size)d\t%(name)s/'
GNUの助けを借りて、これらの区切り文字をGNUのNUL区切り文字に変換awk
できます。/<newline>
sort -z
ls --format='%(size)d\t%(name)s' |
LC_ALL=C gawk -v 'RS=/\n' -v 'ORS=\0' 1 |
LC_ALL=C sort -zn |
LC_ALL=C tr '\0' '\n'
(tr
最終的にはディスプレイのみ)。
GNUでは、ast-open(またはこれを実行するGNUツールボックスのツール)をls
使用して出力形式を指定することはできませんが、バージョン9.0以降、このオプションを使用してNUL区切りのレコードを出力できます。find
stat
--zero
そして:
LC_ALL=C ls -go --zero
次のような出力が得られます。
<mode><spaces><links><spaces><size><space><t1><spaces><t2><spaces><t3><space><name><NUL>
したがって、サイズと名前を抽出できます。
ただし、これがすべての種類のファイルに適用されるわけではありません。
- シンボリックリンクの
<name>
場合<name><space>-><space><target-path>
<size>
<major>,<spaces><minor>
デバイスファイルの場合は、デバイス番号を代わりに受け取ります。
GNUには、出力内の各ファイル名が開始および終了する場所に関する情報とともに出力を提供するオプションls
もあります。これはシンボリックリンクには役立ちますが、デバイスファイルには役立ちません。オフセットを使用して追加情報を取得し、ソートに適した形式に再フォーマットするには追加の作業が必要です。--dired
emacs
//DIRED//
の出力は、ls
後処理にはまったく使用されません。
代わりに、次のものを使用できます。
zsh
任意の基準でソートできるグローブ- GNU
find
とその-printf
述語 - zsh、BSD、またはGNU
stat
(互換性のないAPIを含む) stat()
または// ... APIと組み込みソートツールを備えたPerl、Ruby、Pythonなどのより高いレベルのプログラミング言語。lstat()
statx()