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在本例中)。
这是一个只有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)。
| 归档时间: |
|
| 查看次数: |
607 次 |
| 最近记录: |