Domyślna kolejność plików w różnych systemach operacyjnych

0

Chciałem najpierw umieścić to pytanie na StackExchange, ale okazało się zbyt ogólne. Jeśli nie pasuje do tej kategorii, proszę o przeniesienie.

Moje pytanie dotyczy systemów operacyjnych ogólnie, ale jeśli ktoś znałby odpowiedź tylko dla systemów np. z rodziny Unix, to też będzie dobrze. Każda podpowiedź mile widziana.

Ad rem.

W Linuksie (ogólnie mówiąc), kiedy chcemy wyświetlić coś w konsoli, wynik jest zazwyczaj jakoś posortowany. Przykładowo, korzystając z narzędzia GNU ls, wyjście jest domyślnie sortowane "alphabetically, according to the locale settings in effect", jak jest napisane w dokumentacji tego narzędzia (cokolwiek by to stwierdzenie nie miało znaczyć).

Jeżeli chcielibyśmy inaczej posortować, możemy użyć na przykład narzędzia GNU sort. W jego dokumentacji jest napisane, że sortowanie ciągów znaków (a więc także i nazw plików) odbywa się przy pomocy zmiennej środowiskowej LC_COLLATE.

Ale to wszystko implikuje, że jeśli mówimy o "kolejności plików" (a w szczególności o "domyślnej kolejności plików"), nie ma rady – musimy mówić w kontekście jakiegoś narzędzia (w szczególności należałoby rozróżnić, że nazwy plików są zazwyczaj interpretowane jako po prostu ciągi znaków).

Moje pytanie jest następujące: czy jest tak, że każdy system operacyjny definiuje zbiór zmiennych środowiskowych podobnych do LC_COLLATE, i wszystkie narzędzia mające dostęp do aktualnie używanego systemu plików (oraz sam ten system plików) muszą z tych zmiennych korzystać w jakiś sposób, jeżeli chcą mieć posortowane wyjście?

Czy może jest tak, że systemy plików definiują w jakiś sposób kolejność plików?

A może jest tak, że systemy operacyjne definiują w jakiś sposób kolejność plików?

Najbardziej mnie interesują linki do jakichś standardów lub dokumentacji.

2

Linux nie definiuje określonej kolejności. Jeśli rozważysz wywołania systemowe opendir i readdir to kolejność plików będzie przypadkowa z tego co pamiętam. Tak więc chyba jest jak piszesz, zależy to już od narzędzia, którego używasz.
Co do systemu plików, rzeczywiście sterownik ma taką możliwość, ale ze względu na prostotę i wydajność podają pliki jak są zapisane, a w strukturach FSa raczej nie są sortowane.

0

dochodzi jeszcze kwestia rozróżniania lub nie małych/wielkich liter - w windowsach kot i Kot będą obok siebie a w nixach nie

0

W poleceniu ls jest flaga -c która pozwala tą kolejność zmienić (np na datę ostatniej modyfikacji pliku). Generalnie jak pisano kolejność w jakiej są wyświetlane pliki zależy tylko i wyłącznie od programu który je wyświetla i jego ustawień.

1

Można mówić co najwyżej o zgodności z jakąś specyfikacją typu POSIX/SUS/Open Group Base Specification. To jak będziesz miał zrealizowane listowanie plików pod konkretnym systemem, zależy czy implementuje specyfikację i w jakim stopniu.

0
elwis napisał(a):

Linux nie definiuje określonej kolejności.

Masz na myśli konkretnie jądro czy ogólnie różne dystrybucje?

Jeśli rozważysz wywołania systemowe opendir i readdir to kolejność plików będzie przypadkowa z tego co pamiętam. Tak więc chyba jest jak piszesz, zależy to już od narzędzia, którego używasz.
Co do systemu plików, rzeczywiście sterownik ma taką możliwość, ale ze względu na prostotę i wydajność podają pliki jak są zapisane, a w strukturach FSa raczej nie są sortowane.

To może być istotne, że sterownik ma taką możliwość. Być może jakieś systemy plików, czy też konfiguracje, umożliwiają ustalenie kolejności. Ale nie znam się tak dobrze na Linuksie – czy mówiąc "sterownik" (jeden) masz na myśli jakiś, jak to nazwać… moduł jądra?

abrakadaber napisał(a):

dochodzi jeszcze kwestia rozróżniania lub nie małych/wielkich liter - w windowsach kot i Kot będą obok siebie a w nixach nie

O, dobrze wiedzieć.

sig napisał(a):

W poleceniu ls jest flaga -c która pozwala tą kolejność zmienić (np na datę ostatniej modyfikacji pliku). Generalnie jak pisano kolejność w jakiej są wyświetlane pliki zależy tylko i wyłącznie od programu który je wyświetla i jego ustawień.

Dzięki. Tak, wyświetlanie tak. Mnie chodzi o sytuację bardziej ogólną od wyświetlania. Powiedzmy, dla dystrybucji Fedora chciałbym skonstruować takie zdanie: "W Fedorze kolejność plików zależy od… /i tutaj od czego zależy/". Nie wiem, jak dokończyć to zdanie. Nie chodzi konkretnie o Fedorę, to przykład.

Wiem już na pewno, że kolejność plików w dystrybucjach Linuksa nie zależy tylko od ustawień danego narzędzia, bo np. GNU ls oraz GNU sort używają zmiennych środowiskowych. Jednak, gdyby dane narzędzie nie definiowało żadnej zależności od zmiennych środowiskowych, to czy kolejność w każdej dystrybucji Linuksa byłaby losowa w przypadku użycia tego narzędzia? Czy też może są takie dystrybucje Linuksa, które zmieniają jakieś ustawienia jądra (jak zasugerował @elwis), i dzięki temu gdyby taka sytuacja wystąpiła, to kolejność nie będzie w tych dystrybucjach losowa?

yarel napisał(a):

Można mówić co najwyżej o zgodności z jakąś specyfikacją typu POSIX/SUS/Open Group Base Specification. To jak będziesz miał zrealizowane listowanie plików pod konkretnym systemem, zależy czy implementuje specyfikację i w jakim stopniu.

@yarel, dobrze ująłeś moje myśli. Mnie samemu ciężko było. To dużo wyjaśnia. Czy wiesz może, czy istnieje taki (ogólnie przyjęty) standard, który by definiował kolejność plików, ewentualnie jej brak? Najbardziej interesuje mnie duży poziom ogólności, powiedzmy: standard dla jakichś elementów jądra Linuksa. Fajnie byłoby znać także przypadki, dla których nie jest on implementowany. Zdanie "W Fedorze…", które napisałem powyżej, mógłbym wtedy uogólnić nawet w taki sposób: "W większości dystrybucji Linuksa kolejność plików zależy od ustawień zmiennych środowiskowych. Jeżeli nie byłyby one zdefiniowane, to w przypadku dystrybucji implementujących standard XYZ kolejność jest… /taka a taka/, a w przypadku pozostałych dystrybucji losowa. W przypadku dystrybucji, w których kolejność nie zależy od zmiennych środowiskowych, kolejność jest… /taka a taka/, jeżeli implementują one standardy ABC oraz EDF, a jeżeli nie, to losowa. Mogą istnieć przypadki dystrybucji implementujących inne, niewymienione standardy, i wtedy kolejność jest w nich zdefiniowana".

0

Przypuszczam że byłby to brak kolejności, bo po co tracić czas na sortowanie czegoś skoro program wyświetlający i tak przypuszczalnie posortuje jeszcze raz, niekonieczne wg tych samych kryteriów? Generalnie powinna to być kolejność tworzenia plików, ale przecież niektóre są usuwane, i potem w stosownej "tablicy" (obszarze dysku z informacjami gdzie na dysku fizycznie zaczyna się dany plik) jest info gdzie szukać "młodszych" plików. Tak więc kolejność można uznać za losową.

0

bo po co tracić czas na sortowanie czegoś skoro program wyświetlający i tak przypuszczalnie posortuje jeszcze raz, niekonieczne wg tych samych kryteriów?

Tak można by pomyśleć, niemniej wolałbym przekonać się, czytając jakiś standard, który wykorzystuje większość dystrybucji.

0
Silv napisał(a):

Masz na myśli konkretnie jądro czy ogólnie różne dystrybucje?

Przypuszczam bez różnicy. To powinna być kwestia jądra. Wprawdzie niektóre dystrybucje wprowadzają swoje zmiany w jądrze, ale przypuszczam, że programiści i tu i tu mają ważniejsze rzeczy do roboty niż głupie sortowanie plików na poziomie kernela. ;)

To może być istotne, że sterownik ma taką możliwość. Być może jakieś systemy plików, czy też konfiguracje, umożliwiają ustalenie kolejności. Ale nie znam się tak dobrze na Linuksie – czy mówiąc "sterownik" (jeden) masz na myśli jakiś, jak to nazwać… moduł jądra?

To już zależy jaki sterownik. Jeśli standardowy ext to on jest w standardzie, czy jako moduł czy wkompilowany w jądro to już do wyboru przy kompilacji jądra się wybiera. Mi zdarzyło się pracować ze sterownikiem opartym o FUSE (pozwala tworzyć sterowniki systemów plików działające w przestrzeni użytkownika). Używając go można coś takiego zrobić z tego co pamiętam. Przypuszczam, że FUSE odzwierciedla interfejs implementowany przez normalne moduły jądra, tak więc pewnie bez różnicy. Wszystko możesz sprawdzić w kodzie jądra ;)

0

Wprawdzie niektóre dystrybucje wprowadzają swoje zmiany w jądrze, ale przypuszczam, że programiści i tu i tu mają ważniejsze rzeczy do roboty niż głupie sortowanie plików na poziomie kernela. ;)

To ja chyba należę do tych programistów, którzy nie tylko zastanowiliby się kilka razy, czy to jest sensowne (gdybym w ogóle programował jądro czy dystrybucje), ale również objęliby standardem obie sytuacje (tj. że byłoby sensowne i że nie byłoby).

Dzięki za wskazówki! Moje rozumienie zależności w Linuksie troszkę się zwiększa z każdym postem.


UPDATE: Co właśnie odkryłem: czytając instrukcję do GNU ls, znalazłem w niej opcję -U, która oznacza:

-U do not sort; list entries in directory order

Co oznaczałoby, że katalogi mogą "mieć własną" kolejność sortowania! Szukając w Google, co to właściwie jest ten "directory order", znalazłem to pytanie na stackexchange, w którym wyjaśnienie jest takie:

It depends on the filesystem. For some filesystems (ext3 among them), a directory is actually a file with a well-known format, and the 'd' bit set in its permissions or mode. In that case, the history of what length filenames have gotten created and deleted can matter. The kernel will fill in the first entry in the directory file that has enough room to hold the new file's name.

Co by szło w parze z tym, co napisał @sig.

1 użytkowników online, w tym zalogowanych: 0, gości: 1