在 zsh 中随机播放文件名参数

H.B*_*.B. 2 zsh filenames command-line-arguments

假设应用程序只能通过命令行参数打开文件,我将如何随机化文件名/路径列表来完成此操作?

我认为这应该相当容易,但显然空间使它比应有的更复杂。


一个例子:

a.mp3
b.mp3
带空格.mp3

当我尝试时$(ls | shuf),空间没有逃脱,产生类似with space.mp3 b.mp3 a.mp3.

使用 quote 选项-Q也无济于事,因为命令替换会转义引号,导致以下结果:\"with space.mp3\" \"a.mp3\" \"b.mp3\"

同样,-bget的转义也被转义了:with\\ space.mp3 a.mp3 b.mp3

没有发现之类find的东西-exec <application> {} \+将是完美的......

小智 5

你根本不需要ls。尝试

mplayer "${(f)$(shuf -e *.mp3)}"
Run Code Online (Sandbox Code Playgroud)

问题ls在于它经常被别名为类似的东西ls --color=always,在这种情况下会打印其他程序无法正确识别的不可见字符(shuf在本例中)。


mpy*_*mpy 5

这是一个只有zsh的变体,摆脱ls以及shuf

mplayer *.mp3(oe:REPLY=\$RANDOM:)
Run Code Online (Sandbox Code Playgroud)

Glob 限定符在两个冒号 ( )之间o执行 ( e) 代码:。该代码依次为每个文件分配一个伪随机数$RANDOM,从而产生任意顺序。

为了使命令更加模糊,但主要是为了保存击键,您可以定义一个 shell 函数s

s() { REPLY=$RANDOM }
mplayer *.mp3(oe:s:)
Run Code Online (Sandbox Code Playgroud)

或者,更好的是,定义一个键绑定,例如用于CTRL+Rshuffle 部分:

bindkey -s '^R' '(oe:REPLY=\\$RANDOM:)^M'
Run Code Online (Sandbox Code Playgroud)

现在,只输入mplayer *.mp3后跟CTRL+R,该(oe:REPLY=\$RANDOM:)部分将被追加并立即执行命令行 ( ^M)。