2017-10-18 65 views
0
find dev-other -iname '*.flac' -exec echo {} \; -exec echo "$(ls -p backgrounds | grep -v/| gshuf -n 1)" \; 

我希望看到一個.flac文件的名稱,然後從./backgrounds的文件之一的隨機名稱。shuf命令在find -exec裏面是不是隨機的?

相反,我看到這一點:

dev-other/4515/11057/4515-11057-0087.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0091.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0029.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0028.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0090.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0069.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0086.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0100.flac 
Wind.mp3 
dev-other/4515/11057/4515-11057-0045.flac 
Wind.mp3 

對於find的發現,同樣的「隨機」的文件從./backgrounds選擇每個文件。

如何在查找-exec內選擇一個隨機文件?

回答

2

殼正在執行find,其忠實地調用echo "the same string every time"之前擴大

"$(ls -p backgrounds | grep -v/| gshuf -n 1)" 

到單個字符串。每一次,例如在一個新外殼內運行echo

find dev-other -iname '*.flac' -print \ 
    -exec sh -c 'ls -p backgrounds | grep -v/| gshuf -n 1' \; 

或者,不要試圖做這個工作find - 其他工具更適合。例如,awk可以輕鬆地通過數據並在每一行上運行命令。

find dev-other -iname '*.flac' | 
    awk '1;{system("ls -p backgrounds | grep -v/| gshuf -n 1")}' 
+0

我懷疑它可能是這樣的,不知道我可以用一個單獨的shell來規避它。有沒有比這更簡潔的方法? – theonlygusti

+0

@theonlygusti給出的替代方案。 – ephemient