同階層の全ファイル中からランダムでファイル名を1つ取得
スクリプト
以下に実際のスクリプトを載せます.
# ファイル数の取得
file_num=$( ls -F | grep -v / | wc -l )
# 取得するファイル番号の決定
let select_num=RANDOM%file_num
# ファイル名の取得
choiced_file_name=$(
ls -F | grep -v / |
while read file_name
do
if [ $select_num -eq 0 ]; then
echo $file_name
fi
let select_num--
done )
これらをいくつかの部分に分解して説明していきます.
ファイル数の取得
file_num=$( ls -F | grep -v / | wc -l )
ls -Fでファイルやフォルダを出しますが, -Fがあるのでフォルダ名の後ろに/が付きます.
それをgrepに渡し, -vオプションで/を含まないようなものを列挙させます.
そしてwcでその行数を数え, それをfile_numへ格納します.
取得するファイル番号の決定
let select_num=RANDOM%file_num
bashでは特別な変数$RANDOMに$0\sim32767$の間の値がランダムで格納されています.
それを先ほど取得したファイル数で剰余演算した結果をselect_numへ格納します.
こうすることでselect_numには$0\sim(ファイル数-1)$内の範囲にあるランダムな格納されることになります.
厳密にいえばすべての値が一様の確率で出てはいないですが…
ファイル名の取得
choiced_file_name=$(
ls -F | grep -v / |
while read file_name
do
if [ $select_num -eq 0 ]; then
echo $file_name
break
fi
let select_num--
done )
流れ的には
- ファイル名の一覧を出す
- 一行読みだし,
$file_nameへ格納する -
select_numが0なら$file_nameを出力し, ループから抜け出す -
select_numの値を1つ減らす - 2へ戻る
という感じです.
同階層のある条件にあうファイル名をランダムで1つ取得する
スクリプト
以下に実際のスクリプトを載せます.
# ファイル数の取得
file_num=$( ls *.txt -F | grep -v / | wc -l )
# 取得するファイル番号の決定
let select_num=RANDOM%file_num
# ファイル名の取得
choiced_file_name=$(
ls *.txt -F | grep -v / |
while read file_name
do
if [ $select_num -eq 0 ]; then
echo $file_name
fi
let select_num--
done )
lsの後ろに条件を書くだけです.