web-dev-qa-db-ja.com

解析せずにファイル変更日を取得するUnixコマンド(「stat」と「ls」以外)

ファイルの最終更新日を見つける必要があるシェルスクリプトを書いています。

Statコマンドは私の環境では使用できません。

だから私は望ましい結果を得るために以下のように'ls'を使用しています。

ls -l filename | awk '{print $6 $7 $8}'

しかし、私は多くのフォーラムで lsを解析することは一般的に悪い習慣と見なされます だと読んだことがあります。ほとんどの場合(おそらく)正常に動作しますが、常に動作するとは限りません。

シェルスクリプトでファイルの変更日を取得する他の方法はありますか?.

12
AnonGeek

findコマンドの使用についてはどうですか?

例えば。、

 $ find filenname -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n"

この特定のフォーマット文字列は、次のような出力を提供します:2012-06-13 00:05

find man page は、printfで使用できるフォーマットディレクティブを示し、出力を必要なものに合わせて調整できます。セクション -printf formatにはすべての詳細が含まれています。

lsの出力をfindと比較します。

$ ls -l uname.txt | awk '{print  $6 , "", $7}'
2012-06-13  00:05

$ find uname.txt -maxdepth 0 -printf "%TY-%Tm-%Td %TH:%TM\n"
2012-06-13 00:05

もちろん、PythonまたはPerlなど)などの任意の数の言語でスクリプトを記述して同じ情報を取得できますが、「unixコマンド "は、"ビルトイン "シェルコマンドを探しているように聞こえます。

[〜#〜]編集[〜#〜]

次のように、コマンドラインからPythonをinovkeすることもできます。

$ python -c "import os,time; print time.ctime(os.path.getmtime('uname.txt'))"

または他のシェルコマンドと組み合わせる場合:

$ echo 'uname.txt' | xargs python -c "import os,time,sys; print time.ctime(os.path.getmtime(sys.argv[1]))"

両方が返されます:Wed Jun 13 00:05:29 2012

20
Levon

お使いのOSに応じて

date -r FILENAME

これが動作しないように見えるunixの唯一のバージョンはMac OSです。manファイルによると、-rオプションは次のとおりです。

 -r seconds
         Print the date and time represented by seconds, where seconds is
         the number of seconds since the Epoch (00:00:00 UTC, January 1,
         1970; see time(3)), and can be specified in decimal, octal, or
         hex.

の代わりに

   -r, --reference=FILE
          display the last modification time of FILE
4
dmo

Perlはありますか?

その場合、組み込みのstat関数を使用して、名前付きファイルに関するmtime(およびその他の情報)を取得できます。

次に、ファイルのリストを取得し、各ファイルの変更時間を出力する小さなスクリプトを示します。

#!/usr/bin/Perl

use strict;
use warnings;

foreach my $file (@ARGV) {
    my @stat = stat $file;
    if (@stat) {
        print scalar localtime $stat[9], " $file\n";
    }
    else {
        warn "$file: $!\n";
    }
}

出力例:

$ ./mtime.pl ./mtime.pl nosuchfile
Tue Jun 26 14:58:17 2012 ./mtime.pl
nosuchfile: No such file or directory

File::statモジュールはstat呼び出しをよりユーザーフレンドリーなバージョンで上書きします:

#!/usr/bin/Perl

use strict;
use warnings;

use File::stat;

foreach my $file (@ARGV) {
    my $stat = stat $file;
    if ($stat) {
        print scalar localtime $stat->mtime, " $file\n";
    }
    else {
        warn "$file: $!\n";
    }
}
3
Keith Thompson
#!/bin/bash 
FILE=./somefile.txt

modified_at=`Perl -e '$x = (stat("'$FILE'"))[9]; print "$x\n";'`

not_changed_since=`Perl -e '$x = time - (stat("'$FILE'"))[9]; print "$x\n";'`

echo "Modified at $modified_at"
echo "Not changed since $not_changed_since seconds"
0
user2081279