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\"
同样,-b
get的转义也被转义了: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
在本例中)。
这是一个只有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+R
shuffle 部分:
bindkey -s '^R' '(oe:REPLY=\\$RANDOM:)^M'
Run Code Online (Sandbox Code Playgroud)
现在,只输入mplayer *.mp3
后跟CTRL+R
,该(oe:REPLY=\$RANDOM:)
部分将被追加并立即执行命令行 ( ^M
)。
归档时间: |
|
查看次数: |
607 次 |
最近记录: |