it-swarm-eu.dev

naposledy otevřený soubor

Je možné získat čas, kdy byl soubor naposledy otevřen, a třídit všechny soubory v adresáři podle těchto časů?

101
student

To záleží na tom, co přesně myslíte „otevřeným“, ale obecně ano. Normálně jsou zaznamenána tři časová razítka:

  • mtime - aktualizováno při změně obsahu souboru. Toto je ve většině případů „výchozí“ čas souboru.
  • ctime - aktualizováno při změně souboru nebo jeho metadata (vlastník, oprávnění)
  • atime - aktualizováno při čtení souboru

Obecně tedy chcete vidět atime souboru. Můžete to získat pomocí stat nebo pomocí ls. K tomu můžete použít ls -lu, I když raději používám ls -l --time=atime (Což by mělo být podporováno téměř ve všech moderních distribucích Linuxu), protože jej často nepoužívám, a když si to pamatuje lépe. A do řazení podle času, přidejte do ls příznak -t. Tak to máš.

Existuje však velká námitka. Aktualizace atime pokaždé, když je soubor načten, způsobuje mnoho obvykle zbytečných IO, což vše zpomaluje. Většina linuxových distribucí je tedy nyní nastavena na možnost připojení souborového systému noatime, která v podstatě zabíjí atimes, jinak relatime, která aktualizuje atimes pouze po uplynutí limitu (obvykle jednou denně) nebo pokud soubor byl ve skutečnosti změněn od předchozího čtení. Pokud jsou tyto možnosti aktivní, můžete zjistit spuštěním příkazu mount.

Také si všimněte, že přístupové časy jsou podle inodu, nikoli podle názvu souboru, takže pokud máte hardlinks, čtení od jednoho bude aktualizovat všechna jména, která odkazují na stejný soubor.

A mějte na paměti, že c není „stvoření“; Tvorba není sledována souborovými systémy Unix/Linux, což se zdá divné, ale ve skutečnosti dává smysl, protože souborový systém nemá způsob, jak zjistit, zda je původní - možná byl soubor vytvořen před čtyřiceti lety a zkopírován zde. A ve skutečnosti mnoho editorů souborů pracuje tak, že kopíruje originál. Pokud tyto informace potřebujete, je nejlepší použít systém pro správu verzí, například git.

182
mattdm

ls -ltu seznam všech souborů, zobrazení a třídění podle doby přístupu.

Z 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

Příkaz find je pro toto nejlepší. Podívejte se na -ctime, -mtime, a -atime možnosti

4
GBH

Pokud je váš zápis určen pro lidskou spotřebu, použijte ls s jedním z příznaků třídění podle data (-tu Pro přístup (čtení)), pouze -t Pro změnu (zápis) nebo -tc Pro dobu změny inodu). Pro více informací viz mattdmova odpověď (zejména upozornění týkající se -a A definice -c).

Pokud je to pro spotřebu programu, analýza výstupu ls je problematická . Pokud je vaše Shell zsh, nepotřebujete ls: zsh má kvalifikátory globbing pro třídění zápasů zvýšením přístupu (*(Oa)), inode change (*(Oc) ) nebo modifikace (*(Om)) time. Malá písmena o seřadí podle rostoucího věku.

act_on_files_by_date *(Om)

V opačném případě, pokud víte, že názvy souborů neobsahují žádné nové řádky ani netisknutelné znaky (v aktuálním místním prostředí), můžete udělat něco jako

ls -t | while read -r name; do act_on_one_file "$name"; done
ls -t | xargs -I {} act_on_one_file {}

Pokud chcete vyvolat příkaz na mnoha souborech najednou, potřebujete další nastavení. Všimněte si, že funkce act_on_files_by_date $(ls -t) nefunguje přesně takto, protože názvy souborů, které obsahují zástupné znaky nebo mezery, se v důsledku nahrazení příkazu rozšíří. Následující kód funguje, pokud žádný název souboru neobsahuje nový řádek nebo netisknutelný znak:

IFS='
'
set -f
act_on_files_by_date $(ls -t)
set +f
unset IFS

Pokud se chcete vypořádat s libovolnými názvy souborů, budete mít velmi těžký čas bez použití výkonnějších nástrojů než standardní Shell: zsh, Perl, python…