查找文件并指定一些文件在播放列表中排在第一位,其余文件按随机顺序排列?

查找文件并指定一些文件在播放列表中排在第一位,其余文件按随机顺序排列?

以下代码创建目录中的文件列表,然后以随机顺序对它们进行打乱,然后将文件吐出到名为 list.txt 的文本文档中

find *.EXT | sed 's:\ :\\\ :g' | sed 's/^/file /' | sort -R  > list.txt

文件的内容看起来像这样。

file filename_2.EXT
file filename_3.EXT
file filename_1.EXT
file filename_4.EXT
file filename_5.EXT

我真的很想知道是否可以(在终端中,在命令行上非常容易地)指定我希望在 list.txt 中首先看到的文件名,然后像上面的代码一样,其余的文件名是随机的。

我如何能够在命令行上非常轻松地完成此操作,并希望在同一行代码或其他代码中完成此操作,并不重要,只要它能实现我想要实现的目标即可。

find *.EXT | sed 's:\ :\\\ :g' | sed 's/^/file /' | sort -R  > list.txt

它可能看起来像这样:

(这只是为了了解我想要实现的目标)

find *.EXT | xsort --comefirstfiles=filename_3.EXT,filename_1.EXT | xsort --therest random | sed 's:\ :\\\ :g' | sed 's/^/file /' > list.txt

这可能吗?如果不是,那么在与“查找”代码相同的行中执行此操作最接近的选项是什么?

答案1

在 zsh 中:

files=( **/*.EXT(oe'{REPLY=$RANDOM}') )
first=(input3.EXT input5.EXT)
printf 'file %s\n' ${first[@]} ${files:|first} > list.txt

第一行分配您要查找的所有文件的数组(递归地),但对它们进行随机排序。

第二行指定您想要的文件名数组第一的在结果列表中。

第三行将文件名打印到 list.txt (前缀为"file "; 两个参数是文件,first后跟其余部分files- 但后者使用数组删除语法:|从数组中存在的“文件”中删除条目”第一的”。

在此示例输入上:

$ tree .
.
├── input1.EXT
├── input2.EXT
├── input3.EXT
├── input4.EXT
├── input5.EXT
└── subdir
    └── subdirfile1.EXT

第一个示例运行是:

$ files=( **/*.EXT(oe'{REPLY=$RANDOM}') )
$ first=(input3.EXT input5.EXT)
$ printf 'file %s\n' ${first[@]} ${files:|first}
file input3.EXT
file input5.EXT
file subdir/subdirfile1.EXT
file input4.EXT
file input1.EXT
file input2.EXT

随后的示例运行是:

$ files=( **/*.EXT(oe'{REPLY=$RANDOM}') )
$ first=(input3.EXT input5.EXT)
$ printf 'file %s\n' ${first[@]} ${files:|first}
file input3.EXT
file input5.EXT
file input1.EXT
file input2.EXT
file subdir/subdirfile1.EXT
file input4.EXT

相关内容