ファイルを見つけて、いくつかのファイルをプレイリストの最初に指定し、残りの部分をランダムな順序で指定しますか?

ファイルを見つけて、いくつかのファイルをプレイリストの最初に指定し、残りの部分をランダムな順序で指定しますか?

次のコードはディレクトリにファイルのリストを作成し、ランダムな順序で混合し、ファイルを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

最初の行は、検索するすべてのファイルの配列を(再帰的に)割り当てますが、ランダムにソートします。

2行目は、目的のファイル名の配列を指定します。最初結果リストにあります。

3行目はファイル名をlist.txtに出力します(接頭辞"file ";; 2つの引数はファイルであり、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

関連情報