日付順はどの順序ですか?確かに英数字順ではありません。
ls -lt
変更時刻でソートします。しかし、作成時間は必要です。
日付順はどの順序ですか?確かに英数字順ではありません。
ls -lt
変更時刻でソートします。しかし、作成時間は必要です。
回答:
ほとんどの大学には、ファイル作成時間の概念がありません。あなたは作ることができないls
情報が記録されていないので、それを印刷します。作成時間が必要な場合は、バージョン管理システムを使用します。作成時間をチェックイン時間として定義します。
UNIXバリアントに作成時間がある場合は、そのドキュメントを参照してください。たとえば、Mac OS X(私が知っている唯一の例¹)では、を使用しますls -tU
。Windowsは作成時間も保存しますが、unixユーティリティのポートに常に公開されるls
わけではありません。たとえば、Cygwinには表示するオプションがありません。このstat
ユーティリティは、GNUユーティリティでは「birth time」と呼ばれる作成時間を表示できるため、Cygwinでは、を使用して誕生時間でソートされたファイルを表示できますstat -c '%W %n' * | sort -k1n
。
ctime(ls -lc
)はファイル作成時間ではなく、iノード変更時間であることに注意してください。iノードの変更時間は、ファイルが変更されるたびに更新されます(コンテンツまたはメタデータ)。ただし、ctimeは、ファイルが読み取られるだけでは更新されません(atimeが更新されても)。特に、mtimeが将来の日付に明示的に設定されていない限り、ctimeは常にmtime(ファイルコンテンツの変更時間)よりも最新です。
-U
作成時間でソートします。Solaris 10.xの場合:を/usr/bin/ls
サポートせず-U
、/usr/ucb/ls
サポートし-U
、作成時間でソートします。これらの結果は明らかに、そもそもその情報を保存しているファイルシステムに依存しています。
残念ながら、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
このコマンドは、おそらくファイルに関連するすべてのエクステントもリストするため、戻るのに時間がかかる場合があります。
作成日までにファイルを並べたい場合、これは簡単に(または適切に)不可能だと思います。以下のようジルは言うあなたはリビジョン管理システムを使用したい場合、それはおそらく容易になるだろう。しかし、あなたはext4
APIを見てみることができます...
私は(最近の)Ubuntuシステムのファイルシステムでstat -c '%w' myfile
コマンドを試してみましたが、ext4
成功しませんでした(答えるだけです-
)。
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
これは、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 };
}