2017-10-18 135 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