在 zsh 中隨機排列檔案名稱參數

在 zsh 中隨機排列檔案名稱參數

假設應用程式只能透過命令列參數開啟文件,我將如何隨機化文件名稱/路徑列表來完成此操作?

我認為這應該相當簡單,但顯然空間使它變得比應有的更複雜。


一個例子:

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 的變體,去掉了lsand 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)}, 則不然。

相關內容