Jaka jest maksymalna długość ścieżki do pliku w Ubuntu?

9

Po długim używaniu systemów Windows wiem, że w pewnym momencie może pojawić się okno błędu, gdy nazwy plików i folderów stają się zbyt długie.

Zdarzyło mi się to, gdy próbowałem wykonać kopię zapasową plików za pomocą SFTP z serwera do folderu w (na przykład):

D:(Windows drive partition)/Temporary/Projects/2015-06/Websites/Guitar-Site/Images/Logos/Manufacturers/Instruments/Basses/(long file name).png

Jak widać, czasami buduję bardzo określone ścieżki folderów, a jeśli nazwa pliku również jest długa, NTFS może nie być w stanie zapisać jej w ten sposób.

Obecnie martwię się o moje fizyczne kopie zapasowe, ponieważ ścieżka folderu na moim dysku kopii zapasowej doda się /backups/(drive name)/...do wszystkich ścieżek plików.

Czy jest jakiś taki limit (lub podobny) w ext4 / Ubuntu, na który musiałbym uważać?

Prototyp 700
źródło
2
Odpowiedź na ServerFault: 4k. Jest to limit systemu operacyjnego, a nie limit FS. serverfault.com/questions/9546/…
John N

Odpowiedzi:

15

Maksymalna długość nazwy pliku to 255 bajtów. Znaleziono na stronie wiki dla ext4 .

I maksymalna ścieżka 4096 znaków. Znalezione w tym pytaniu dotyczącym systemu Unix i Linux SE .

Chociaż znalazłem ten artykuł wiki , który nie określa maksymalnej ścieżki pliku w ext4.

jtoscarson
źródło
Cześć jtoscarson, dzięki za odpowiedź. Prawdopodobnie mógłbym spróbować to sprawdzić, ale czy chciałbyś wyjaśnić, co oznacza długość „255 bajtów”? Zakładam, że nie wszystkie znaki muszą używać maksymalnie 8 bitów, więc w sumie byłoby to więcej niż 255 znaków, zakładam? A może mniej, biorąc pod uwagę różne zestawy znaków.
Prototyp700700
Ogólnie rzecz biorąc, pojedynczy znak to jeden bajt. Nie szukałem dokumentacji, ale oto prosty test: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m liczy znaki, a -c liczy bajty. Powodem, dla którego jest 7 zamiast 6, jest znak końca linii, który nie jest drukowany. Łączna liczba znaków w nazwie pliku będzie więc 255.
jtoscarson,
1
Używanie zwrotów UTF-8 4za echo -n "💩" | wc -c. Utworzenie nazwy pliku o takiej nazwie zajęłoby 4 bajty, mimo że ta nazwa pliku ma 1 wykres. „Znak” nie jest jasno zdefiniowanym pojęciem (zwykle oznacza bajt, grafem lub punkt kodowy UNICODE).
Mikko Rantalainen
W zaszyfrowanych systemach plików maksymalna długość nazwy pliku wynosi 143 bajty. Aby zdecydować, czy nazwa pliku jest wystarczająco krótka, możesz znaleźć jego długość bajtu w Pythonie za pomocą len(filename.encode()).
Marvo
0

Uważam, że najbardziej wiarygodnym sposobem na określenie tego jest pathconf(".", _PC_PATH_MAX);funkcja POSIX, która określa maksymalną ścieżkę dla danej ścieżki.

Jak sugeruje funkcja, może się to różnić w zależności od systemu plików.

Nie znam jednak narzędzia wiersza poleceń, które je udostępnia. Oto minimalny przykład C: /programming/16285623/how-to-get-the-to-get-path-to-the-current-file-pwd-in-linux-from-c / 54155296 # 54155296

Ciro Santilli
źródło
1
Może to również być interesujące: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy
0

Ograniczenia nazw ścieżek zależą od używanego systemu plików. Odpowiedź jtoscarson obejmuje ext4, który jest domyślny w Ubuntu, jednak można używać różnych systemów plików w Ubuntu. Aby zacytować odpowiedź WerkkreW na temat błędu serwera , oto niektóre z systemów plików i ich ograniczenia:

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

Zauważ również, że różne systemy plików mają ograniczenia co do tego, jaki typ znaku może występować w nazwie pliku. Na przykład nazwy plików w ext4nie mogą zawierać wartości NULL i /. Zobacz także artykuł Wikipedii na temat porównań systemów plików .

Należy również pamiętać, że systemy plików Linux muszą uwzględniać definicje POSIX :

3.266 Nazwa ścieżki

Ciąg znaków używany do identyfikacji pliku. W kontekście standardu IEEE 1003.1-2001 ścieżka zawiera co najwyżej bajty {PATH_MAX}, w tym kończący bajt zerowy. Ma opcjonalny początkowy ukośnik, po którym następuje zero lub więcej nazw plików oddzielonych ukośnikami. Nazwa ścieżki może opcjonalnie zawierać jeden lub więcej ukośników końcowych. Wiele kolejnych ukośników uważa się za takie same jak jeden ukośnik.

Z limitów. H :

{PATH_MAX}

Maksymalna liczba bajtów w nazwie ścieżki, w tym kończący znak null. Minimalna dopuszczalna wartość: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Maksymalna liczba bajtów w nazwie ścieżki. Wartość: 256

Sergiy Kolodyazhnyy
źródło
0

Jak powiedział @ sergiy-kolodyazhnyy, maksymalna długość nazwy pliku zależy od systemu plików, a ogromna większość ogranicza długość pliku do 255 bajtów.

Znaczącym pominięciem w jego karcie są nośniki optyczne. Podczas gdy rozszerzenia UDF i Rock Ridge mają taki sam limit 255 znaków dla nazw plików, ISO9660 bez Rock Ridge i Joliet mają znacznie bardziej rygorystyczne ograniczenia, z którymi możesz się spotkać, jeśli robisz coś takiego jak tworzenie kopii zapasowych youtube-dlpobrań.

Nazwy plików Joliet są ograniczone do 64 punktów kodowych UTF-16 lub 103 z nich, jeśli program do tworzenia płyt ma opcję oderwania się od specyfikacji w sposób, który wydaje się nie powodować szkód w praktyce.

Podobnie, poziomy ISO 9660 2 i 3, bez rozszerzeń Rock Ridge, są ograniczone do nazw plików 31 lub 37 znaków, jeśli grasz szybko i luźno ze specyfikacją.

ISO 9660: 1999, który jest obsługiwany przez genisoimage, ale nie przez nakładki takie jak K3b, ma limit 207 bajtów (bez Rock Ridge) lub 197 bajtów (z Rock Ridge).

(Źródło: The genisoimagemanpage)

Jeśli chodzi o maksymalną długość ścieżki , jest to duże nieporozumienie. Nie ma jednego dla większości systemów plików Linux.

Jest stałą o nazwie PATH_MAX, ale to tylko maksymalne dla niektórych interfejsów API POSIX , które można pracować wokół .

Jedynymi wynikowymi wyjątkami od tej konwencji „bez ograniczeń długości ścieżki” są FAT32 i exFAT (32 760 znaków Unicode), NTFS i ReFS (32 767 znaków Unicode), UDF (1023 bajty) i ISO 9660 (niejasne, ale widziałem podano jako 180, 207, 212 lub 222 bajtów).

Można to łatwo wykazać, uruchamiając ten mały program w języku Python, a następnie eksplorując powstałe katalogi.

import os
for X in range(20):
    os.mkdir('x' * 255)
    os.chdir('x' * 255)

Mój bash, który wyświetla całą ścieżkę w monicie, będzie miał z nią kłopoty. Jednak my zsh, który wyświetla w wierszu tylko bieżący folder, nie będzie miał problemów, a nawet ma pwdwbudowaną funkcję, która może bez problemu wyświetlać całą ścieżkę 5000+ bajtów.

ssokolow
źródło