it-swarm-ru.tech

последний раз файл открывался

Можно ли узнать время, когда файл был открыт в последний раз, и отсортировать все файлы в каталоге по тем временам?

101
student

Это зависит от того, что именно вы подразумеваете под "открытым", но в целом да. Обычно записываются три метки времени:

  • mtime - обновляется при изменении содержимого файла. В большинстве случаев это время файла по умолчанию.
  • ctime - обновляется, когда файл или его метаданные (владелец, разрешения) изменяются
  • atime - обновляется при чтении файла

Итак, как правило, вы хотите видеть atime файла. Вы можете получить это с помощью stat или ls. Ты можешь использовать ls -lu для этого, хотя я предпочитаю использовать ls -l --time=atime (что должно поддерживаться почти во всех современных дистрибутивах Linux), потому что я не часто его использую, и когда я это делаю, я лучше помню его. И чтобы отсортировать по времени, добавить -t флаг для ls. Итак, поехали.

Однако есть большая оговорка. Обновление atime каждый раз, когда файл читается, вызывает много обычно ненужных операций ввода-вывода, замедляя все. Таким образом, в большинстве дистрибутивов Linux по умолчанию используется опция монтирования файловой системы noatime, которая обычно убивает время, или relatime, которая обновляется только один раз после того, как предел пройден (обычно один раз в день), или если файл был фактически изменен с момента предыдущего чтения. Вы можете узнать, активны ли эти опции, запустив команду mount.

Также обратите внимание, что время доступа указывается по индексу, а не по имени файла, поэтому, если у вас есть жесткие ссылки, чтение из одного из них обновит все имена, которые относятся к одному и тому же файлу.

И имейте в виду, что с не является "творением"; создание не отслеживается файловыми системами Unix/Linux, что кажется странным, но на самом деле имеет смысл, поскольку файловая система не может узнать, является ли она оригиналом - возможно, файл был создан сорок лет назад и скопирован здесь. И, на самом деле, многие файловые редакторы работают, делая копии поверх оригинала. Если вам нужна эта информация, лучше использовать систему контроля версий, такую ​​как git.

182
mattdm

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
21
Shawn J. Goff

Команда find лучше всего подходит для этого. Смотрите -ctime, -mtime, а также -atime опции

4
GBH

Если ваш список предназначен для использования человеком, используйте 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…

3