シェル(bash)の質問です。

(例えですが)複数のファイルのサイズをチェックするシェルを作成します。
対象のファイルは、そのリストをファイルに保存(1行1ファイルをフルパスで記述)します。
→ file.lst

このfile.lst中のファイルで`date +%Y%m%d`(対象のファイルの日時=シェルの実行日時で良い)を使用しているものがある場合に、正しいファイル名として取得するにはどうすれば良いでしょうか?

説明がわかりづらくて申し訳ありませんが、よろしくお願いします。
※上記は問題をなるべくシンプルにした例なので、その点もご了承ください。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/11/25 19:10:56
  • 終了:--

回答(2件)

id:nyomonyomo No.1

@~/かける/にょも回答回数17ベストアンサー獲得回数02005/11/25 20:37:09

ポイント25pt

質問の内容がファイルのサイズをチェックする物なのかファイル名の日付をチェックする物かがわからないのですがファイル名の日付をチェックをする物なら以下の内容でできるはずです

file.lstの内容が

/home/test/sample

/home/test/date20051125.txt

/test/date20051125.txt

/home/test/date20051124.txt

/test/date20051124.txt

/home/test/date20051125.jpg

/home/test/date.jpg

/etc/date.jpg

/home/test/date20051125.dat

/home/test/20051125.txt

の場合

/test/date20051125.txt

/home/test/date20051125.jpg

/home/test/date20051125.dat

だけを表示する

dateの出力形式がFri Nov 25 20:34:07 JST 2005の場合


#!/bin/sh

MON=`date | cut -d ’ ’ -f 2`

DAY=`date | cut -d ’ ’ -f 3`

YEAR=`date | cut -d ’ ’ -f 6`

NUM=1

LIST=”Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec”

for NAME in $LIST

do

if [ $NAME == $MON ]

then

MON=$NUM

fi

NUM=`expr $NUM + 1`

done


while read LINE

do

NAME=`echo $LINE | sed ”s/.*¥(date$YEAR$MON$DAY¥).*/OK/”`

[ $NAME == ”OK” ] && echo $LINE

done < file.lst

id:P-mako

ご回答ありがとうございます。でも、ちょっとポイントがズレています。

【file.lstの内容】

/var/log/foo.log

/var/log/hoge`date +%Y%m%d`.log

/var/log/bar_`date +%y%m%d`.log

のような場合に、2〜3行目のような表記のファイル名を正しく取得するにはどうすれば良いか?ということです。

2行目:/var/log/hoge20051125.log

3行目:/var/log/bar_051125.log

という意味です。

「ファイルサイズを」というのはあくまでも例なので、(勝手な想像で)回答の摩り替えは、ご遠慮ください。

2005/11/25 23:10:33
id:nyomonyomo No.2

@~/かける/にょも回答回数17ベストアンサー獲得回数02005/11/25 23:47:58

ポイント25pt

http://www.chimimo.com/sed/

RetroEngine: sed アーカイブ

それではこちらでどうでしょう?

読み込んだ文字列から置換によって別の文字列に置き換えるのならsedというコマンドを使うとできます


#!/bin/sh

MON=`date | cut -d ’ ’ -f 2`

DAY=`date | cut -d ’ ’ -f 3`

YEAR=`date | cut -d ’ ’ -f 6`

NUM=1

LIST=”Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec”

for NAME in $LIST

do

if [ $NAME == $MON ]

then

MON=$NUM

fi

NUM=`expr $NUM + 1`

done


while read LINE

do

NAME=$(echo $LINE | sed ’s/¥(.*¥)¥(`date ¥+.*`.*¥)/OK/’)

if [ $NAME == OK ]

then

NAME=`echo $LINE|sed ”s/%[Yy]/${YEAR}/”|sed ”s/%[Mm]/${MON}/”|sed ”s/%[Dd]/¥${DAY}/”`

NAME=$(echo $NAME|sed ’s/`date +//’|sed ’s/`//’)

fi

echo $NAME

done < file.lst

id:P-mako

まだ説明が足りなかったみたいですね。

ようは、file.lst中のファイルは、いろいろな形式なわけですよ。

(それは1つ目の回答を見てください)

`date +%Y%m%d`は例であって、`date +%y%m`であったり、`date +%Y-%m-%d` e.t.cがあり得るわけです。

なので、sedで置換というのはちょっと観点がズレてますし、そもそも`date +%Y%m%d`の意味を理解してないのに、回答しないでください。

2005/11/27 12:22:25
  • id:junjun777
    ありゃ、終わっちゃった

    残念。こんなんでどう?と書いてたとこでしたが。
    ---
    while read target
    do
    eval declare tarfile=”$target”
    if [ -f ”$tarfile” ] ; then
    ls -l ”$tarfile”
    else
    echo ”$tarfile is not found.”
    fi
    done
    ---
    で、
    # hoge.sh < file.lst
    とか。
  • id:P-mako
    Re:ありゃ、終わっちゃった

    >残念。こんなんでどう?と書いてたとこでしたが。
    ご回答ありがとうございます。

    完璧です。ポイントは、eval declareということですね。

    junjun777さんに全ポイントを差し上げたいくらいです。
    もう少し、オープンしておけば良かったと後悔してます。
  • id:junjun777
    Re(2):ありゃ、終わっちゃった

    >完璧です。ポイントは、eval declareということですね。

    お役に立てて、なによりです。
    喜んでいただけるのが、最大のポイントです。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません