Độ dài tối đa của một đường dẫn tệp trong Ubuntu là bao nhiêu?


9

Đã sử dụng các hệ thống Windows trong một thời gian dài, tôi biết rằng tại một thời điểm nhất định, một cửa sổ lỗi có thể xuất hiện khi các tệp và tên thư mục trở nên quá dài.

Điều này xảy ra với tôi khi tôi cố sao lưu các tệp bằng SFTP từ máy chủ vào thư mục trong (ví dụ):

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

Như bạn có thể thấy, đôi khi tôi có xu hướng xây dựng các đường dẫn thư mục rất được chỉ định và nếu tên tệp cũng xảy ra, NTFS có thể không thể lưu nó theo cách này.

Tôi hiện đang lo lắng về các bản sao lưu vật lý của mình, vì đường dẫn thư mục trên ổ đĩa sao lưu của tôi sẽ thêm /backups/(drive name)/...vào tất cả các đường dẫn tệp.

Có bất kỳ giới hạn nào như vậy (hoặc một giới hạn tương tự) trong ext4 / Ubuntu mà tôi sẽ phải tìm ra không?


2
Đã trả lời trên ServerFault: 4k. Đó là giới hạn HĐH, không phải giới hạn FS. serverfault.com/questions/9546/ trộm
John N

Câu trả lời:


15

Độ dài tên tệp tối đa là 255 byte. Tìm thấy trong trang wiki cho ext4 .

Và đường dẫn tối đa 4096 ký tự. Tìm thấy trong câu hỏi Unix & Linux SE này .

Mặc dù, tôi đã tìm thấy bài viết wiki này không chỉ định đường dẫn tệp tối đa trong ext4.


Xin chào jtoscarson, cảm ơn câu trả lời của bạn. Tôi có thể cố gắng tìm kiếm cái này, nhưng bạn có quan tâm giải thích độ dài của "255 byte" nghĩa là gì không? Tôi giả sử rằng không phải tất cả các ký tự đều sử dụng tối đa 8 bit, vì vậy tổng cộng sẽ có hơn 255 ký tự? Hoặc có thể ít hơn, xem xét các ký tự khác nhau có thể được sử dụng.
Prototype700

Nói chung, một ký tự là một byte. Tôi đã không tìm tài liệu, nhưng đây là một thử nghiệm đơn giản: jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -c 7 jtoscarson@Tylers-Ubuntu:~$ echo "123abc" | wc -m 7 -m đang đếm các ký tự và -c đang đếm byte. Lý do tại sao nó là 7 thay vì 6 là kết thúc của ký tự dòng không được in. Vì vậy, tổng số ký tự trong tên tệp sẽ là 255.
jtoscarson

1
Sử dụng trả lại miền địa phương UTF-8 4cho echo -n "💩" | wc -c. Tạo một tên tệp được gọi với tên đó sẽ mất 4 byte mặc dù thực tế rằng tên tệp này dài 1 grapheme. Một "ký tự" không phải là khái niệm được xác định rõ ràng (thông thường nó có nghĩa là điểm mã byte, grapheme hoặc UNICODE).
Mikko Rantalainen

Trên các hệ thống tệp được mã hóa, độ dài tên tệp tối đa là 143 byte. Để quyết định xem tên tệp có đủ ngắn hay không, bạn có thể tìm độ dài byte của anh ấy trong Python len(filename.encode()).
Marvo

0

Tôi tin rằng cách đáng tin cậy nhất để xác định điều này là với pathconf(".", _PC_PATH_MAX);hàm POSIX, xác định đường dẫn tối đa cho một đường dẫn cụ thể.

Như chức năng cho thấy, điều này có thể khác nhau giữa các hệ thống tập tin.

Tôi không biết về một tiện ích dòng lệnh để lộ nó mặc dù. Dưới đây là một ví dụ C tối thiểu: /programming/16285623/how-to-get-the-to-get-path-to-the-civerse-file-pwd-in-linux-from-c / 54155296 # 54155296


1
Điều này cũng có thể được quan tâm: zsh.org/mla/workers/2000/msg03393.html
Sergiy Kolodyazhnyy

0

Các giới hạn tên đường dẫn phụ thuộc vào hệ thống tập tin được sử dụng. Câu trả lời của jtoscarson bao gồm ext4, mặc định trên Ubuntu, tuy nhiên bạn có thể sử dụng nhiều hệ thống tập tin khác nhau trên Ubuntu. Để trích dẫn câu trả lời của WerkkreW trên serverfault, đây là một số hệ thống tập tin và giới hạn của chúng:

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

Cũng lưu ý rằng các hệ thống tập tin khác nhau có những hạn chế về loại ký tự nào có thể có trong tên tệp. Chẳng hạn, tên tệp trong ext4không thể chứa NULL và /. Xem thêm, bài viết Wikipedia để so sánh hệ thống tập tin .

Cũng lưu ý rằng các hệ thống tệp Linux phải xem xét các định nghĩa POSIX :

3.266 Tên đường dẫn

Một chuỗi ký tự được sử dụng để xác định một tập tin. Trong ngữ cảnh của IEEE Std 1003.1-2001, một tên đường dẫn bao gồm, nhiều nhất là các byte {PATH_MAX}, bao gồm cả byte null kết thúc. Nó có một dấu gạch chéo bắt đầu tùy chọn, theo sau là 0 hoặc nhiều tên tệp được phân tách bằng dấu gạch chéo. Một tên đường dẫn có thể tùy ý chứa một hoặc nhiều dấu gạch chéo. Nhiều dấu gạch chéo liên tiếp được coi là giống như một dấu gạch chéo.

Từ giới hạn.h :

{PATH_MAX}

Số byte tối đa trong một tên đường dẫn, bao gồm ký tự null kết thúc. Giá trị tối thiểu có thể chấp nhận: {_POSIX_PATH_MAX}

{_POSIX_PATH_MAX}

Số byte tối đa trong một tên đường dẫn. Giá trị: 256


0

Như @ sergiy-kolodyazhnyy đã nói, độ dài tên tệp tối đa sẽ phụ thuộc vào hệ thống tệp và phần lớn giới hạn phần lớn tên tệp là 255 byte.

Một thiếu sót đáng chú ý từ biểu đồ của ông là phương tiện truyền thông quang học. Mặc dù các tiện ích mở rộng UDF và Rock Ridge có cùng giới hạn 255 ký tự cho tên tệp, nhưng ISO9660 không có Rock Ridge và Joliet đều có giới hạn chặt chẽ hơn mà bạn thực sự có thể gặp phải nếu bạn đang làm gì đó như sao lưu các bản youtube-dltải xuống.

Tên tệp của Joliet bị giới hạn ở 64 điểm mã UTF-16 hoặc 103 trong số chúng nếu chương trình làm chủ đĩa của bạn có tùy chọn thoát khỏi thông số theo cách dường như không gây hại trong thực tế.

Tương tự, ISO 9660 Levels 2 & 3, không có phần mở rộng Rock Ridge, bị giới hạn ở tên tệp 31 ký tự hoặc 37 nếu bạn chơi nhanh và lỏng lẻo với thông số kỹ thuật.

ISO 9660: 1999, được hỗ trợ bởi genisoimage nhưng không phải bởi các mặt trận như K3b, có giới hạn là 207 byte (không có Rock Ridge) hoặc 197 byte (với Rock Ridge).

(Nguồn: Trang chủ genisoimage)

Đối với chiều dài đường dẫn tối đa , đó là một quan niệm sai lầm lớn. Không có cái nào cho hầu hết các hệ thống tập tin Linux.

Có một hằng số được đặt tên PATH_MAX, nhưng nó chỉ là mức tối đa cho các API POSIX nhất định mà bạn có thể làm việc xung quanh .

Các trường hợp ngoại lệ duy nhất cho quy ước "không giới hạn độ dài đường dẫn" này là FAT32 và exFAT (32.760 ký tự Unicode), NTFS và ReFS (32.767 ký tự Unicode), UDF (1.023 byte) và ISO 9660 (không rõ ràng, nhưng tôi đã thấy nó được tuyên bố là 180, 207, 212 hoặc 222 byte).

Điều này có thể dễ dàng được chứng minh bằng cách chạy chương trình Python nhỏ này và sau đó khám phá các thư mục kết quả.

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

My bash, hiển thị toàn bộ đường dẫn trong dấu nhắc, sẽ có troublr với nó. Tuy nhiên zsh, chỉ hiển thị thư mục hiện tại trong dấu nhắc sẽ không gặp sự cố và thậm chí có một pwdnội dung có thể hiển thị toàn bộ đường dẫn 5000 + mà không gặp sự cố.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.