首页 > 解决方案 > Bash:在单行(作为参数)上获得带空格的文件名的打乱列表?

问题描述

假设我有这个脚本,test.sh

for ix in "$@"; do
  echo -$ix-;
done

编辑:test.sh只是另一个命令行程序的替代品,比如说vlc- 所以我需要它的参数是正确的文件名;我不需要自己修改test.sh

...以及这些文件:

touch "ftest one.mp3"
touch "ftest two.mp3"
touch "ftest three.mp3"

如果我这样做,我会得到正确的输出:

$ bash test.sh ftest*
-ftest one.mp3-
-ftest three.mp3-
-ftest two.mp3-

现在,我想随机化这个列表 - 使用shuf; 但在这种微不足道的情况下,单词是分开的:

$ bash test.sh $(ls ftest* | shuf)
-ftest-
-one.mp3-
-ftest-
-two.mp3-
-ftest-
-three.mp3-

如果我引用子流程部分,那么我会得到一个巨大的字符串 - 仍然不是我想要的:

$ bash test.sh "$(ls ftest* | shuf)"
-ftest two.mp3 ftest one.mp3 ftest three.mp3-

那么,我怎样才能重写子进程,所以当用作 的参数时test.sh,它将提供正确的文件名和空格?

标签: bash

解决方案


我假设您的文件名不包含换行符。

# read files to array "files"
files=(*.mp3)     

# Output array "files", shuffle, read to array "mixed"
mapfile -t mixed < <(printf '%s\n' "${files[@]}" | shuf)

bash test.sh "${mixed[@]}"

输出(例如):

-ftest 三.mp3-
-ftest one.mp3-
-ftest two.mp3-

推荐阅读