質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

Q&A

解決済

2回答

3577閲覧

ディレクトリ以下の拡張子を持ったファイルの取得方法について

jo7oem

総合スコア9

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

sh

shは、UNIX系OSのシェル操作の1つであり、最も基本的なシェルのことです。

0グッド

0クリップ

投稿2017/07/05 06:15

###前提・実現したいこと
あるディレクトリ以下のある拡張子を持ったファイルからランダムに一つ選択したい。

具体的な用途としては$HOME/pict 以下から{jpg,jpeg}といった壁紙に使える画像を取得したい
もっと早く動くように出来るならば教えていただきたい。
###発生している問題
ls では直下のみ
./*/.*jpg では一階層したしか取れないため深さに限度がある
findの結果をランダムソートをしてみたがそこがボトルネックとなるのか動作が遅い

###該当のソースコード

bash

1$(find $WALL |grep -e '\.\(jpeg\|jpg\)'|sort -R|head -n 1)

###試したこと
とりあえずfind の結果をフィルタしてsortした

###補足情報(言語/FW/ツール等のバージョンなど)
ubuntu 16.04

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

GNU coreutils が使えるなら、

bash

1find [基準ディレクトリ] -regex '.+\.jpe?g' | shuf -n 1

でどうでしょう。

find で regex を使うことで正規表現で絞り込み(find の regex はパス全体にマッチする(常に ^ が先頭につく)ので、.+ で任意のファイル名までのパスを意味させ、.;jpe?g で、拡張子が .jpg か .jpeg に絞り込んでいます)、その後 shuf で結果行の中から1行だけ(どこかを)取り出しています。

投稿2017/07/05 06:33

tacsheaven

総合スコア13703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

まずは簡単な所から

$(find $WALL |grep -e '\.\(jpeg\|jpg\)'|sort -R|head -n 1)

これは

$(find . -name "*.jpg" -or -name "*.png"|sort -R|head -n 1)

に置き換えられます(grep を排除しました)。ストリームなのでそれほどパフォーマンスが上がるとは限りませんが。

また sort -R | head -1 なので head は一つ目の候補以外は捨てているはずです。高速化するのであればここかな、と考えました。最初のアイテムが見付かったら終了してもいいかなと思いましたが、ランダムに一定の揺らぎを持たせるのであれば、分母である画像ファイル数を固定にしないといけません。いろいろ考えてみましたが僕であれば以下の様に作ると思います。

bash

1#!/bin/bash 2 3if [ ! -f filelist.txt ] || [ filelist.txt -ot . ]; then 4 find . -name "*.jpg" -or -name "*.png" > filelist.txt 5fi 6shuf -n 1 filelist.txt

この様に新しいファイルがやってくるまではキャッシュした画像ファイル一覧から候補を選ぶ様に作ると思います。これを PATH の通った場所に置いて使います。(find のパス . 等は環境に合わせて修正する必要があります。)

投稿2017/07/05 06:37

mattn

総合スコア5030

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jo7oem

2017/07/05 12:49

ありがとうございます。 ディレクトリの更新時刻がその中のファイルの変更時刻とは知らなかったので勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問