Toto funguje (aktualizováno tak, aby zahrnovalo návrh Daniela Anderssona):
find -type f -printf '%T+ %p\n' | sort | head -n 1
Tento je trochu přenosnější a protože se nespoléhá na GNU find
rozšíření -printf
, takže to funguje i na BSD / OS X:
find . -type f -print0 | xargs -0 ls -ltr | head -n 1
Jedinou nevýhodou je, že je poněkud omezen na velikost ARG_MAX
(což by mělo být irelevantní pro většinu novějších jader). Pokud je jich tedy více než getconf ARG_MAX
vrácených znaků (262 144 v mém systému), nedává vám to správný výsledek. Také není kompatibilní s POSIX, protože -print0
a xargs -0
není.
Některá další řešení tohoto problému jsou nastíněna zde:Jak mohu najít nejnovější (nejnovější, nejstarší, nejstarší) soubor v adresáři? – Gregova Wiki
Následující příkazy příkazy zaručeně fungují s jakýmikoli podivnými názvy souborů:
find -type f -printf "%T+ %p\0" | sort -z | grep -zom 1 ".*" | cat
find -type f -printf "%[email protected] %T+ %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //'
stat -c "%y %n" "$(find -type f -printf "%[email protected] %p\0" | \
sort -nz | grep -zom 1 ".*" | sed 's/[^ ]* //')"
Použití nulového bajtu (\0
) namísto znaku odřádkování (\n
) zajišťuje, že výstup find bude stále srozumitelný v případě, že jeden z názvů souborů obsahuje znak odřádkování.
-z
přepínač způsobí, že řazení i grep interpretují pouze prázdné bajty jako znaky konce řádku. Protože pro hlavu žádný takový přepínač neexistuje, používáme grep -m 1
místo toho (pouze jeden výskyt).
Příkazy jsou seřazeny podle doby provedení (měřeno na mém počítači).
-
První příkaz bude nejpomalejší, protože musí nejprve převést mtime každého souboru do formátu čitelného člověkem a poté tyto řetězce seřadit. Potrubí ke kočce zabrání zbarvení výstupu.
-
Druhý příkaz je o něco rychlejší. Zatímco stále provádí převod data, číselné řazení (
sort -n
) sekundy uplynulé od epochy Unixu jsou o něco rychlejší. sed odstraní sekundy od epochy Unixu. -
Poslední příkaz neprovádí vůbec žádnou konverzi a měl by být výrazně rychlejší než první dva. Samotný příkaz find nezobrazí mtime nejstaršího souboru, takže je potřeba statistika.
Související manuálové stránky:find – grep – sed – sort – stat