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
中选择随机文件?
答案 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")}'