Najlepszy sposób na wyświetlenie 100 pierwszych plików w katalogu posortowanym według czasu

12

Jaki byłby najlepszy sposób na wyświetlenie 100 pierwszych plików w katalogu posortowanym według utworzonego znacznika czasu (od najstarszego). Katalog jest dość duży (około 100 000 plików).

Wykonanie potoku z głową zajmuje bardzo dużo czasu.

Edytować:

  • System plików to ext3.
  • ograniczenie liczby plików w folderze nie jest warte wysiłku, ponieważ będzie to rzadka operacja „czyszczenia”, a pliki są generowane przez oprogramowanie innych firm.
  • Wykorzystanie czasu modyfikacji pliku zamiast czasu utworzenia zapewnia akceptowalne rozwiązanie.


źródło
1
Jeśli jest to operacja czyszczenia, być może chcesz find -mtime +<number of days> -deletewyczyścić wszystkie pliki starsze niż określony wiek. Oznacza to, że żaden rodzaj nie jest konieczny.
Mikel

Odpowiedzi:

14

Mówisz, że „ ls piped to head zajmuje okropnie dużo czasu”.

Przyczyną tego nie jest ls, ale liczba plików w twoim katalogu. Jeśli masz 100 000 plików w jednym katalogu, każdy sposób rozwiązania tego problemu musiałby uzyskać informacje o wszystkich 100 000 plikach, zanim będzie mógł nawet pomyśleć o ich posortowaniu lub wydrukowaniu dowolnego wyniku.

Jeśli trwa to zbyt długo, prawdziwym rozwiązaniem jest podzielenie plików na wiele katalogów.

Jeśli nie możesz rozłożyć plików na kilka katalogów, to czy możesz w jakiś sposób zawęzić liczbę plików do rozważenia ? np. jeśli nazwy plików zawierają datę, być może możesz dołączyć symbol wieloznaczny, aby system nie musiał sortować 100 000 plików. A może są kolejno ponumerowane? (To może, ale nie musi pomóc, ale warto spróbować.)

Ile razy próbujesz to zrobić? Może warto zapisać / buforować dane wyjściowe do ponownego użycia .


Teraz pytanie.

Czy na pewno masz na myśli „czas tworzenia”, a nie „czas zmiany” ? Większość narzędzi może wyświetlać tylko „czas zmiany”, a nie „czas utworzenia”.

Uzyskiwanie „czasu tworzenia” jest bardzo nową rzeczą, która wymaga systemu plików ext4 i niektórych narzędzi, które nie są łatwe do zainstalowania.


Jeśli chcesz zmienić czas

Czas zmiany (w skrócie ctime) oznacza czas ostatniej zmiany atrybutów pliku.

ls -c sortuje według ctime.

Chcesz, aby dane wyjściowe były w porządku rosnącym, a nie malejącym, więc musisz odwrócić dane wyjściowe za pomocą -ropcji.

Możesz to zrobić w ten sposób:

ls -cr | head -n 100

Dłuższe rozwiązanie tego samego problemu za pomocą stat:

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%Z\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

ale działa to wolniej niż ls -crw moim systemie.


Jeśli chcesz czas modyfikacji

Czas modyfikacji (w skrócie mtime) oznacza czas ostatniej zmiany zawartości pliku.

ls -t sortuje według mtime.

Zmień ls -crna ls -tr(najlepsza opcja) lub zmień stat -c $'%Z\t%n'na stat -c $'%Y\t%n'.


Jeśli potrzebujesz czasu na stworzenie

(w skrócie crtime)

To jest trudniejsze.

Najpierw upewnij się, że katalog znajduje się w systemie plików sformatowanym przy użyciu ext4. Możesz tune2fs -l <device name>to sprawdzić.

Następnie istnieje nowy statformat o nazwie %W, który może ci w tym pomóc. Aby go zdobyć, musisz pobrać wersję GNU Coreutils wydaną w październiku 2010 roku lub później, rozpakować, skompilować i zainstalować.

Następnie, w zależności od twojego jądra, może to działać (nie wypróbowałem).

find . -mindepth 1 -maxdepth 1 -exec stat -c $'%W\t%n' '{}' \; |
    sort -k 1n |
    cut -f 2 -d $'\t' |
    head -n 10 |
    sed -e 's/^\.\///'

Zobacz też:


Jeśli pojawią się błędy dotyczące "'$\t'

'$\t'Zapis wymaga bashalbo zsh: to nie będzie działać w dashlub shna Ubuntu. Jeśli naprawdę potrzebujesz, aby korzystać z tych pocisków, trzeba będzie zmienić dowolny \tdo Ctrl+ V, Tabi usuń wiodący $od tuż przed otwarciem cytatu.

Mikel
źródło
Możliwe, że on nie korzysta z ext4. Uruchamiam Ubuntu 10.04 na wszystkich moich komputerach, ale JFS na kilku dyskach. AFAIK JFS obsługuje znaczniki czasu tworzenia.
jwernerny 28.01.11
W rzeczy samej. Wiemy, że nie jest obsługiwany na ext3 i jest obsługiwany na ext4. Szybkie wyszukiwanie sugeruje, że może współpracować z ZFS lub ufs FreeBSD, ale żaden z nich nie jest powszechny na Ubuntu! Nie jestem pewien co do JFS, XFS ani czegokolwiek innego. Z przyjemnością usłyszę więcej, jeśli znajdziesz informacje / linki.
Mikel
Dziękuję za tę bardzo wyczerpującą odpowiedź i za subtelne przypomnienie, aby napisać bardziej szczegółowe pytania;) „Znajdź” okazało się zwycięzcą pod względem wydajności, typ fs okazał się ext3.
2

Innym sposobem znalezienia się dzisiaj w pracy może być problem z wydajnością:

I=0; ls -cr /dir/ | while read file; do I=`expr $I + 1`; echo "$file"; if [ $I == 100 ]; then break; fi; done

To teoretycznie powinno zacząć generować dużo szybciej, ale myślę, że zależy to od tego, skąd bierze się opóźnienie. lsSortowanie plików może zająć dużo czasu.

Oli
źródło
Wątpię. headfaktycznie kończy pracę, gdy tylko przeczyta wystarczającą ilość danych wejściowych. Spróbuj uruchomić oba z timeprzodu. W headkażdym razie wersja jest znacznie szybsza w moim systemie.
Mikel