Ответы:
Это зависит от того, что именно вы подразумеваете под «открытым», но в целом да. Обычно записываются три метки времени:
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
:
-u with -lt: sort by, and show, access time with -l: show access
time and sort by name otherwise: sort by access time
Если ваш список предназначен для использования человеком, используйте ls
один из флагов сортировки даты ( -tu
для времени доступа (чтения), только -t
для времени модификации (записи) или -tc
для времени изменения индекса). См . Ответ mattdm для получения дополнительной информации (в частности, предостережение относительно -a
и определение -c
).
Если это для потребления программы, анализ вывода ls
проблематичен . Если ваша оболочка zsh, вам все ls
равно это не нужно : у zsh есть глобирующие квалификаторы для сортировки совпадений путем увеличения времени доступа ( *(Oa)
), изменения inode ( *(Oc)
) или модификации ( *(Om)
). Строчные o
сортирует по возрасту.
act_on_files_by_date *(Om)
В противном случае, если вы знаете, что имена файлов не содержат символов новой строки или непечатаемых символов (в текущей локали), то вы можете сделать что-то вроде
ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}
Если вы хотите вызвать команду для нескольких файлов одновременно, вам нужно больше настроек. Обратите внимание, что act_on_files_by_date $(ls -t)
это не работает так, поскольку имена файлов, содержащие символы подстановки или пробелы, будут расширены в результате подстановки команды. Следующий код работает до тех пор, пока ни одно имя файла не содержит символ новой строки или непечатаемый символ:
IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS
Если вы хотите справиться с произвольными именами файлов, вам будет очень трудно без использования более мощных инструментов, чем стандартная оболочка: zsh, perl, python…