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

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

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

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

Q&A

解決済

4回答

3459閲覧

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

arcrista_qg

総合スコア70

Linux

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

0グッド

0クリップ

投稿2018/07/19 05:56

前提・実現したいこと

特定のファイル名に日付をつけて保存するシステムを作りました。(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 //このファイルが欲しい

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

「引数が多すぎます」

該当のソースコード

Linuxコマンド

1ls -v /AAA/AAA_*.txt | head -1 2ls -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/ツールのバージョンなど)

万単位で大量のファイルが作られていること

これは一時的に回避ができない状態であると判明しています。(削除間隔は調整していますが、どうしても発生し得るものになります)

更新順では要件を満たせない状態

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

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

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

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

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

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

guest

回答4

0

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

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

Bash

1ls -r /AAA | head -1

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

Bash

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

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

投稿2018/07/19 06:47

編集2018/07/19 06:51
otn

総合スコア84491

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

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

arcrista_qg

2018/07/19 09:15

早速のご回答、ありがとうございます! 確認いたしまして、こちらでも期待する結果をいただけました! ただ、「^」や「$」がなぜか使用できない環境でしたので、使用させていただく際は抜いて使わせていただきます!
guest

0

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

投稿2018/07/19 06:46

編集2018/07/19 06:49
satocha

総合スコア336

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

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

arcrista_qg

2018/07/19 09:15

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

0

ベストアンサー

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

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

Bash

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

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

投稿2018/07/19 06:05

kazto

総合スコア7196

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

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

arcrista_qg

2018/07/19 06:48

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

2018/07/19 09:15

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

0

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

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

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

投稿2018/07/19 06:02

編集2018/07/19 06:04
sysjojo

総合スコア325

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

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

arcrista_qg

2018/07/19 06:48

早速のご回答、ありがとうございます! すみません、機器の不調か、サーバーにアクセスできなくなってしまったので、そちら解決してから試させていただきます…! >件数が多すぎてlsの結果をパイプで渡すことがNG、ですかね? 見た感じだけですが、たぶんこれにあたるかと…。でも、ひとまず試してみます!
arcrista_qg

2018/07/19 09:15

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問