前提・実現したいこと
シェルスクリプトで、「カレントディレクトリ内のとある1つのファイル」を特定したい。
経緯
他サーバから受け取った圧縮ファイルやログを、1つのディレクトリへ保管しています。
今回作成するシェルスクリプトで、「ディレクトリ内のとある1つのファイル」を特定したいです。
ディレクトリ内の存在するファイルのフォーマットは↓
固定識別子_YYYYMMDDhhmmss(日時)_サーバ名.拡張子
対象のディレクトリ内 $ ls -alt Foo_20200128073001_bar.gz Foo_20200128073001_foo.gz Foo_20200128085905_ham.gz Foo_20200128085905_ham.log Foo_20200128090002_spam.log Foo_20200128100501_spam.gz Foo_20200128100501_spam.log Foo_20200128100601_spam.gz Foo_20200128100701_spam.gz Foo_20200128100702_spam.gz←★今回取り出したい最新のgzファイル Foo_20200128100702_spam.log
抽出条件
(1)スクリプト実行時に文字列を第1パラメータとして渡す。それがファイル名にあるサーバ名(上記例でいうとspam)と一致していること。
(2)拡張子が「gz」であること。
(3)日時欄が「最新(最大値)」であること。ファイルのタイムスタンプは無視し、あくまでファイル名から取得したい。
結果は常に1つのファイル名になります。
試したこと
中途半端ですが、(2)まではできました。
sh
1$ test.sh spam 2---------------- 3#!/bin/bash - 4 5# ディレクトリを指定(今回はカレントディレクトリ固定) 6DIR=$(cd $(dirname $0); pwd) 7 8# 「(1)サーバ名が第1引数と一致」and 「(2)拡張子が.gz」のファイル名のみ取得する 9for pathfile in $DIR/*$1.gz; 10do 11 echo $pathfile 12done 13 14# ↑結果 15# $ sh test.sh spam 16# /tmp/Foo_20200128100501_spam.gz 17# /tmp/Foo_20200128100601_spam.gz 18# /tmp/Foo_20200128100701_spam.gz 19# /tmp/Foo_20200128100702_spam.gz 20 21# (3) 上記の結果からさらに、最新(ファイル名の日時欄が最大)のファイルを特定 22## sortコマンドを使うことは想像していますが、実際にどうしていいかわかりません 23## 正規表現で1つめから2つめのアンダーバーの間を取得するのが、一番手間がないでしょうか
(3) 上記(2)の結果から、最新(ファイル名の日時欄が最大)のファイルを特定したい。
sortコマンドを使うことは想像していますが、実際にどうしていいかわかりません。
「正規表現で1つめから2つめのアンダーバーの間を取得する→降順に並べ替える」がよいでしょうか?
また、どのように書けばよいでしょうか。
自分ではうまく思いつかず、投稿しました。
よい方法をご存知のかた、ご教示いただけますとうれしいです。
補足情報(FW/ツールのバージョンなど)
CentOS7
bash

回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/29 09:55
2020/01/29 15:47