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

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

ただいまの
回答率

90.52%

  • Linux

    3761questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Linux コマンドで、大量ファイルのファイル名検索を素早くしたい

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 204

arcrista_qg

score 16

 前提・実現したいこと

特定のファイル名に日付をつけて保存するシステムを作りました。(AAA_YYYMMDDHHmmss.txt)
ファイル名の日付で最新のファイルを取得したいので「ls」コマンドで実現していました。

しかし、万単位で大量のファイルが作られていることがあり「ls」コマンドではエラーが出て機能を一時停止しています。
別の実現方法を探しているのですが、どうもうまくいかずに困っており、質問させていただきました。

lsコマンドでも、エラーが出ないようにできればいいのですが…。
ちなみに、更新順では要件を満たせない状態ですので、文字列ソートを使用するのかなと思っておりました…。

data
├AAA
|├AAA_20180101235959.txt
|├AAA_20181001235959.txt
|└AAA_20181201235959.txt    //このファイルが欲しい

└BBB
├BBB_20180101235959.txt
├BBB_20181001235959.txt
└BBB_20181201235959.txt    //このファイルが欲しい

 発生している問題・エラーメッセージ

「引数が多すぎます」

 該当のソースコード

ls -v /AAA/AAA_*.txt | head -1
ls -v /BBB/BBB_*.txt | head -1

 試したこと

>軽くする方法、というので試したものの、思う結果にたどり着けなかったコマンド
ls -v -U /AAA/AAA_*.txt | head -1

>結果が返ってこなくなってしまったコマンド
find /AAA/ -type f | grep "AAA-*.txt" | head -1 //ひとまず試しのつもりでした…
find /AAA/ -type f -regex "AAA-*.txt" | sort -n | head -1

 補足情報(FW/ツールのバージョンなど)

>万単位で大量のファイルが作られていること
これは一時的に回避ができない状態であると判明しています。(削除間隔は調整していますが、どうしても発生し得るものになります)

>更新順では要件を満たせない状態
お恥ずかしい話ですが、ファイル内容を手動で変更をする手順が存在し、今のところ更新順では欲しいファイルが取得できません。
手順の是正が後回しにしたためにこのようなことになっているのは理解しております…。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

+1

そもそもlsのような外部プログラムを呼ぶから大変なのでは。必要なのはファイル名だけのようなのでシェルのワイルドカード展開で十分ではないでしょうか。例えば、
for file in /AAA/AAA_*.txt;do echo $file;done | head -1
でどうでしょう。
※注意点1
パスにスペースが含まれていると動かない可能性があります
※注意点2
ワイルドカードにマッチしない場合、変数$fileの値は「/AAA/AAA_*.txt」という文字列になります

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 18:15

    早速のご回答、ありがとうございます!
    確認いたしまして、こちらでも期待する結果をいただけました!
    マッチしない場合もありますので、使用させていただく際、注視いたします!

    キャンセル

+1

「このファイルが欲しい」というのと、head -1が矛盾しますが、「このファイルの方が欲しい」(最新のファイル名のファイルが欲しい)が正しいとして回答します。

他にファイルが無いのなら、

ls -r /AAA | head -1

他のファイルがあるのであれば、kaztoさんの案のようにgrepsedですね。

ls -r /AAA | grep '^AAA_.*\.txt$' | head -1
ls -r /AAA | sed -n '/^AAA_.*\.txt$/{p;q}'`

いずれもディレクトリ名/AAAは付かないのであとで補ってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 18:15

    早速のご回答、ありがとうございます!
    確認いたしまして、こちらでも期待する結果をいただけました!

    ただ、「^」や「$」がなぜか使用できない環境でしたので、使用させていただく際は抜いて使わせていただきます!

    キャンセル

checkベストアンサー

0

ls -v /AAA/AAA_*.txt | head -1

上記のように、アスタリスクで展開してしまっているため、引数の個数制限にひっかかるのでしょう。

ls -v /AAA/ | grep -e AAA_ -e .txt | head -1


では、いかがでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 15:48

    早速のご回答、ありがとうございます!

    すみません、機器の不調か、サーバーにアクセスできなくなってしまったので、そちら解決してから試させていただきます…!
    見た感じ、いけそうな気がしています…!

    キャンセル

  • 2018/07/19 18:15

    確認いたしまして、期待する結果をいただけました!
    ありがとうございます!

    キャンセル

0

ls -v /AAA/AAA_*.txt | head -1


ls -v /AAA/AAA_*.txt | tail -n 1

ではダメですか?
件数が多すぎてlsの結果をパイプで渡すことがNG、ですかね?

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/19 15:48

    早速のご回答、ありがとうございます!

    すみません、機器の不調か、サーバーにアクセスできなくなってしまったので、そちら解決してから試させていただきます…!

    >件数が多すぎてlsの結果をパイプで渡すことがNG、ですかね?
    見た感じだけですが、たぶんこれにあたるかと…。でも、ひとまず試してみます!

    キャンセル

  • 2018/07/19 18:15

    「引数リストが長すぎます」が出てしまいました…。

    キャンセル

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

  • ただいまの回答率 90.52%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Linux

    3761questions

    Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。