востаннє файл відкрився


94

Чи можливо отримати час, коли файл було відкрито востаннє і сортувати всі файли в каталозі до тих часів?

Відповіді:


172

Це залежить від того, що саме ви маєте на увазі під "відкритим", але загалом, так. Зазвичай записуються три часові позначки:

  • mtime- оновлюється при зміні вмісту файлу. Це час файлу «за замовчуванням» у більшості випадків.
  • ctime- оновлюється, коли файл або його метадані (власник, дозволи) змінюються
  • atime - оновлюється, коли файл читається

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

Хоча є великий застереження. Оновлення аніме кожного разу при читанні файлу викликає багато, зазвичай, непотрібного вводу-виводу, сповільнюючи все. Отже, більшість дистрибутивів Linux за замовчуванням відповідає noatimeпараметру монтажу файлової системи, який в основному вбиває atimes, або інше relatime, що оновлює atimes лише після того, як ліміт пройшов (як правило, один раз на день) або якщо файл був фактично змінений з попереднього читання. Ви можете дізнатися, чи активовані ці параметри, виконавши mountкоманду.

Також зауважте, що час доступу визначається за допомогою inode, а не за назвою файлу, тому, якщо у вас є жорсткі посилання, читання з одного сайту оновить усі імена, що посилаються на той самий файл.

І майте на увазі, що c - це не «творення»; створення не відслідковується файловими системами Unix / Linux, що здається дивним, але насправді має сенс, оскільки файлова система не може знати, чи є оригіналом - можливо, файл був створений сорок років тому і скопійований сюди. І насправді багато редакторів файлів працюють, роблячи копії над оригіналом. Якщо вам потрібна ця інформація, найкраще скористатися системою контролю версій на зразок git.


9
Я дав би вам більше +1, якби міг, просто за те, щоб не називати ctime "Часом створення".
jsbillings

2
Згідно з програмою Mount Mount, Relatime не має нічого спільного з щоденними обмеженнями, а лише дивиться на atime щодо mtime та ctime. Якщо atime старше mtime або ctime, atime оновлюється. Якщо аніме новіший за обидва, то він залишається в спокої. Метою цього є збереження зв'язку між atime та mtime / ctime, оскільки деякі програми використовують цю інформацію, як mutt, щоб побачити, чи прочитав він вашу поштову скриньку з моменту останнього оновлення.
jw013

1
@ jw013 Так було з ядра 2.6.30 Це правда, що деякі старі дистрибуції можуть не мати такої поведінки. (Але для дистрибутивів, як Fedora, це було правдою навіть тоді, коли я писав оригінальну версію цієї відповіді три роки тому.) Шукайте оновлену сторінку сторінки mount.
mattdm

1
lsскорочує час за замовчуванням до розумної точності. Щоб побачити час у повній точності, можна скористатися --full-time.
jlh

19

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

4

findКоманда найкраще підходить для цього. Дивіться -ctime, -mtimeі -atimeваріанти


3

Якщо ваш список призначений для споживання людиною, використовуйте lsодин з прапорців -tuдля сортування дат ( для доступу (читання) часу, просто -tдля зміни (запису) часу або -tcдля зміни часу введення). Дивіться відповідь mattdm для отримання додаткової інформації (зокрема застереження щодо -aта визначення цього поняття -c).

Якщо це для програмного споживання, то аналіз синтаксичного сигналу lsє проблематичним . Якщо ваша оболонка zsh, вам все одно не знадобиться ls: zsh має класифікатори глобального сортування, щоб сортувати відповідність, збільшуючи час доступу ( *(Oa)), inode change ( *(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 ...

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.