フォルダ内のファイルの30%をランダムに選択

フォルダ内のファイルの30%をランダムに選択

各フォルダにオーディオファイルが含まれているフォルダがたくさんあります。各ファイルの30%を選択して別のフォルダにコピーせずに切り取りたいです。私は見ることができますこの投稿各フォルダのファイル数がわかっている場合は、これを行うのに役立ちます。残念ながら、この数字は変更される可能性があるため、これを実行できる単一のパイプラインバスラインが必要です。可能ですか?ファイルの30%を選択して別のフォルダに切り取る方法は?

答え1

4.4+およびGNUシステムでは、bash次のことができます。

readarray -td '' files < <(
  shopt -s nullglob dotglob
  printf '%s\0' * | sort -Rz
)

$files現在のディレクトリにあるすべてのファイルのランダムなリストで配列を入力します。

その後、次を使用してその30%を移動できます。

echo mv -- "${files[@]:0:${#files[@]}*30/100}" /target/directory/

echo満足している場合は削除してください。必要に応じて機能します。)

シェルの対応する内容はzsh次のとおりです。

files=(*(NDnoe['REPLY=$RANDOM']))
echo mv -- $files[1,$#files*30/100] /target/directory/

これは同じアプローチでよりクリーンで外部ユーティリティを必要としません。翻訳する:

  • shopt -s nullglob-> Nglob修飾子(ファイルがない場合は空の配列を作成します)。
  • shopt -s dotglob-> Dglob修飾子(名前がドットで始まるファイルを除外しない)。
  • GNU sort -Rz:(noe['REPLY=$RANDOM']ランダムな順序でソートしてリストをミックスします。)
  • ${array[@]:offset:length}-> $array[first,last](zshはKornシェル構文もサポートしていますが、zshクリーナーを見つけました.)
  • 任意のファイル名を処理するには、bashNULで区切られたレコード(-d ''/ -z/)を使用します。リストは単一の文字列/ストリームに変換されないため、\0必要ありません。zsh

答え2

ls | shuf -n $(( $(ls | wc -l) *  30 / 100))

あなたがしなければならないのは、ファイルの数と割合をそれぞれ見つけることです。そのために

  1. $(ls | wc -l)まず、ディレクトリ内のファイル数を計算します
  2. $(( x * 30 /100))その数の30%を見つけるために算術演算が行われます。
  3. 最後に、その番号を渡してshuf -n任意のファイルのリストを取得します。

関連情報