Можно ли узнать время, когда файл был открыт в последний раз, и отсортировать все файлы в каталоге по тем временам?
Это зависит от того, что именно вы подразумеваете под «открытым», но в целом да. Обычно записываются три метки времени:
mtime
- обновляется при изменении содержимого файла. В большинстве случаев это время файла по умолчанию.ctime
- обновляется при изменении файла или его метаданных (владелец, разрешения)atime
- обновляется при чтении файлаИтак, как правило, вы хотите увидеть atime
файл. Вы можете получить это с stat
или с ls
. Вы можете использовать ls -lu
для этого, хотя я предпочитаю использовать ls -l --time=atime
(что должно поддерживаться почти во всех современных дистрибутивах Linux), потому что я использую его не часто, и когда я это делаю, я лучше помню его. И чтобы отсортировать по времени, добавьте -t
флаг в ls. Итак, поехали.
Однако есть большая оговорка. Обновление atime каждый раз, когда файл читается, вызывает много обычно ненужных операций ввода-вывода, замедляя все. Таким образом, большинство дистрибутивов Linux по умолчанию используют noatime
опцию монтирования файловой системы, которая в основном убивает время от времени, или же relatime
, которая обновляется только раз после того, как предел превышен (обычно один раз в день) или если файл был фактически изменен с момента предыдущего чтения. Вы можете узнать, активны ли эти опции, запустив mount
команду.
Также обратите внимание, что время доступа указывается по индексу, а не по имени файла, поэтому, если у вас есть жесткие ссылки, чтение из одного из них обновит все имена, которые относятся к одному и тому же файлу.
И имейте в виду, что с не "создание"; создание не отслеживается файловыми системами Unix / Linux, что кажется странным, но на самом деле имеет смысл, потому что файловая система не может узнать, является ли она оригиналом - возможно, файл был создан сорок лет назад и скопирован здесь. И, на самом деле, многие файловые редакторы работают, делая копии поверх оригинала. Если вам нужна эта информация, лучше использовать систему контроля версий, например git
.
mount
страницу руководства.ls
сокращает время по умолчанию до разумной точности. Чтобы увидеть время с полной точностью, можно использовать--full-time
.ls -ltu
список всех файлов, показывая и сортируя по времени доступа.От
man ls
:источник
Команда
find
лучше всего подходит для этого. Смотрите-ctime
,-mtime
и-atime
вариантыисточник
Если ваш список предназначен для использования человеком, используйте
ls
один из флагов сортировки даты (-tu
для времени доступа (чтения), только-t
для времени модификации (записи) или-tc
для времени изменения индекса). См . Ответ mattdm для получения дополнительной информации (в частности, предостережение относительно-a
и определение-c
).Если это для потребления программы, анализ вывода
ls
проблематичен . Если ваша оболочка zsh, вам всеls
равно это не нужно : у zsh есть глобирующие квалификаторы для сортировки совпадений путем увеличения времени доступа (*(Oa)
), изменения inode (*(Oc)
) или модификации (*(Om)
). Строчныеo
сортирует по возрасту.В противном случае, если вы знаете, что имена файлов не содержат символов новой строки или непечатаемых символов (в текущей локали), то вы можете сделать что-то вроде
Если вы хотите вызвать команду для нескольких файлов одновременно, вам нужно больше настроек. Обратите внимание, что
act_on_files_by_date $(ls -t)
это не работает так, поскольку имена файлов, содержащие символы подстановки или пробелы, будут расширены в результате подстановки команды. Следующий код работает до тех пор, пока ни одно имя файла не содержит символ новой строки или непечатаемый символ:Если вы хотите справиться с произвольными именами файлов, вам будет очень трудно без использования более мощных инструментов, чем стандартная оболочка: zsh, perl, python…
источник