Giới hạn độ dài tên tệp trên linux?


Câu trả lời:


126

Xem trang Wikipedia về so sánh hệ thống tệp , đặc biệt là trong cột Độ dài tên tệp tối đa .

Dưới đây là một số giới hạn độ dài tên tệp trong các hệ thống tệp phổ biến:

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
câu trả lời là: giới hạn thường là 255 ký tự (đối với những người quá lười nhấp vào liên kết này)
doc_id

11
Câu trả lời của bạn nên chứa ít nhất một bản tóm tắt các thông tin liên quan trong liên kết được cung cấp. Không chỉ là một liên kết.
zrajm

2
@rahmanisback phù hợp với giới hạn tên tệp, trong khi giới hạn đường dẫn thường được xác định bởi HĐH, không phải là FS (ngoại trừ một số FS lạ như iso hoặc ntfs), và trên linux, là 4K
nonchip

2
Trên thực tế, đó là về cả hai: D
nonchip

7
Chỉ cần chỉ ra: byte! = Chars, đặc biệt nếu bạn sử dụng UTF-8. Xem tại đây .
Kris

87

Tôi đã đọc ở đây rằng giới hạn độ dài đường dẫn là trong các tiêu đề hệ thống. Giới hạn độ dài tên tập tin là có quá. Trên hệ thống của tôi, nó là tập tin:

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

và C-lang định nghĩa:

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

và một vài thứ nữa.


10
Xin lỗi, nhưng tôi mới ở đây thậm chí không thể bình luận, lưu phiếu bầu. Câu trả lời trước (bởi sfp) nên được đưa lên, vì nó trả lời hoàn toàn câu hỏi, trong khi những câu hỏi khác bị tắt một phần. Một lần nữa, xin lỗi vì đi bên cạnh các quy tắc, nhưng tôi không thể im lặng khi câu trả lời tốt nhất ở phía dưới.
David Balažic

1
Chỉ cần chỉ ra: byte! = Chars, đặc biệt nếu bạn sử dụng UTF-8. Xem tại đây .
Kris

1
@ DavidBalažic: Mặc dù đúng, PATH_MAX trong linux chỉ là một hướng dẫn, hầu hết các hệ thống tệp cơ bản không có giới hạn. Điều này làm cho nó khó để tham chiếu các đường dẫn lớn hơn kích thước đó. Tôi thường sử dụng "khối" của PATH_MAX làm kích thước.
Rahly

23

Tôi tham khảo các câu trả lời khác, xin vui lòng upvote chúng.

Có bất kỳ giới hạn tên tệp hoặc độ dài đường dẫn trên Linux không?

Có, độ dài tên tệp và tên đường dẫn bị giới hạn bởi:

Để tự động có được các tính chất này:

  • Sử dụng các chức năng pathconffpathconf theo đề xuất của Michael Aaron Safyan
  • Tạo một tên tệp (hoặc tên đường dẫn) dài hơn và dài hơn như được giải thích bởi dogbane
  • Sử dụng lệnh getconftheo đề xuất của tim cũng có sẵn trên Linux:

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

Dưới đây là một ví dụ về đường dẫn trong C: stackoverflow.com/questions/16285623/
Ciro Santilli

20

Và để tiết kiệm thời gian (và neo nó vào bộ nhớ):

ext2, ext3, ext4, zfs: không giới hạn tên đường dẫn; Giới hạn tên tệp 255 byte.


1
Hầu hết các chương trình được giới hạn với các đường dẫn tuyệt đối PATH_MAX = 4096, mặc dù. Điều đó có thể được giải quyết nếu chương trình của bạn có thể sử dụng các đường dẫn tương đối và bạn thay đổi thư mục làm việc trước.
Mikko Rantalainen

Đó là bởi vì các API POSIX khác nhau như getcwdrealpath(mà bạn có thể thực hiện lại trong mã không gian người dùng bằng cách đọc siêu dữ liệu .và sau đó thay đổi ..và lặp lại cho đến khi bạn nhấn vào hệ thống tập tin gốc) PATH_MAX. ( Nguồn )
ssokolow

6

Đó là độ dài tên hệ thống tập tin. "linux" cũng có một số. Chẳng hạn, từ bit / stdio_lim.h:

# define FILENAME_MAX 4096

Vì vậy, vì các hệ thống tập tin extX có giới hạn tên tệp thấp hơn so với những gì được xác định trong kernel, bạn sẽ không bao giờ đạt đến giới hạn đó, trừ khi nó cũng bao gồm tên đường dẫn, phải không?
Ivan

1
đó là những gì nó trông giống như tôi Ngoài ra còn có PATH_MAX cho đường dẫn, là 4096, do đó, nó sẽ bị tấn công trước kích thước đường dẫn "không giới hạn" trên exts ... Tôi không chắc hệ điều hành giải quyết các hạn chế bên trong của chính nó và của FS, chưa bao giờ có vòng tay của tôi trong đó sâu. câu hỏi thú vị mặc dù.
jj33

4096 ký tự là một tên đường dẫn helluva. Tôi chắc chắn rằng nó có thể được nâng lên với một biên dịch lại, nhưng thành thật mà nói, / tại sao bạn lại cần tên đường dẫn dài như vậy? /
Avery Payne

Tôi không chắc bạn sẽ cần nó hay không. Tôi xem nó nhiều hơn như một sự bảo vệ chống lại các chương trình độc hại hoặc sơ suất (tôi có thể dễ dàng thấy một tập lệnh hoạt động kém và bắt đầu tạo cùng một thư mục một cách đệ quy. Thực ra, tôi đã tạo tập lệnh đó, nhưng nó đang chuyển hướng một trang web, không tạo ra các thư mục ...).
jj33

@AveryPayne Để thêm thẻ vào tệp để có thể tìm kiếm chúng đơn giản locate.
Hubert Kario

3

Không có cách nào để xác định độ dài tối đa của các đường dẫn trên Linux theo cách di động. Trên hệ thống của tôi:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Nhưng tôi có thể dễ dàng tạo các đường dẫn dài hơn 4096 ký tự. Thay vào đó xem PATH_MAXnhư một giới hạn thấp hơn. Bạn được đảm bảo có thể tạo các đường dẫn dài như vậy, nhưng bạn cũng có thể tạo các đường dẫn dài hơn nhiều.


Một cách di động đơn giản để tìm độ dài tối đa theo kinh nghiệm là viết chương trình tạo chuỗi thư mục dài hơn và dài hơn, và xem nó thất bại ở đâu. Bạn sẽ không biết chính xác lý do tại sao nó thất bại (mặc dù bạn sẽ hy vọng có một thông báo lỗi có thể đọc được của con người) nhưng bạn sẽ biết bạn có thể đi bao xa một cách an toàn. Hãy nhớ kiểm tra cả chiều dài thư mục riêng, độ dài tên đường dẫn tương đối và độ dài tên đường dẫn tuyệt đối.
tripleee

Ngoài ra, ví dụ os.pathconf()mô-đun Python sẽ có một số câu trả lời; Nếu cổng Python là tốt, thì chúng phải hợp lý.
tripleee

2
Bạn không thể vì một số hệ thống tập tin không áp đặt bất kỳ giới hạn nào . Nó sẽ sớm thất bại với lỗi hết bộ nhớ mà bất kỳ chương trình nào cũng sẽ khó phục hồi.
Bjorn Lindqvist

Đây là câu trả lời đúng, ngoại trừ điều này là do nhận xét @ BjornLindqvist. PATH_MAX chỉ là một hướng dẫn và 99% tệp có thể sẽ nằm trong giới hạn đó.
Rahly

1

Bạn phải luôn luôn sử dụng pathconf hoặc một số chức năng như thế này để nhận giá trị thời gian chạy về các mục được chỉ định, vì trang này nói rằng:

Tuy nhiên, cần lưu ý rằng nhiều giới hạn được liệt kê không phải là bất biến và trong thời gian chạy, giá trị của giới hạn có thể khác với các giới hạn được đưa ra trong tiêu đề này, vì các lý do sau:

  • Giới hạn phụ thuộc vào tên đường dẫn.

  • Giới hạn khác nhau giữa các máy biên dịch và thời gian chạy.

Vì những lý do này, một ứng dụng có thể sử dụng các hàm fpathconf (), pathconf () và sysconf () để xác định giá trị thực của giới hạn khi chạy.


0

Nó được chỉ định trong tệp tiêu đề giới hạn hệ thống .

Đây là một trong những tập tin sau:

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 */
...

Đây là nơi các bản sao của tệp này được đặt và các giá trị chúng xác định:

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

Đầu ra:

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