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.


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-

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 ).


0

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

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

Musisz dostroić go do swoich potrzeb.


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!)


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.