随机遍历目录中的文件

run*_*ind 6 scripting bash directory shell-script for

如何更改for track in *.mp3; do以便.mp3以随机方式遍历当前目录中的所有文件?

Sté*_*las 9

作为参考,在 中zsh,您可以影响使用oglobbing 限定符展开的glob的顺序。例如*.mp3(om)按修改时间排序。您可以使用函数定义自己的排序顺序。

使用*.mp3(o+foo),文件被排序,不是基于它们的名称,而是基于foo函数在$REPLY给定文件名的变量中返回的值(并foo接收文件名$REPLY)。因此,例如:

rand() REPLY=$RANDOM

for i in *.mp3(o+rand); do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)

你得到一个随机顺序。

POSIXly,如果您不想对文件名可能包含的内容做出任何假设,您可以执行以下操作:

shuffle() {
  awk -v q="'" 'BEGIN {
    printf "set --"
    for (i=1; i < ARGC; i++) {
      r=int(rand()*(ARGC-1)+1);x=ARGV[i];ARGV[i]=ARGV[r];ARGV[r]=x
    }
    for (i=1;i<ARGC;i++) {
      a=ARGV[i];gsub(q, q "\\" q q, a);printf " %s", q a q
    }
    print "";exit}' "$@"
}
eval "$(shuffle *.mp3)"
for i do
  echo "$i"
done
Run Code Online (Sandbox Code Playgroud)


dou*_*BTV 5

您可以使用该shuf命令为您洗牌。只需在您拥有 *.mp3 的列表命令上反引号并将其通过管道传输到shuf,例如:

#!/bin/bash -
SAVEIFS=$IFS
IFS=$'\n'; set -f
for i in `find . -maxdepth 1 -iname '*.mp3' -type f | shuf`
do
    echo "$i"
done
IFS=$SAVEIFS; set +f
Run Code Online (Sandbox Code Playgroud)

上面假设 GNUfind并且文件名不包含换行符。