そのため、ファイル名を入力として使用するコンソールプレーヤーでいくつかの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
有効なパターンのアルファベット順が必要な場合は、n
glob修飾子を取り消してください。
print -lr -- *(^n)
答え2
ls
1つの方法は、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
引数はとにかくソートされ、デフォルトではアルファベット順にソートされます。
ls
GNUの場合は、ls
この-v
オプションを使用して数値で並べ替えることができます。
ls -1v
または:
ls -1vd -- *
isは1.20が1.4より大きい出力などの項目をソートし、ワイルドカード修飾子はバージョン番号(たとえば1.20が1.4より大きい項目)をソートするsort -h
ため、同じではありません。sort -h
du -h
1.12G
999M
ls -v
zsh
(n)
これを理解するglobbingが本当に必要な場合は、そのためのzshソート関数を作成する必要があります。
zshを使用すると、関数を使用してグローバルソート順序を定義します*(o+that-function)
。that-function
$REPLY
zsh
n
それは次のとおりです。
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)
(-U
GNUls
オプションで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