web-dev-qa-db-ja.com

stat:ファイルの変更タイムスタンプ

私が使う stat -f %m .bashrc osx上の.bashrcの変更時間を取得します。しかし、ubuntuで同じコマンドを実行すると、エラーが発生します。

stat: cannot read file system information for %m': No such file or directory

これを達成するための互換性のある方法はありますか?

11
fushupinnanren

UbuntuはGNU coreutils statを使用しますが、OSXはBSDバリアントを使用します。したがって、Ubuntuではコマンドが少し異なります:

stat -c %Y .bashrc

man stat

   -c  --format=FORMAT
          use the specified FORMAT instead of the default; output  a  new‐
          line after each use of FORMAT

そして:

   %Y     time of last data modification, seconds since Epoch

OSに関係なくこれらを実行するポータブルな方法が必要な場合は、いくつかの方法で実行できます。私は変数を一度に適切なパラメータに設定すると思います:

if uname | grep -q "Darwin"; then
    mod_time_fmt="-f %m"
else
    mod_time_fmt="-c %Y"
fi

そして、必要に応じてstatコマンドでこの値を使用します。

stat $mod_time_fmt .bashrc
12
Digital Trauma

「これ」が何を意味するかによります。 stat(1)を使用してファイルのmtimeを取得するポータブルな方法があるかどうかを質問している場合、いいえ、ありません。 BSD stat(1)はLinux stat(1)とは異なります。

ファイルのmtimeを取得するためのポータブルな方法があるかどうかを尋ねている場合は、はい、Perl(1)を使用してそれを行うことができます。

Perl -e 'print +(stat $ARGV[0])[9], "\n"' file
7
Satō Katsura

oSXとUbuntuのバージョンのstatには、OSX statのデフォルトが簡潔な出力である点と、Linux statのデフォルトが冗長であるいくつかのフープをジャンプする必要があるという点で、いくつかの違いがあるためです。 OSXで単にエイリアスを使用する1つの可能性は、statが両方で同じように実行されるようにすることです。

エイリアスを設定して、OSXでstatの詳細出力をalias stat="stat -x"その後、Perlは必要ありません。

stat .bashrc| grep ModifyはUbuntuで必要なすべてです。上記のようにエイリアスを設定すると、 OSXでも機能します

Ubuntu 14.04.5の例Ubuntu 16.04でも実質的に同じ結果が得られます

   stat .bashrc| grep Modify
Modify: 2014-03-30 23:14:47.658210121 -0500

タイムスタンプだけが必要な場合は、Modify:と残りを保持

stat .bashrc| grep Modify | cut -c 9-

出典:

https://ss64.com/osx/stat.html

OSXでのstatの出力

5
Elder Geek