各フォルダにオーディオファイルが含まれているフォルダがたくさんあります。各ファイルの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
->N
glob修飾子(ファイルがない場合は空の配列を作成します)。shopt -s dotglob
->D
glob修飾子(名前がドットで始まるファイルを除外しない)。- GNU
sort -Rz
:(noe['REPLY=$RANDOM']
ランダムな順序でソートしてリストをミックスします。) ${array[@]:offset:length}
->$array[first,last]
(zshはKornシェル構文もサポートしていますが、zshクリーナーを見つけました.)- 任意のファイル名を処理するには、
bash
NULで区切られたレコード(-d ''
/-z
/)を使用します。リストは単一の文字列/ストリームに変換されないため、\0
必要ありません。zsh
答え2
ls | shuf -n $(( $(ls | wc -l) * 30 / 100))
あなたがしなければならないのは、ファイルの数と割合をそれぞれ見つけることです。そのために
$(ls | wc -l)
まず、ディレクトリ内のファイル数を計算します$(( x * 30 /100))
その数の30%を見つけるために算術演算が行われます。- 最後に、その番号を渡して
shuf -n
任意のファイルのリストを取得します。