shuf命令在find -exec里面是不是随机的?
问题描述:
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
内选择一个随机文件?
答
壳正在执行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")}'
我怀疑它可能是这样的,不知道我可以用一个单独的shell来规避它。有没有比这更简洁的方法? – theonlygusti
@theonlygusti给出的替代方案。 – ephemient