
假設應用程式只能透過命令列參數開啟文件,我將如何隨機化文件名稱/路徑列表來完成此操作?
我認為這應該相當簡單,但顯然空間使它變得比應有的更複雜。
一個例子:
a.mp3
b.mp3
帶空格.mp3
當我嘗試時,$(ls | shuf)
空間不會被轉義,產生類似with space.mp3 b.mp3 a.mp3
.
使用 quote 選項-Q
也沒有幫助,因為指令替換轉義了引號,導致以下結果:\"with space.mp3\" \"a.mp3\" \"b.mp3\"
同樣, get 的轉義-b
也被轉義:with\\ space.mp3 a.mp3 b.mp3
find
沒有發現的東西-exec <application> {} \+
就完美了...
答案1
這是一個僅限 zsh 的變體,去掉了ls
and 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)}
, 則不然。