在 zsh 中随机排列文件名参数

在 zsh 中随机排列文件名参数

假设应用程序只能通过命令行参数打开文件,我该如何随机化文件名/路径列表来实现这一点?

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


一个例子:

a.mp3
b.mp3
有空格.mp3

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

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

类似地, 的转义-b也将被转义:with\\ space.mp3 a.mp3 b.mp3

如果没有发现的话,类似的东西find将是完美的......-exec <application> {} \+

答案1

这是一个仅适用于 zsh 的变体,它删除了ls以及shuf

mplayer *.mp3(oe:REPLY=\$RANDOM:)

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

为了使命令更加隐蔽,但主要是为了节省按键次数,你可以定义一个 shell 函数s

s() { REPLY=$RANDOM }
mplayer *.mp3(oe:s:)

或者,更好的是,定义一个键绑定,例如,CTRL+R对于随机播放部分:

bindkey -s '^R' '(oe:REPLY=\\$RANDOM:)^M'

现在,仅输入,然后mplayer *.mp3跟上,部分内容就会被附加,并且命令行会立即执行()。CTRL+R(oe:REPLY=\$RANDOM:)^M

答案2

ls你根本不需要。试试

mplayer "${(f)$(shuf -e *.mp3)}"

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

答案3

我想我终于找到了一种方法:${(f)"$(ls | shuf)"}

分解:

ls | shuf:按预期随机排列文件/目录。
"$(...)":引号保持输出原样,包括换行符。
${(f)...}:在换行符处拆分扩展的结果,产生文件/目录名称的数组。


"${(f)$(ls | shuf)}"也可以,,${(f)$(ls | shuf)}则不行。

相关内容