人間が読める形式の数字に拡張

人間が読める形式の数字に拡張

そのため、ファイル名を入力として使用するコンソールプレーヤーでいくつかのMP3を再生したいと思います。私のシェル(zsh)拡張子の場所に示すように、次のファイルがありますls -1 **

1 - Main title.mp3
10 - End title.mp3
2 - Intro.mp3 
...

しかし、明らかに私は実際にそれらを次のように整列させたいと思います。

1 - Main title.mp3
2 - Intro.mp3 
...
10 - End title.mp3

これを行うにはどのシェル拡張魔法が必要ですか?

私は巧妙な配管を使用すると同じ結果が得られることを知っていますが、sort -h実際にはそうではありません。怠惰なタイピストだから。それで、曲を追加するために小さなシェルスクリプトを書かない限り、私はそうするほうがnyxmms2 add /path/to/dir/*.mp3よいでしょう。なぜzsh用の拡張機能でフィルタリングを実行する方法を探していますか...また、これが正しいかどうかを知りたいです。可能です。これは、ログファイルやリビジョンなど、さまざまな状況に適用されるためです。

答え1

使用n グローバル予選

print -lr -- *.mp3(n)

設定により、デフォルトのソート順を変更できます。numeric_glob_sortオプション。

setopt numeric_glob_sort
print -lr -- *.mp3

numeric_glob_sort有効なパターンのアルファベット順が必要な場合は、nglob修飾子を取り消してください。

print -lr -- *(^n)

答え2

ls1つの方法は、sortコマンドを介して出力を実行して出力の表示方法を制御することです。

-h(aka.)を使用して、--human-numeric-sort人が読める形式でアイテムを並べ替えることができます。

$ ls | sort -h
1 - Main title.mp3
2 - Main title.mp3
10 - Main title.mp3

編集#1 - OPのコメントを扱う

上記は、次のエイリアスでラップできます。

$ alias lss="ls | sort -h"

上記のコマンドを実行すると、次のように単純化されます。

$ lss
1 - Main title.mp3
2 - Main title.mp3
10 - Main title.mp3

引用する

答え3

ワイルドカードでソート順を変更できますzsh(参照:ザイルズの答え)、しかし、対応するls引数はとにかくソートされ、デフォルトではアルファベット順にソートされます。

lsGNUの場合は、lsこの-vオプションを使用して数値で並べ替えることができます。

ls -1v

または:

ls -1vd -- *

isは1.20が1.4より大きい出力などの項目をソートし、ワイルドカード修飾子はバージョン番号(たとえば1.20が1.4より大きい項目)をソートするsort -hため、同じではありません。sort -hdu -h1.12G999Mls -vzsh(n)

これを理解するglobbingが本当に必要な場合は、そのためのzshソート関数を作成する必要があります。

zshを使用すると、関数を使用してグローバルソート順序を定義します*(o+that-function)that-function$REPLYzshn

それは次のとおりです。

h() {
  local -A x
  local match
  setopt localoptions extendedglob
  x=(k 1 K 1 M 2 G 3 T 4 P 5 E 6)
  REPLY=${REPLY//(#b)((|[0-9]#.)[0-9]##)([${(kj::)x}])/$((match[1]*2**$x[$match[3]]0))}
}

すべての1.1Gは対応する値(1181116006.4)に置き換えられます。

その後、次のように使用できます。

ls -1Ud -- *(no+h)

-UGNUlsオプションでls いいえパラメータを並べ替えます。)

ただし、これは小数部のある数字ではうまく機能しません。1.20たとえば、次のようにソートされます1.3

$ ls
1.20  1.3  3.1G  500M
$ ls -v1Ud -- *(no+h)
1.3
1.20
500M
3.1G

オプションのサフィックス(たとえば、-1e20M、1E-20、100k、3000M)を使用してさまざまな小数の浮動小数点数を並べ替えることができる場合、正の10進整数は辞書式または数字でのみ並べ替えることができるzshため、これらの浮動小数点を文字列として変換する関数が必要です。辞書式で同じ順序でソートするか、正の 10 進整数を同じ順序で数字でソートします。

zsh浮動小数点および小数点算術は、使用可能な場合は64ビットの数値を使用して実行されるため、浮動小数点関数を適用してこれらの数値(または少なくとも浮動小数点数がサポートする範囲)を0から263zshの整数に変換できます。ログ関数を使用することはオプションかもしれません。それは次のとおりです。

zmodload zsh/mathfunc
h() {
  local -A x
  local match v
  setopt localoptions extendedglob
  x=(k 1 K 1 M 2 G 3 T 4 P 5 E 6 Z 7 Y 8)
  REPLY=${REPLY//(#b)([-+]|)(([0-9]#.|)[0-9]##([eE]([-+]|)[0-9]##|))\
([${(kj::)x}]|)/[$(([#10]1e15*(1500+ $match[1](745+log((v=$match[2]\
${${match[2]##*[Ee.]*}:+.}*2.**$x[$match[6]]0)==0?2.48e-324:v)))))]}
}

次のように使用されます。

print -rl -- *(no+h)

または、数値の順序に戻り、1000000000000000001と100000000000000002を区別します(たとえば、ログとzsh浮動小数点精度は同じです)。

print -rl -- *(noe:h:on)

その後、私たちは次のより良いものを得ますsort -h

$ ls | sort -h
-4
-3
+20
a2
b1
b10
b2
1e-20Y
1e3
1.20
1.3
3
20
999
1000 1e9
1000 900M
1001
1024
1k
12k
0.000000001G

$ print -rl -- *(noe:h:on)
-4
-3
0.000000001G
1.20
1.3
3
20
+20
999
1e3
1000 900M
1000 1e9
1001
1k
1024
1e-20Y
12k
a2
b1
b2
b10

今、特定のnyxmms2質問に対するGilesの答えを補うために、私はあなたが怠惰なタイピストです。今回は定義することもできます選ぶ(「ソート」の代わりに)次の音楽ファイル機能:

m() [[ $REPLY == (#i)*.(mp3|ogg)(-.) ]]

nyxmms2 *Zep*(n+m)

または変数を使用してください。

m='.(#i)(mp3|ogg)(n-.)'
nyxmms2 *Zep*$~m

またはグローバルエイリアス:

alias -g @m='./*.(#i)(mp3|ogg)(n-.)'
nyxmms2 @m

数値グローブソートのみをオンにするには、nyxmms2次のようにします。

preexec() {[[ $1 = nyxmms2* ]] && setopt numericglobsort}
precmd setopt nonumericglobsort

答え4

これを行うには、いつでもシェル拡張を使用できます。

nyxmms2 add $(ls /path/to/dir/*.mp3 | sort -n)

音楽作業をしているので「プレイリスト」を作ることもできます。

ls /path/to/album/or/song/*.mp3 | sort -n >> /path/to/playlist
nyxmms2 add < /path/to/playlist

関連情報