人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

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

●質問者: P-mako
●カテゴリ:コンピュータ
✍キーワード:bash サイズ シェル シンプル パス
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● @~/かける/にょも
●25ポイント

http://www.linux.or.jp/JM/html/GNU_bash/man1/bash.1.html

Manpage of BASH

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

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

◎質問者からの返答

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

【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

という意味です。

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


2 ● @~/かける/にょも
●25ポイント

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

◎質問者からの返答

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

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

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

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

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ