【问题标题】:Bash: obtaining a shuffled list of filenames-with-spaces on a single line (as argument)?Bash:在单行(作为参数)上获得带空格的文件名的打乱列表?
【发布时间】:2018-12-31 16:04:56
【问题描述】:

假设我有这个脚本,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 test.sh *.mp3 | shuf?
  • 谢谢@Cyrus - 但这个test.sh 是另一个程序的替代品;我需要将正确的文件作为参数放入其中
  • cvlc --random *.mp3?

标签: bash


【解决方案1】:

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

# 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-

【讨论】:

  • 如果文件名可能包含换行符(这在 unix 中是完全合法的),您可以改组数组索引,如我的回答 here
  • @GordonDavisson:谢谢。我会照顾它的。这是个好主意。没有shuf的路漫漫其修远兮,就是多次随机选择两个索引,交换内容。
猜你喜欢
  • 1970-01-01
  • 2010-12-07
  • 2011-04-27
  • 1970-01-01
  • 1970-01-01
  • 2018-10-30
  • 1970-01-01
  • 2018-08-22
相关资源
最近更新 更多