12

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

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

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

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

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

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

4

4 に答える 4

20

findコマンドを使ってみてはどうですか?

例えば、

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

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

findのman ページには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

于 2012-06-26T21:34:24.743 に答える
5

あなたの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
于 2015-01-05T19:30:43.747 に答える
3

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";
    }
}
于 2012-06-26T22:00:24.743 に答える