Solaris9標準付属のコマンドで、ファイルの変更日時を秒まで取得して「ファイル名_YYYYMMDDHHMISS」にリネームするシェルスクリプトを教えてください。

例えば、ファイル名が「logfile.txt」でファイルの変更日時が「2007年3月1日16時43分53秒」の場合は「logfile.txt_20070301164353」にリネームします。
※Solaris10ではないので、lsコマンドでは秒まで取得できません。

回答の条件
  • 1人10回まで
  • 登録:2007/03/01 16:54:57
  • 終了:2007/03/07 14:24:18

ベストアンサー

id:cubick No.1

cubick回答回数125ベストアンサー獲得回数362007/03/01 19:30:29

ポイント70pt

シェルではなくPerlになってしまうのですが、、

#!/usr/bin/perl

$old = "$ARGV[0]";

@stat = stat $old;

($sec,$min,$hour,$mday,$mon,$year) = localtime($stat[9]);
$mon++;$year+=1900;

#printf "%04d/%02d/%02d %02d:%02d:%02d\n",$year,$mon,$mday,$hour,$min,$sec;
$new = "$old" . sprintf "_%04d%02d%02d%02d%02d%02d",$year,$mon,$mday,$hour,$min,$sec;

#print "$new\n";

rename $old,$new or die "$!";

上記スクリプトを適当な名前で保存し、引数にファイル名を指定して実行してみて下さい。

$ rename.pl log.txt

注:カレントディレクトリのファイル名のみ対象です。

id:beti

回答ありがとうございます。

うまくいきました。


上記を、

rename.sh

という名前で

/export/home/hogehoge/bin

に保存し、

/export/home/hogehoge/bin/rename.sh /tmp/testfile.log

を実行したところ、カレントディレクトリ以外でもうまくいきました。

※使い方がおかしかったらご指摘いただければ幸いです。

2007/03/02 07:59:13

その他の回答(1件)

id:cubick No.1

cubick回答回数125ベストアンサー獲得回数362007/03/01 19:30:29ここでベストアンサー

ポイント70pt

シェルではなくPerlになってしまうのですが、、

#!/usr/bin/perl

$old = "$ARGV[0]";

@stat = stat $old;

($sec,$min,$hour,$mday,$mon,$year) = localtime($stat[9]);
$mon++;$year+=1900;

#printf "%04d/%02d/%02d %02d:%02d:%02d\n",$year,$mon,$mday,$hour,$min,$sec;
$new = "$old" . sprintf "_%04d%02d%02d%02d%02d%02d",$year,$mon,$mday,$hour,$min,$sec;

#print "$new\n";

rename $old,$new or die "$!";

上記スクリプトを適当な名前で保存し、引数にファイル名を指定して実行してみて下さい。

$ rename.pl log.txt

注:カレントディレクトリのファイル名のみ対象です。

id:beti

回答ありがとうございます。

うまくいきました。


上記を、

rename.sh

という名前で

/export/home/hogehoge/bin

に保存し、

/export/home/hogehoge/bin/rename.sh /tmp/testfile.log

を実行したところ、カレントディレクトリ以外でもうまくいきました。

※使い方がおかしかったらご指摘いただければ幸いです。

2007/03/02 07:59:13
id:hamster001 No.2

hamster001回答回数474ベストアンサー獲得回数142007/03/02 21:02:43

Solarisでうまく行くか心許ないですが。実行属性をつけてください。


#!/bin/sh

mv $1 logfile_`date +%Y%m%d%H%M%S`

  • id:hamster001
    hamster001 2007/03/02 21:09:35
    回答勘違いしてました。現在時刻でリネームしてしまいます。
  • id:beti
    truss -t lstat -vall ls -l log.txt 2>&1
    で、
    「mt = Mar 3 08:47:25 JST 2007 [ 1172879245 ]」
    の部分が変更日時になるようなのですが、うまく使えないでしょうか。
    「Mar」を3に変換して、それぞれawkを使ってつっこめば、
    できないことはないのですが、よりスマートな方法を
    探しています。


  • id:hamster001
    hamster001 2007/03/03 20:49:17
    ls -l --time-style=iso
    ls -l --time-style=+%Y%m%d%H%M%S
  • id:beti
    回答ありがとうございます。

    Solaris9では、


    bash-2.05$ ls -l --time-style=iso
    ls: オプションが正しくありません -- -
    ls: オプションが正しくありません -- e
    ls: オプションが正しくありません -- -
    ls: オプションが正しくありません -- y
    ls: オプションが正しくありません -- e
    ls: オプションが正しくありません -- =
    使用法: ls -1RaAdCxmnlhogrtucpFbqisfL@ [files]


    bash-2.05$ ls -l --time-style=+%Y%m%d%H%M%S
    ls: オプションが正しくありません -- -
    ls: オプションが正しくありません -- e
    ls: オプションが正しくありません -- -
    ls: オプションが正しくありません -- y
    ls: オプションが正しくありません -- e
    ls: オプションが正しくありません -- =
    ls: オプションが正しくありません -- +
    ls: オプションが正しくありません -- %
    ls: オプションが正しくありません -- Y
    ls: オプションが正しくありません -- %
    ls: オプションが正しくありません -- %
    ls: オプションが正しくありません -- %
    ls: オプションが正しくありません -- H
    ls: オプションが正しくありません -- %
    ls: オプションが正しくありません -- M
    ls: オプションが正しくありません -- %
    ls: オプションが正しくありません -- S
    使用法: ls -1RaAdCxmnlhogrtucpFbqisfL@ [files]

    となりました。

    --time-styleは使えないようでした。
  • id:Bookmarker
    なぜシェルスクリプトにこだわるのでしょうか?
    perlが標準でインストールされるのならPerlスクリプトで良いのでは?
  • id:beti
    はい。
    perlでも問題ありません。

    ただ、運用担当者(メンテする人)に「シェルは分かるがperlが苦手」という人が多いので、シェルスクリプトの方がよりベターです。
  • id:Bookmarker
    *BSDのstatコマンドのようなものがあるならともかく、
    http://www.jp.freebsd.org/cgi/mroff.cgi?subdir=man&lc=1&cmd=&man=stat&dir=jpman-6.2.2%2Fman&sect=0
    >>
    truss -t lstat -vall ls -l log.txt 2>&1
    <<
    なんて方がよっぽどメンテ泣かせだと思うけど。不確実だし。

    せめて、CとかPerl等でファイルの更新時刻を出力するだけのコマンドを作って、それをシェルから呼ぶようにした方が良いのでは?
  • id:beti
    おっしゃる通りだと思います。

    「truss -t lstat -vall ls -l log.txt」
    はスマートではないので、他の方法を探していました。

    シェルでスマートにやれるのであれば、ベストだったのですが、コメントも無いですし、無理のようですので、perlでやりたいと思います。

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

トラックバック

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

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

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