在 Bash 中,如何从静态列表中随机选择一个文件?

在 Bash 中,如何从静态列表中随机选择一个文件?

我有这个 bash 脚本

while true ; do for i in * ; do cp "$i" ~/slideshow.jpg ; echo $i ; sleep 5 ; done ; done

我怎样才能随机化这个过程?

答案1

我觉得这个问题就像家庭作业一样。我来帮你做吧。

*在该脚本中,可能会返回按字母顺序排列的目录列表。因此,您可以截取该列表并在此时进行随机化。

您还可以将目录内容加载到数组中,随机选择一个数字 - 对数组大小取模,如果结果为空,则向前推进直到遇到非空条目。然后在使用该条目时清空该条目。您需要一个计数器或其他东西来跟踪您使用了多少元素,以便您知道何时使用了所有条目。

此外,您可以将条目加载到类似链接列表的东西中,并提出一个随机条目#来使用,然后从数据结构中丢弃。

可能还有很多其他选择。但我只是给你提供了 3 种粗略方法的草图。当然我没有为你写代码,但我做了难的部分。不用客气 ;)

答案2

据我所知,以下内容可在任何 POSIX 系统上运行。

可以使用以下方法获取随机排序的文件列表:

for i in *; do echo "$i"; done |                              \
  awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' | \
  sort |                                                      \
  cut -f2-

解释:

  • for i in *; do echo "$i"; done给出文件列表,每行一个。
  • awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }'在每一行中添加一个 [0,1) 范围内的随机数字段。
  • sort使用该随机数作为索引进行排序,从而使文件列表随机化。
  • cut -f2-删除随机数字段。

原始命令(带有复制和休眠)可以构造如下:

for i in $(for i in *; do echo "$i"; done |                              \
             awk 'BEGIN { OFS="\t"; srand (); } { print rand (), $0 }' | \
             sort |                                                      \
             cut -f2-);                                                  \
do                                                                       \
  cp "$i" ~/slideshow.jpg;                                               \
  echo "$i";                                                             \
  sleep 5;                                                               \
done

当然,如果您喜欢单行代码,您可以删除反斜杠和换行符;)

相关内容