1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

bashでランダムに同階層のファイル名を1つ取得する

Posted at

同階層の全ファイル中からランダムでファイル名を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 )

流れ的には

  1. ファイル名の一覧を出す
  2. 一行読みだし, $file_nameへ格納する
  3. select_numが0なら$file_nameを出力し, ループから抜け出す
  4. select_numの値を1つ減らす
  5. 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の後ろに条件を書くだけです.

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?