同階層の全ファイル中からランダムでファイル名を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
の後ろに条件を書くだけです.