У якому порядку впорядковані дати? Безумовно, не буквено-цифровий порядок.
ls -lt
сортування за часом модифікації. Але мені потрібен час на створення.
У якому порядку впорядковані дати? Безумовно, не буквено-цифровий порядок.
ls -lt
сортування за часом модифікації. Але мені потрібен час на створення.
Відповіді:
Більшість уніцій не мають концепції часу створення файлів. Ви не можете ls
його надрукувати, оскільки інформація не записується. Якщо вам потрібен час створення, використовуйте систему контролю версій : визначте час створення як час реєстрації.
Якщо ваш варіант Unix має час створення, подивіться його документацію. Наприклад, на Mac OS X (єдиний я відомий приклад example) використовуйте ls -tU
. Windows також зберігає час створення, але він не завжди піддається порту unix-утиліт, наприклад, Cygwin ls
не має можливості його показувати. stat
Утиліта може показати час створення, зване «час народження» в GNU утиліти, так що під Cygwin ви можете показати файли , відсортовані за часом народження з stat -c '%W %n' * | sort -k1n
.
Зауважте, що ctime ( ls -lc
) - не час створення файлу , це час зміни inode . Час зміни inode оновлюється щоразу, коли щось про файл змінюється (вміст або метадані), за винятком того, що ctime не оновлюється, коли файл просто читається (навіть якщо оновлення atime оновлено). Зокрема, ctime завжди пізніший за mtime (час зміни вмісту файлу), якщо 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 ...
Я пробував stat -c '%w' myfile
команду на ext4
файловому файлі в (досить недавній) системі Ubuntu без успіху (вона просто відповідає -
).
f='/path/to/file'; debugfs -R "stat $f" $(df $f|(read a; read a b; echo "$a"))|grep crtime
Ось сценарій Perl, який використовує відповідь Тотора для досягнення того, що ви хочете (якщо ваша файлова система ext4).
Працює на моїй домашній машині (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 };
}
Використовуйте цю команду ls -lct
для сортування файлів за датою створення.
ctime
Час зміни, а не створювати час.