假设应用程序只能通过命令行参数打开文件,我该如何随机化文件名/路径列表来实现这一点?
我认为这应该相当容易但显然空间使它变得比它应该的更复杂。
一个例子:
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)}
则不行。