В каком порядке упорядочены датированные? Конечно, не буквенно-цифровой порядок.
ls -lt
сортирует по времени модификации. Но мне нужно время создания.
В каком порядке упорядочены датированные? Конечно, не буквенно-цифровой порядок.
ls -lt
сортирует по времени модификации. Но мне нужно время создания.
Ответы:
В большинстве офисов нет концепции времени создания файла. Вы не можете ls
распечатать его, потому что информация не записана. Если вам нужно время создания, используйте систему контроля версий : определите время создания как время регистрации.
Если у вашего варианта Unix есть время создания, посмотрите его документацию. Например, в Mac OS X (единственный известный мне пример), используйте ls -tU
. Windows также хранит время создания, но не всегда подвержено воздействию портов утилит unix, например, Cygwin ls
не имеет возможности показать это. stat
Утилита может показать время создания, называемое «время рождения» в GNU утилиты, так что под Cygwin вы можете показать файлы , отсортированные по времени рождения с stat -c '%W %n' * | sort -k1n
.
Обратите внимание, что ctime ( ls -lc
) - это не время создания файла , а время изменения инода . Время изменения 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, который использует ответ Totor для достижения того, чего вы хотите (если у вас файловая система 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
время изменения, а не время создания.