Jak rekursywnie wyświetlać pliki i sortować je według czasu modyfikacji?

10

Jak rekursywnie wyświetlić listę wszystkich plików w katalogu i posortować wynik według czasu modyfikacji?

Zwykle używam ls -lhtc ale nie znajduje wszystkich plików rekurencyjnie. Używam Linuksa i Maca.

ls -l na Mac OS X może dać

-rw-r--r--    1 fsr  user      1928 Mar  1  2011 foo.c
-rwx------    1 fsr  user      3509 Feb 25 14:34 bar.c

gdzie część daty nie jest spójna lub wyrównana, więc rozwiązanie musi wziąć to pod uwagę.

Rozwiązanie częściowe

stat -f "%m%t%Sm %N" ./* | sort -rn | head -3 | cut -f2-

działa, ale nie rekurencyjnie.

qazwsx
źródło
Zakładam, że jesteś na Linuksie, ale powinieneś wyraźnie określić swój system operacyjny w pytaniu lub najlepiej jako tag.
EBGreen

Odpowiedzi:

2

Oto metoda wykorzystująca stat jak sugerował @ johnshen64

find . -type f -exec stat -f "%m%t%Sm %N" '{}' \; | sort -rn | head -20 | cut -f2-
Computist
źródło
find "$PWD" -type f -exec stat -f $'%m\t%N' '{}' \; | sort -rn | cut -f2- wypisuje tylko bezwzględne ścieżki plików na OS X.
Lri
która wersja stat czy używasz? Twój format powyżej nie działał dla mnie. Musiałem użyć następujących: find . -type f -exec stat --printf "%Y\t%y %N\n" '{}' \; | sort -rn | cut -f2-. To jest z stat (GNU coreutils) 8.23
user84207
11

Posługiwać się find jest -printf i posortuj według rozsądnego formatu daty:

find -type f -printf '%T+\t%p\n' | sort -n

Powinno to zminimalizować proces widelców i tym samym być najszybszym.

Przykłady, jeśli nie podoba ci się ułamkowa druga część (która i tak często nie jest zaimplementowana w systemie plików):

find -type f -printf '%T+\t%p\n' | sed 's/\.[[:digit:]]\{10\}//' | sort -n
find -type f -printf '%T+\t%p\n' | cut --complement -c 20-30 | sort -n

EDYTOWAĆ: Standard find na komputerze Mac nie ma -printf. Ale nie jest to trudne zainstaluj GNU find na Macu (zobacz także ten link, aby uzyskać więcej zastrzeżeń dotyczących kompatybilności z systemem Mac / Linux i xargs ).

Daniel Andersson
źródło
0

find . powinien móc pobrać wszystkie pliki. Coś takiego:

find . -exec ls -dl '{}' \; | sort -k 6,7

Musisz dostroić go do swoich potrzeb.

johnshen64
źródło
Zakładam również, że jest to linux, tak jak EBGreen powiedział, ls to alias w Windows PS, więc musisz użyć sort-object i rekurencyjnie pobrać elementy potomne, jeśli tak jest, ale pomysł jest taki sam.
johnshen64
Czy to naprawdę działa poprawnie, gdy daty czasami mijają część roku na Macu?
qazwsx
masz rację, wyświetlanie daty dla najnowszych plików spowoduje bałagan. musisz zamiast tego użyć stat, aby uzyskać dokładnie sformatowaną datę w takim przypadku. moje pliki są bardzo stare, więc polecenie działało dobrze, dlatego dodałem klauzulę dostrojenia :-)
johnshen64
@ johnshen64: ls na Linuksie ma --time-format opcja, której możesz użyć, aby upewnić się, że zarówno ostatnie, jak i starsze daty plików są wyświetlane w tym samym formacie.
RedGrittyBrick
ah dzięki, masz rację, po prostu tego nie wykorzystałem. jest to znacznie prostsze niż używanie statystyk. to się nazywa - czas-styl myślę.
johnshen64
0

Ta odpowiedź na podobne pytanie na stronie Unix Stack Exchange pomogła mi, ponieważ korzystałem z zsh:

Jak rekurencyjnie sortować pliki posortowane według daty modyfikacji (nie jest dostępne polecenie stat!)

Brad Parks
źródło
To jest naprawdę komentarz i nie odpowiedź na pierwotne pytanie. Zawsze możesz komentować swoje posty, a kiedy już masz wystarczającą ilość reputacja będziesz w stanie skomentuj dowolny post . Proszę przeczytaj Dlaczego do komentowania potrzebuję 50 reputacji? Co mogę zrobić zamiast tego?
DavidPostill