Ograniczenia długości nazw plików w systemie Linux?


Odpowiedzi:


126

Zobacz stronę Wikipedii na temat porównania systemów plików , szczególnie w kolumnie Maksymalna długość nazwy pliku .

Oto niektóre ograniczenia długości nazw plików w popularnych systemach plików:

BTRFS   255 bytes
exFAT   255 UTF-16 characters
ext2    255 bytes
ext3    255 bytes
ext3cow 255 bytes
ext4    255 bytes
FAT32   8.3 (255 UCS-2 code units with VFAT LFNs)
NTFS    255 characters
XFS     255 bytes

45
odpowiedź brzmi: limit to zwykle 255 znaków (dla tych, którzy są zbyt leniwi, aby kliknąć ten link)
doc_id

11
Twoja odpowiedź powinna zawierać przynajmniej streszczenie odpowiednich informacji w podanym linku. Nie tylko link.
zrajm

2
@rahmanisback, który jest odpowiedni dla limitów nazw plików, podczas gdy ograniczenia ścieżek są zwykle definiowane przez system operacyjny, a nie FS (z wyjątkiem niektórych dziwnych FS, takich jak iso lub ntfs), a na Linuksie są 4K
nonchip

2
Właściwie chodziło o oba: D
nonchip

7
Po prostu wskazując: bajty! = Znaki, szczególnie jeśli używasz UTF-8. Zobacz tutaj .
Kris,

87

Przeczytałem tutaj, że limit długości ścieżki znajduje się w nagłówkach systemu. Istnieje również limit długości nazwy pliku. W moim systemie jest to plik:

  /usr/src/linux-headers-2.6.38-10/include/linux/limits.h

a C-lang określa:

  #define NAME_MAX         255    /* # chars in a file name */
  #define PATH_MAX        4096    /* # chars in a path name including nul */

i trochę więcej.


10
Przepraszam, ale jestem tu nowy i nawet nie mogę komentować, zapisz głos. Poprzednia odpowiedź (sfp) powinna zostać podniesiona, ponieważ całkowicie odpowiada na pytanie, podczas gdy inne są częściowo wyłączone. Znowu przepraszam, że nie przestrzegam zasad, ale nie mogę być cicho, kiedy najlepsza odpowiedź jest na dole.
David Balažic

1
Po prostu wskazując: bajty! = Znaki, szczególnie jeśli używasz UTF-8. Zobacz tutaj .
Kris,

1
@ DavidBalažic: Chociaż prawda, PATH_MAX pod Linuksem jest tylko wytyczną, większość bazowych systemów plików nie ma ograniczeń. Utrudnia to odniesienie ścieżek większych niż ten rozmiar. Zwykle używam „fragmentów” PATH_MAX jako rozmiaru.
Rahly,

23

Odnoszę się do innych odpowiedzi, proszę je głosować.

Czy w Linuksie są jakieś ograniczenia długości nazw plików lub ścieżek?

Tak, długości nazw plików i ścieżek są ograniczone przez:

Aby dynamicznie uzyskać te właściwości:

  • Użyj funkcji pathconfifpathconf zgodnie z propozycją Michaela Aarona Safyana
  • Utwórz nazwę pliku (lub ścieżkę) coraz dłużej, jak wyjaśnia dogbane
  • Użyj polecenia getconfzaproponowanego przez tim, które jest również dostępne w systemie Linux:

    $ getconf NAME_MAX /mnt/sda2/
    255
    $ getconf PATH_MAX /mnt/sda3/
    4096
    


20

A dla oszczędności czasu (i zakotwiczenia go w pamięci):

ext2, ext3, ext4, zfs: bez ograniczeń nazw ścieżek; Limit 255 nazw plików.


1
Jednak większość programów jest ograniczona ścieżkami bezwzględnymi PATH_MAX = 4096. Można to obejść, jeśli Twój program może korzystać ze ścieżek względnych i najpierw zmienisz katalog roboczy.
Mikko Rantalainen

Dzieje się tak, ponieważ różne interfejsy API POSIX, takie jak getcwdi realpath(które można ponownie zaimplementować w kodzie przestrzeni użytkownika, czytając metadane dla, .a następnie zmieniając ..i powtarzając do momentu trafienia do katalogu głównego systemu plików), polegają na PATH_MAX. ( Źródło )
ssokolow

6

Są to długości nazw systemów plików. Sam „linux” też ma trochę. Na przykład z bits / stdio_lim.h:

# define FILENAME_MAX 4096

A zatem, ponieważ systemy plików extX mają niższy limit nazw niż ten, który jest zdefiniowany w jądrze, nigdy nie osiągnąłbyś tego limitu, chyba że obejmuje on także ścieżki, prawda?
Ivan

1
tak mi to wygląda. Istnieje również PATH_MAX dla ścieżki, która wynosi 4096, więc zostałaby trafiona przed „nieograniczonym” rozmiarem ścieżki na wyjściach ... Nie jestem pewien, jak system operacyjny rozwiązuje swoje własne ograniczenia wewnętrzne i FS, nigdy nie miał moje ramiona w tak głęboko. ciekawe pytanie.
jj33

4096 znaków to nazwa ścieżki helluva. Jestem pewien, że można go podnieść za pomocą ponownej kompilacji, ale szczerze mówiąc / dlaczego miałbyś potrzebować tak długich ścieżek? /
Avery Payne

Nie jestem pewien, czy będziesz go potrzebować czy nie. Widzę to bardziej jako ochronę przed złośliwymi lub niedbałymi programami (mogłem łatwo zobaczyć skrypt, który źle się zachowuje i zaczyna rekurencyjnie tworzyć ten sam katalog. Właściwie to zrobiłem ten skrypt, ale przekierowywałem stronę internetową, nie tworząc katalogów ...)
jj33

@AveryPayne Aby dodać tagi do plików, aby można je było przeszukiwać za pomocą prostego locate.
Hubert Kario

3

Nie ma sposobu na określenie maksymalnej długości ścieżek w systemie Linux w przenośny sposób. W moim systemie:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Ale mogę łatwo tworzyć ścieżki dłuższe niż 4096 znaków. Zamiast tego patrz PATH_MAXjako dolna granica. Na pewno będziesz w stanie tworzyć ścieżki tak długo, ale możesz również być w stanie utworzyć znacznie dłuższe.


Prostym przenośnym sposobem na znalezienie maksymalnej długości empirycznie jest napisanie programu, który tworzy coraz dłuższe łańcuchy katalogów i zobaczenie, gdzie się nie powiedzie. Nie będziesz wiedział dokładnie, dlaczego zawodzi (choć miałbyś nadzieję na sugestywny, czytelny dla człowieka komunikat o błędzie), ale będziesz wiedział, jak daleko możesz bezpiecznie posunąć się. Pamiętaj, aby sprawdzić zarówno indywidualną długość katalogu, względną długość ścieżki, jak i bezwzględną długość ścieżki.
tripleee 12.04.16

Także np. os.pathconf()Moduł Python będzie miał kilka odpowiedzi; jeśli port Pythona jest dobry, powinny być rozsądne.
tripleee

2
Nie możesz, ponieważ niektóre systemy plików nie nakładają żadnych ograniczeń . Wcześniej zakończy się niepowodzeniem z powodu błędu braku pamięci, z którego każdy program miałby trudności z odzyskaniem.
Björn Lindqvist

To poprawna odpowiedź, ale wynika to z komentarza @ BjörnLindqvist. PATH_MAX to tylko wskazówka, a 99% plików prawdopodobnie będzie w tym limicie.
Rahly,

1

Zawsze powinieneś używać pathconf lub jakiejś funkcji takiej jak ta, aby uzyskać wartość czasu wykonania dla określonych elementów, ponieważ ta strona mówi:

Należy jednak zauważyć, że wiele z wymienionych limitów nie jest niezmiennych, a w czasie wykonywania wartość limitu może różnić się od wartości podanych w tym nagłówku z następujących powodów:

  • Limit jest zależny od nazwy ścieżki.

  • Limit różni się między maszynami kompilującymi i wykonawczymi.

Z tych powodów aplikacja może użyć funkcji fpathconf (), pathconf () i sysconf () w celu ustalenia rzeczywistej wartości ograniczenia w czasie wykonywania.


0

Jest to określone w pliku nagłówkowym limit.h systemu .

Oto jeden z tych plików:

cat /usr/include/linux/limits.h

...
#define NAME_MAX         255    /* # chars in a file name */
#define PATH_MAX        4096    /* # chars in a path name including nul */
...

Oto, gdzie znajdują się kopie tego pliku i definiowane przez nie wartości:

find /usr | grep limits.h | xargs -I {} grep -H 'NAME_MAX' {}

Wynik:

...
/usr/include/linux/limits.h:#define NAME_MAX         255        /* # chars in a file name */
...
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.