【问题标题】:shuf command isn't random inside of find -exec?shuf 命令在 find -exec 中不是随机的吗?
【发布时间】:2018-03-30 22:52:40
【问题描述】:
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 中选择随机文件?

【问题讨论】:

    标签: bash unix terminal zsh


    【解决方案1】:

    外壳正在膨胀

    "$(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")}'
    

    【讨论】:

    • 我怀疑可能是这样,但不知道我可以使用单独的外壳来规避它。还有比这更简洁的方法吗?
    • @theonlygusti 给出了替代方案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-07
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2013-01-13
    • 2018-09-13
    • 2017-01-27
    • 1970-01-01
    相关资源
    最近更新 更多