Jak mogę zrobić prosty, find
który uporządkuje wyniki według najnowszych modyfikacji?
Oto bieżący, find
którego używam (robię ucieczkę powłoki w PHP, więc to jest powód dla zmiennych):
find '$dir' -name '$str'\* -print | head -10
Jak mogę zmienić to wyszukiwanie według ostatnio zmodyfikowanych? (Uwaga: nie chcę, aby sortował „po” wyszukiwaniu, ale raczej znajdował wyniki na podstawie tego, co zostało ostatnio zmodyfikowane).
Odpowiedzi:
Użyj tego:
printf
argumenty odman find
:%Tk
: Czas ostatniej modyfikacji pliku w formacie określonym przezk
.@
: sekundy od 1 stycznia 1970 r., 00:00 GMT, z częścią ułamkową.c
: data i godzina ustawienia narodowego (sob. 04 12:02:33 EST 1989).%p
: Nazwa pliku.źródło
~/.zshrc
:fr () { find ./ -iname "*"$@"*" -printf "%T@ %Td-%Tb-%TY %Tk:%TM %p\n" | sort -n | cut -d " " -f 2- | grep -i "$@" ; }
Rekurencyjnie wyszukuje wszystkie pliki zawierające wzorzec pierwszego argumentu przekazanego do polecenia (fr <pattern>
) i sortuje je według ostatniego.find -L ...
ssed
aby pozbyć się części ułamkowej sekundy, a następnie użyć ISO8601, ponieważ @PeterMortensen pokazał:find . -type f -printf "%TY-%Tm-%TdT%TT %p\n" | sort -r | ssed -R 's/^([^.]+)\.\d+ (.*)$/\1 \2/'
Najłatwiejszą metodą jest użycie zsh, dzięki jego kwalifikatorom glob .
Jeśli masz GNU find, pozwól mu wydrukować czasy modyfikacji pliku i posortuj według tego.
Jeśli masz GNU find, ale nie inne narzędzia GNU, użyj znaku nowej linii jako separatora zamiast null; utracisz wsparcie dla nazw plików zawierających nowe linie.
Jeśli masz Perla (tutaj zakładam, że nie ma nowych linii w nazwach plików):
Jeśli masz Python (zakładając również, że w nazwach plików nie ma nowego wiersza):
Prawdopodobnie jest sposób, aby zrobić to samo w PHP, ale nie wiem.
Jeśli chcesz pracować tylko z narzędziami POSIX, jest to bardziej skomplikowane; zobacz Jak rekursywnie wyświetlać listę plików posortowanych według daty modyfikacji (brak dostępnej komendy stat!) (powtórzenie pierwszych 10 jest łatwą częścią).
źródło
find
wersja pokazuje najstarsze pliki i do tej-r
opcji należy dodać opcjęsort
.Nie potrzebujesz PHP ani Python, po prostu ls :
Jeśli polecenie * zakończy się ze statusem niepowodzenia (tj. Lista argumentów jest za długa ), możesz iterować z find. Parafrazując z: Maksymalna długość argumentów dla nowego procesu
find . -print0|xargs -0 command
(optymalizuje prędkość, jeśli find nie implementuje „-exec +”, ale zna „-print0”)find . -print|xargs command
(jeśli w argumentach nie ma białych znaków)Jeśli główna część argumentów składa się z długich, bezwzględnych lub względnych ścieżek, spróbuj przenieść swoje działania do katalogu:
cd /directory/with/long/path; command *
innym szybkim rozwiązaniem może być dopasowanie mniejszej liczby argumentów:command [a-e]*; command [f-m]*; ...
źródło
Potrzebujesz tylko ls
Możesz zrobić
find /wherever/your/files/hide -type f -exec ls -1rt "{}" +;
jak podano powyżej,lub
źródło
xargs
połączenia będą wykonywanels
wiele razy, sortowanie zostanie przerwane.+;
na końcu? Wydaje się dawać ten sam wynik bez,;
jednak nie działa bez+
?Rozszerzanie odpowiedzi użytkownika 195696 :
Dla każdego pliku, ten pierwszy znacznik czasu wyjścia numeryczne (dla sortowania poprzez, po zestawianiu
\t
), a następnie czytelne dla znaczników czasu, wówczas rozmiar pliku (niestetyfind
jest-printf
nie można zrobić w mebibytes tylko kibibytes), to nazwa pliku ze względną ścieżka.Następnie
sort -n
sortuje je według pierwszego pola numerycznego.Następnie
cut
usuwa pierwsze pole numeryczne, które nie jest interesujące dla użytkownika. (Drukuje drugie pole dalej). Domyślnym separatorem pól jest\t
tabulacja.Przykład wyniku:
Celowo utworzyłem pole rozmiaru pliku 6 znaków, ponieważ jeśli będzie ono dłuższe, trudno będzie wizualnie rozróżnić, jak duże są pliki. W ten sposób pliki większe niż 1e6 KiB wystają: 1 znak oznacza 1-9 GB, 2 znaki oznacza 10-99 GB itp.
Edycja: oto kolejna wersja (od
find . -printf "%Tc"
awarii na MinGW / MSYS):Dając wyniki takie jak:
Gdzie:
-I{}
powoduje, że wystąpienie{}
zostaje zastąpione argumentem, a znaki nowej linii są teraz separatorami argumentów (zwróć uwagę na spacje w nazwach plików powyżej).ls -G
pomija drukowanie nazwy grupy (marnowanie miejsca).ls -h --si
tworzy czytelne dla człowieka rozmiary plików (bardziej poprawne z--si
).ls -t
sortuje według czasu, co tutaj nie ma znaczenia, ale zwykle tego używam.źródło
T@
Bys
w każdym z powyższych poleceń.Wariant OS X odpowiedzi @ user195696:
Ze znacznikiem czasu:
Bez znacznika czasu:
źródło
Przekonałem się, że wykonuje to zadanie w systemie Mac OS X (i na tyle ogólne, że działa również na innych systemach Unixen):
źródło
Jeśli twój
find
wybór jest bardzo prosty, możesz się bez niego obejść i po prostu użyćls
:źródło
Próbować:
Ale przydatne jest również filtrowanie danych według
-mmin
/-mtime
i-type
.źródło
Posługiwać się:
To polecenie posortuje pliki według zmodyfikowanej daty.
I wyświetlają się jak:
źródło
Mam proste rozwiązanie, które działa zarówno dla FreeBSD (OS X), jak i Linux:
źródło
Nie sądzę, żeby
find
miał jakieś opcje modyfikowania kolejności wyjściowej.-mtime
i-mmin
pozwoli ci ograniczyć wyniki do plików, które zostały zmodyfikowane w określonym przedziale czasu, ale dane wyjściowe nie zostaną posortowane - musisz to zrobić sam. GNUfind
ma-printf
opcję, która między innymi pozwoli ci wydrukować czas modyfikacji każdego znalezionego pliku (ciągi formatujące%t
lub%Tk
); które mogą pomóc ci uporządkować danefind
wyjściowe tak, jak chcesz.źródło
Poprawiłem odpowiedź Akashs, poprawiając obsługę skryptu w nazwach plików poprawnie:
źródło
Jeśli chcesz zamówić wszystkie pliki PNG według czasu w
$PWD
:Ta prosta-liner daje wszystkim elastyczność regexp na
find
i nals
.źródło
Możesz używać
stat
na BSD i Linux (nie na POSIX) w następujący sposób:Jeśli chcesz ograniczyć liczbę:
źródło
Istnieje czysty i solidny sposób na
sort | head
datowanie:Używanie
ls -l
do ładnego wydrukuJako funkcja bash :
Może to być uruchamiane z jednym lub dwoma argumentami, a nawet bez:
Próba:
Wyświetla listę wszystkich katalogów nie posortowanych według daty. Nota:
Nawet na dużym drzewie systemów plików, jak
xargs
już otrzymano posortowaną listę, kolejność plików pozostaje poprawna, nawet jeślils
trzeba ją uruchamiać wiele razy.Wymienione zostanie jeszcze 12 ostatnich nie katalogów posortowanych według daty, z rozmiarem wydrukowanym w formie czytelnej dla człowieka
Wymienię 42 ostatnie ostatnie dowiązania symboliczne
Wyświetla listę wszystkich dowiązań symbolicznych, urządzeń blokujących, gniazd i znaków, posortowanych według daty.
Odwracanie kolejności
Wymiana
head
przeztail
i zmienić przełączniksort
ils
:Ta sama funkcja, to samo użycie:
źródło
Jeśli chcesz uzyskać pełną ścieżkę do każdego elementu, możesz zapisać w ten sposób.
Gdzie
-printf "% T @% p \ n" dla podania kryteriów sortowania (data),
'sort -nr' dla sortowania według daty,
nagłówek -10 dla listy 10 najlepszych wyników,
cięcie -d '' -f 2 dla wycięcia wiodący znacznik czasu na każdej linii.
źródło
cut -d ' ' -f 2
pęknie, jeśli nazwy plików zawierają spacje.Mam proste rozwiązanie.
Po przejściu
cd
do katalogu użyjfind . -iname "*" -ls
źródło