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

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

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

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

Q&A

解決済

1回答

3001閲覧

Bashでファイルをある条件で抽出したい

mamesiba

総合スコア20

bash

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

0グッド

0クリップ

投稿2016/06/08 13:32

編集2016/06/08 16:32

###実現したいこと

Bashでファイルの更新日時から月と日付を見て、ファイルのパスまたはファイル名を抽出したい。

具体的な条件は
5日前のファイルかつ、各月の一番降順のものを一つだけを除き抽出したいです。

例 現在:6月8日の時 5月27日 5月28日 5月31日 6月1日 6月5日 ←5日前ではないので条件に入らず だったら5月27日と5月28日と6月1日を抽出

のような結果がほしいです。
何かいいアドバイスなど頂けないでしょうか?

###何やりたいのか
cronで定期的に一個のダンプファイル生成と

同時にを更新日時を見て、必ず1ヶ月
一個はダンプファイルを残すようにして削除したい
←出来ないのはこの部分

###イメージ1

bash

1#!/bash/bash 2 3find [path]*.gz -mtime +5 -name "*.gz" and 5日前のファイルかつ、各月の一番降順のものを一つだけを除いた条件 4| xargs rm -f 5 6exit 0

###イメージ2

bash

1#!/bash/bash 2 3find [path]*.gz -mtime +5 -name "*.gz" | while IFS= read do 4ここに処理 5done 6 7exit 0

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

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

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

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

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

otn

2016/06/08 15:18

日本語と、書きかけのスクリプトが一致せず、何やりたいのか、わかりません。 あと、「更新日」「更新月」とは何のことですか? つまり、日本語での説明が全然足りていません。
mamesiba

2016/06/08 17:07 編集

不足でした。申し訳ありません。説明不足がありましたら追記します
guest

回答1

0

ベストアンサー

5日前のファイルかつ、各月の一番降順のものを一つだけを除き抽出したいです。

「4日以内のファイルは残す。それを除いた各月の最新のファイルは残す。それ以外は消す」ということですよね。

Bash

1LAST= 2find [path]*.gz -mtime +5 -name "*.gz" | 3while read FILE 4do YM=$(date +%Y%m -r "$FILE") 5 if test "$LAST" = "$YM" 6 then rm "$FILE" 7 fi 8 LAST="$YM" 9done

#追記:
↑これでは駄目ですね。findの結果は更新日時順にソートされている訳じゃない。
毎日1ファイル作られているなら、新しい順にソートして、先頭4行をカットすればいいので、

Bash

1ls -1t *gz | sed 1,4d | 2while read FILE 3・・・

最初、↑で考えていたのですが、「毎日1ファイル作られているとは限らないな」と思い、投稿の直前に、質問文のfindの行をコピペで書き換えてしまいました。
毎日1ファイル作られているとは限らない場合で、同じ条件だと、面倒そうです。

投稿2016/06/08 17:21

編集2016/06/09 07:07
otn

総合スコア84538

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

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

mamesiba

2016/06/09 14:34 編集

そうです。あっています! ありがとうございます!! ちなみにですが、YM=$(date +%Y%m -r "$FILE")の部分ってどういう挙動しているんですか?
otn

2016/06/08 22:11

ファイルの更新日時を、%Y%m の形式で取得します。
mamesiba

2016/06/08 22:36

なるほど、ありがとうございました。
mamesiba

2016/06/09 14:29 編集

動作確認時、質問者がソートの条件忘れてました???? Cronは毎日ではないです。 パイプでいけそうな気はするのですが 難しいですね。 ソースを参考に頑張ってみます。
otn

2016/06/09 14:38

「現時点での最新の4ファイルと、それを除いた各月の最新1ファイルを残す」でいいのであれば、追記に書いたもので良いと思います。
mamesiba

2016/06/09 15:00

ありがとうございます。 でも、もう少し頑張ります…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問