shuf命令在find -exec中是不是随机的?

时间:2017-10-18 23:34:09

标签: bash unix terminal zsh

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

我希望看到.flac文件的名称,然后是./backgrounds中其中一个文件的随机名称。

相反,我看到了这一点:

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中选择随机文件?

1 个答案:

答案 0 :(得分:2)

shell正在扩展

"$(ls -p backgrounds | grep -v / | gshuf -n 1)"
在执行find之前

到一个字符串,该字符串尽职尽责地调用echo "the same string every time"

获得所需内容的一种方法是每次在新shell中运行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")}'