ファイルの最終更新日を見つける必要があるシェルスクリプトを書いています。
Stat
コマンドは私の環境では使用できません。
だから私は望ましい結果を得るために以下のように'ls'
を使用しています。
ls -l filename | awk '{print $6 $7 $8}'
しかし、私は多くのフォーラムで ls
を解析することは一般的に悪い習慣と見なされます だと読んだことがあります。ほとんどの場合(おそらく)正常に動作しますが、常に動作するとは限りません。
シェルスクリプトでファイルの変更日を取得する他の方法はありますか?.
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
お使いの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
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";
}
}
#!/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"