run*_*ind 6 scripting bash directory shell-script for
如何更改for track in *.mp3; do
以便.mp3
以随机方式遍历当前目录中的所有文件?
作为参考,在 中zsh
,您可以影响使用o
globbing 限定符展开的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)
您可以使用该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
并且文件名不包含换行符。