web-dev-qa-db-ja.com

`ls -lt`は正確なmtimesに従うのでしょうか、それとも秒単位までのおおよそのmtimesに従うのでしょうか?

ls -lは、秒までのファイルの変更タイムスタンプのみを表示します。 2つのファイルのタイムスタンプが2番目まで同じであるが、正確に同時に変更されていない場合、ls -lt正確なmtimesの順序でファイルを順序付けますか、または最大で秒までのおよそmtimesだけです(したがって、ファイル間の順序は任意です)?

10
Tim

それはlsの実装に大きく依存します。 GNU/Linuxシステムで見つかった4つのうち、次のものがここにあります。

$ touch a; touch c; touch b; stat -c %y a c b
2018-01-10 12:52:21.367640342 +0000
2018-01-10 12:52:21.371640148 +0000
2018-01-10 12:52:21.375639952 +0000
  • GNU ls 、GNUプロジェクトからのもの(GNUcoreutilsコレクション)これは、GNU Debian(LinuxまたはkFreeBSDカーネル)、Cygwin、Fedoraなどのシステムで一般的に見られるものです。

    $ gnu-ls -rt
    a  c  b
    
  • OpenSolarisツールの移植版である Heirloom Toolchestls

    $ heirloom-ls -rt
    a  b  c
    
  • AT&Tオープンソースコレクションlsは、ksh93に組み込まれている可能性があります。かなりの数の豪華な拡張機能を持つ別のもの:

    $ ast-ls -rt
    a  c  b
    $ PATH=/opt/ast/bin:$PATH ksh93 -c 'type ls; ls -rt'
    ls is a Shell builtin version of /opt/ast/bin/ls
    a  c  b
    
  • busybox(ほとんどの(一般的に埋め込まれた)Linuxベースのシステムで見つかった(または派生物)):

    $ busybox ls -rt
    c  b  a
    

したがって、これらのうち、GNUおよびast lsは秒の小数部を考慮します。その他は、同じ秒以内に最後に変更されたファイルの字句比較にフォールバックします。busyboxls-rを尊重します。

私のテストでは、FreeBSDのlsも1秒未満の精度をサポートしています(VFSレベルで有効になっている場合、vfs.timestamp_precision sysctlを参照)。

zshのグロブ(変更時間に順序付けするomグロブ修飾子、逆の順序にOmを使用)にも全時間がかかります。

$ echo *(Om)
a c b

[ file1 -nt file2 ]、サポートされている場合、一般的に1秒未満の粒度もサポート

17

GNUのls実装に関しては、ls -lを実行するとファイルがアルファベット順に並べ替えられ、ls -ltを使用するとファイルが変更時刻順に新しい順に並べられ、基礎となるファイルシステム。これは、--full-timeオプションを使用して確認できます。

したがって、あなたの質問に答えるために、はい、最大限に拡張できますが、-tを使用する場合(そうでない場合は、デフォルトでアルファベット順になります)で、それをサポートする実装を使用している場合のみ (詳細についてはステファンの答え )。たとえば、ext4は、必要なタイムスタンプデータを格納するのに十分な大きさのiノードがある場合、ナノ秒の精度をサポートできます。

4
Joe

の出力を比較すると、

ls -lat

そして

ls -lat --full-time

ソートについては恣意的なことは何もありません。

1
D'Arcy Nader

はい、そうです。

テストするには、わずかな時間差で2つのファイルを作成します。

$ touch aa; sleep 0.2; touch bb

変更時間を確認します。

$ stat -c %y bb aa
2018-01-07 20:51:19.364248042 0000
2018-01-07 20:51:19.072248226 0000

リストはそのような違いを使用します:

$ ls -lt aa bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 bb
-rw-r--r-- 1 user user 0 Jan  7 20:51 aa

--full-time違いは明らかになります。

$ ls -lt --full-time aa bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.364248042 0000 bb
-rw-r--r-- 1 user user 0 2018-01-07 20:51:19.072248226 0000 aa
1
Isaac