階層分けされた相当な数のjpgファイルの中からランダムに1つ抜き出すにはどうすればいいですか

大量のファイルの中からランダムに1つだけを抽出するのは、手動では大変ですよね。
お使いの環境(Windows、Mac/Linux、またはPython)に合わせて、最も効率的な方法を紹介します。


1. Windows (PowerShell) を使う場合

特別なソフトをインストールせずに、標準機能だけで実行できます。

  1. 対象のルートフォルダ(一番上のフォルダ)を「Shift + 右クリック」します。
  2. PowerShell ウィンドウをここで開く」を選択します。
  3. 以下のコマンドをコピーして貼り付け、Enterを押します。

powershell

Get-ChildItem -Recurse -Filter *.jpg | Get-Random | Invoke-Item
  • 解説: Get-ChildItem -Recurse でサブフォルダまで全検索し、Get-Random で1つに絞り、Invoke-Item でそのファイルを開きます。

2. Mac / Linux (ターミナル) を使う場合

MacやLinuxの方は、ターミナルで以下のコマンドを実行するのが最も早いです。

  1. ターミナルを開き、対象フォルダへ移動します(cd /path/to/folder)。
  2. 以下のコマンドを実行します。

bash

find . -type f -iname "*.jpg" | shuf -n 1 | xargs open
  • 解説: find で全jpgを探し、shuf -n 1 でシャッフルして1行だけ取り出し、open で開きます。

3. Python を使う場合

もし「特定のフォルダにコピーしたい」など、その後の処理も自動化したい場合はPythonが便利です。

python

import os
import random
import glob

# 検索したいルートディレクトリを指定
root_dir = './your_folder_path' 

# 再帰的にjpgファイルをリストアップ
files = glob.glob(f"{root_dir}/**/*.jpg", recursive=True)

if files:
    random_file = random.choice(files)
    print(f"選ばれたファイル: {random_file}")
    # os.startfile(random_file) # Windowsでファイルを開く場合
else:
    print("jpgファイルが見つかりませんでした。")

💡 ヒント:ファイル数が「万」を超える場合

ファイル数が膨大な場合、OSの検索機能(エクスプローラーの検索窓に *.jpg と入力)を使い、検索結果が出揃ったところで適当にスクロールして目をつぶってクリックするのが一番アナログで速いこともあります。

次に行いたい作業はありますか?
「選んだファイルを特定のフォルダに集めたい」「名前を書き換えたい」など、具体的な要望があればコードを作成します。

Ubuntuの端末でjpgファイルを抜き出してfbi(フレームバッファイメージビューワー)で表示させたいです。

Ubuntuのターミナル(CUI環境)で、階層下のJPGからランダムに1つ選んで 

fbi で表示するには、以下のコマンドを組み合わせて実行します。

実行コマンド

対象のディレクトリに移動した状態で、以下のワンライナーを実行してください。

bash

find . -type f -iname "*.jpg" | shuf -n 1 | xargs -I {} sudo fbi -T 1 -a {}

コマンドの解説

  1. find . -type f -iname "*.jpg": カレントディレクトリ以下の全階層から、拡張子が .jpg(大文字小文字問わず)のファイルをリストアップします。
  2. | shuf -n 1: リストをシャッフルし、その中から1行(1ファイル)だけをランダムに抜き出します。
  3. | xargs -I {} sudo fbi -T 1 -a {}:
    • xargs -I {}: 前のコマンドの結果を {} という場所に代入して実行します。
    • sudo fbifbi はフレームバッファデバイス(/dev/fb0)に直接書き込むため、通常は 管理者権限 が必要です。
    • -T 1: 使用する仮想コンソール(TTY1など)を指定します。これがないとエラーになる場合があります。
    • -a: 画像を画面サイズに合わせて自動リサイズして表示します。 

注意点

  • 仮想コンソールでの実行fbi は X Window System(デスクトップ環境)上のターミナルエミュレータからは直接表示できませんCtrl + Alt + F3 などで切り替えた黒い画面(仮想コンソール)で実行してください。
  • デスクトップ環境で表示したい場合: もしGUI環境のターミナルから画像を表示したいのであれば、fbi の代わりに eog(Eye of GNOME)などを使うのが一般的です。bashfind . -type f -iname "*.jpg" | shuf -n 1 | xargs eog コードは注意してご使用ください。
  • 権限エラーの回避: 毎回 sudo を使いたくない場合は、ユーザーを video グループに追加することで解決できる場合があります。bashsudo usermod -aG video $USER コードは注意してご使用ください。(※実行後、再ログインが必要です) 

このコマンドを実行する環境は、サーバー版などのCUI環境(黒い画面)でしょうか? それともデスクトップ版のターミナルでしょうか?

CUIです

UbuntuのCUI(仮想コンソール)環境で、階層下のJPGからランダムに1つを選び、

fbi で表示するコマンドは以下の通りです。

実行コマンド

bash

find . -type f -iname "*.jpg" | shuf -n 1 | xargs -I {} sudo fbi -noverbose -T 1 -a {}

各オプションの解説

  • find . -type f -iname "*.jpg": カレントディレクトリ以下の全階層から、拡張子が .jpg(大文字小文字問わず)のファイルをリストアップします。
  • shuf -n 1: リストからランダムに1行(1ファイル)だけを抽出します。
  • xargs -I {} sudo fbi ... {}: 抽出されたパスを fbi コマンドに渡します。
    • sudofbi はフレームバッファ(画面描画デバイス)に直接アクセスするため、通常は管理者権限が必要です。
    • -noverbose: 画面下部のステータスバーを非表示にし、画像だけを綺麗に映します。
    • -T 1: 出力先の仮想端末(TTY)を指定します。SSH経由や特定の環境で「Invalid argument」エラーが出るのを防ぐために有効です。
    • -a: 画面サイズに合わせて画像を自動的に拡大・縮小(オートズーム)します。 

うまくいかない場合の代替案

もし fbi でエラーが出る、あるいはより高機能なツールを使いたい場合は、後継ソフトである fim (fbi improved) がおすすめです。

  1. インストールsudo apt install fim
  2. 実行コマンド:bashfind . -type f -iname "*.jpg" | shuf -n 1 | xargs -I {} fim -a {} コードは注意してご使用ください。
    • fim はデバイスの自動検出機能に優れており、fbi よりも安定して動作することが多いです。 

表示された画像を閉じるには q キーを押してください。 他に「一定時間ごとに自動で切り替えたい」などの要望はありますか? 

はい、一定時間ごとに画像を切り替えることを考えています。15~20秒ごと

CUI環境での自動スライドショーですね。

fbi には標準で自動巡回機能がありますが、「ランダムに選び続ける」という動作をさせるには、シェルスクリプトの while ループで回すのが最も確実です。

以下のコマンドをターミナルに貼り付けて実行してください。

実行コマンド(15秒ごとにランダム切り替え)

bash

while true; do
    find . -type f -iname "*.jpg" | shuf -n 1 | xargs -I {} sudo fbi -T 1 -t 15 -1 -a -noverbose {}
done

解説

  • while true; do ... done: 手動で終了(Ctrl+C)するまで、無限に処理を繰り返します。
  • -t 15fbi が画像を 15秒間 維持するように指定します。
  • -1: 1枚表示したらすぐに fbi を終了させ、ループの先頭(次のランダム抽出)に戻るようにします。
  • -noverbose: 切り替え時に画面下のファイル名表示などを消し、没入感を高めます。

より滑らかに動作させたい場合(fim 推奨)

fbi は起動のたびに画面が暗転しがちです。もし fim をインストール済みであれば、以下のコマンドの方がスマートに動作します。

bash

# fim を使う場合(15秒おき)
find . -type f -iname "*.jpg" | shuf | fim -a -p -t 15
  • shuf: 最初に全ファイルをシャッフルしてリスト化します。
  • -p: パイプからの入力を受け取ります。
  • -t 15: 15秒ごとに自動で次の画像へ進みます。

補足

  • 終了方法Ctrl + C でループを止めることができます。
  • 秒数の調整-t 15 の数字を 20 に変えれば20秒間隔になります。

特定のフォルダだけを除外したい、あるいは特定の時間になったら停止させたいといった追加の条件はありますか?

ありません。やってみます。また質問があったら書き込みますね。

承知いたしました!ぜひ試してみてください。

while ループを使った方法は、「毎回リストをシャッフルし直す」ので、ファイル数が膨大でも偏りなくランダムに表示され続けるはずです。

もし途中で「特定のフォルダだけ読み込まないようにしたい」や「画像が横向きになってしまうのを直したい」といったことがあれば、いつでもお気軽に書き込んでくださいね。

無事にスライドショーが動くことを願っています!Ctrl + C でいつでも終了できるので、安心してお試しください。