lsを実行して、作成日で結果を並べ替えるにはどうすればよいですか?


112

日付順はどの順序ですか?確かに英数字順ではありません。

ls -lt変更時刻でソートします。しかし、作成時間は必要です。



1
そこファイルがext4ファイルシステム上にある場合はLinuxでのファイルの作成時刻を取得する方法であるように見えます。参照:unix.stackexchange.com/a/131347/182996
kaartic

回答:


94

ほとんどの大学には、ファイル作成時間の概念がありません。あなたは作ることができないls情報が記録されていないので、それを印刷します。作成時間が必要な場合は、バージョン管理システムを使用します。作成時間をチェックイン時間として定義します。

UNIXバリアントに作成時間がある場合は、そのドキュメントを参照してください。たとえば、Mac OS X(私が知っている唯一の例¹)では、を使用しますls -tU。Windowsは作成時間も保存しますが、unixユーティリティのポートに常に公開されるlsわけではありません。たとえば、Cygwinには表示するオプションがありません。このstatユーティリティは、GNUユーティリティでは「birth time」と呼ばれる作成時間を表示できるため、Cygwinでは、を使用して誕生時間でソートされたファイルを表示できますstat -c '%W %n' * | sort -k1n

ctimels -lcはファイル作成時間はなくiノード変更時間であることに注意しください。iノードの変更時間は、ファイルが変更されるたびに更新されます(コンテンツまたはメタデータ)。ただし、ctimeは、ファイルが読み取られるだけでは更新されません(atimeが更新されても)。特に、mtimeが将来の日付に明示的に設定されていない限り、ctimeは常にmtime(ファイルコンテンツの変更時間)よりも最新です。


1
ではCygwinのそれがありますls -cls --help何を示している-cと組み合わせると行い-l-lt
アーロンD.マラスコ

6
@Aaronいいえ、ctimeは作成時間ではありません。「ctime」と「作成」が同じ文字で始まるという事実だけに基づいた一般的な混乱ですが、ctimeと作成時間の間に関係はありません。この混乱に対処するために回答を更新しました。
ジル

大爆笑だ。yaのCygwin部分を確認しようとしていました(元の投稿に可能なコマンドがあるIIRC)。私が注意を払っていた場合、具体的には「ctime(ファイルステータス情報の最終変更時刻)」と言います。
アーロンD.マラスコ

@Gilles回答に追加; 私はNFS 3.xファイルサーバーを使用しています(基礎となるファイルシステムについては不明です。UFSまたはZFSのいずれかですが、UFSを推測しています)。Redhat 6.xの場合:-U作成時間でソートします。Solaris 10.xの場合:を/usr/bin/lsサポートせず-U/usr/ucb/lsサポートし-U、作成時間でソートします。これらの結果は明らかに、そもそもその情報を保存しているファイルシステムに依存しています。
ブライアンヴァンデンバーグ

1
@ghotiディレクトリ内でファイルが削除(または移動/名前変更/ハードリンク/…)されていない場合、ディレクトリ順序は一部のファイルシステムでは作成順ですが、すべてではありません。たとえば、ext4には当てはまりません。SolarisのUFSに当てはまるかどうかはわかりません。
ジル

16

残念ながら、stat(2)APIはUnixの標準では必要とされていないため、ファイル作成時間を取得する方法を提供していません。

ただし、一部のファイルシステムではext4、この情報をファイルメタデータ内に保存します。それを取得する標準的な方法はありませんが、方法がありextます(ファイルシステムのみ):

debugfs -R 'stat partition/relative/path/to/file' /dev/sda1

を使用すると、そのような言及が得られますcrtime(ではありません ctime!)ext4

 ctime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
 atime: 0x513dd8f1:04df0b20 -- Mon Mar 11 14:15:29 2013
 mtime: 0x513a50e5:d4e448f0 -- Fri Mar  8 21:58:13 2013
crtime: 0x513a259a:35191a3c -- Fri Mar  8 18:53:30 2013

このコマンドは、おそらくファイルに関連するすべてのエクステントもリストするため、戻るのに時間がかかる場合があります。

作成日までにファイルを並べたい場合、これは簡単に(または適切に)不可能だと思います。以下のようジルは言うあなたはリビジョン管理システムを使用したい場合、それはおそらく容易になるだろう。しかし、あなたはext4APIを見てみることができます...

私は(最近の)Ubuntuシステムのファイルシステムでstat -c '%w' myfileコマンドを試してみましたが、ext4成功しませんでした(答えるだけです-)。


誰でも1つのライナーが必要な場合:f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Boop

3

これは、Totorの答えを使用して(ファイルシステムがext4の場合)目的を達成するPerlスクリプトです。

自宅のマシン(Ubuntu)とサーバー(CentOS)で動作しますが、それ以上はテストされていないため、ymmvです。

#!/usr/bin/env perl

use Modern::Perl '2009';

use DateTime;


# Open the current directory for reading
opendir my $dh, "." or die "Unable to open directory: $!";

# Create a hash to save results into
my %results;
my %datestamp;

# Loop through the directory getting creation date stats for each file
while ( my $filename = readdir $dh ) {
    # Skip non-files
    next if $filename eq '.' or $filename eq '..';

    # Save the ls output for this file/directory
    $results{ $filename } = `ls -ld $filename`;

    my $stats = `debugfs -R 'stat $filename' /dev/sda6 2>/dev/null`;
    # crtime: 0x51cd731c:926999ec -- Fri Jun 28 12:27:24 2013
    $stats =~ m/crtime\: \w+\:\w+ -- (.+?)\n/s;
    my $datestring = $1;

    # Dissect date with a regexp, ick
    my %months = (
        'Jan' => '1',
        'Feb' => '2',
        'Mar' => '3',
        'Apr' => '4',
        'May' => '5',
        'Jun' => '6',
        'Jul' => '7',
        'Aug' => '8',
        'Sep' => '9',
        'Oct' => '10',
        'Nov' => '11',
        'Dec' => '12',
    );
    $datestring =~ m/\w+ (\w+)  ?(\d+) (\d\d)\:(\d\d)\:(\d\d) (\d\d\d\d)/;

    # Convert date into a more useful format
    my $dt = DateTime->new(
        year   => $6,
        month  => $months{$1},
        day    => $2,
        hour   => $3,
        minute => $4,
        second => $5,
    );

    # Save the datestamp for this result
    $datestamp{ $filename } = $dt->iso8601;
}

# Output in date order
my @filenames = sort { $datestamp{$a} gt $datestamp{$b} } keys %datestamp;

foreach my $filename ( @filenames ) {
    print $results{ $filename };
}

また、一部のファイルには、作成日時を記録するメタデータ(exifなど)が含まれる場合があることにも言及してください。たとえば、すべてのファイルがデジタル写真である場合、おそらくこのデータがあります。perlのImage :: ExifToolを使用し例を次に示します。
ジョナサンクロス

0

このコマンドls -lctを使用して、作成日ごとにファイルをソートします。


2
うん、それは「正しい」コマンドではありませんが、ほとんどの場合、探しているものです
-madnight

「find」でこれを行う方法はありますか?サブディレクトリ内のすべてのファイルをこのように印刷しますか?
コリンD

これctimeは変更時間であり、作成時間ではありません。
ナビKAZ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.