GNU/Linux >> Znalost Linux >  >> Linux

Jak mohu najít nejstarší soubor ve stromu adresářů

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


Linux
  1. Jak mohu vytvořit soubor v každé složce?

  2. Jak mohu spustit dos2unix v celém adresáři?

  3. Jak mohu rekurzivně kopírovat soubory podle přípony souboru a zachovat adresářovou strukturu?

  1. Jak mohu najít verzi Fedory, kterou používám?

  2. Jak mohu odstranit soubor nebo adresář s názvem \?

  3. Nemůžete najít .so ve stejném adresáři jako spustitelný soubor?

  1. Jak najdu všechny odlišné přípony souborů v hierarchii složek?

  2. jak najít vlastníka souboru nebo adresáře v pythonu

  3. Jak získám absolutní adresář souboru v bash?