我有这个 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
当然,如果您喜欢单行代码,您可以删除反斜杠和换行符;)