以下代码创建目录中的文件列表,然后以随机顺序对它们进行打乱,然后将文件吐出到名为 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