ชื่อไฟล์จำกัดความยาวบน linux หรือไม่


คำตอบ:


126

ดูหน้าวิกิพีเดียเกี่ยวกับการเปรียบเทียบระบบไฟล์โดยเฉพาะอย่างยิ่งในคอลัมน์ยาวชื่อไฟล์สูงสุด

ต่อไปนี้เป็นข้อจำกัดความยาวของชื่อไฟล์ในระบบไฟล์ยอดนิยม:

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
คำตอบคือ: ขีด จำกัด โดยปกติจะเป็น 255 ตัวอักษร (สำหรับผู้ที่ขี้เกียจเกินไปที่จะคลิกที่ลิงค์นี้)
doc_id

11
คำตอบของคุณควรมีข้อมูลสรุปที่เกี่ยวข้องอย่างน้อยในลิงก์ที่ให้ไว้ ไม่ใช่แค่ลิงค์
zrajm

2
@rahmanisback นั้นเหมาะสำหรับการ จำกัด ชื่อไฟล์ในขณะที่ขีด จำกัด พา ธ มักจะถูกกำหนดโดยระบบปฏิบัติการไม่ใช่ FS (ยกเว้น FSes แปลก ๆ เช่น iso หรือ ntfs) และใน linux คือ 4K
nonchip

2
อันที่จริงมันเกี่ยวกับทั้งคู่: D
nonchip

7
เพียงแค่ชี้: bytes! = ตัวอักษรโดยเฉพาะถ้าคุณใช้ UTF-8 ดูที่นี่
กริช

87

ฉันได้อ่านที่นี่ว่าขีดจำกัดความยาวของเส้นทางอยู่ในส่วนหัวของระบบ มีการจำกัดความยาวชื่อไฟล์ด้วย ในระบบของฉันมันเป็นไฟล์:

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

และ C-lang กำหนด:

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

และอีกมากมาย


10
ขออภัยฉันยังใหม่ที่นี่ไม่สามารถแสดงความคิดเห็นบันทึกการโหวต คำตอบก่อนหน้า (โดย sfp) ควรเป็น upped เนื่องจากตอบคำถามได้อย่างสมบูรณ์ในขณะที่คำตอบอื่น ๆ ถูกปิดบางส่วน อีกครั้งขออภัยที่นอกเหนือไปจากกฎ แต่ฉันไม่สามารถเงียบเมื่อคำตอบที่ดีที่สุดอยู่ที่ด้านล่าง
David Balažic

1
เพียงแค่ชี้: bytes! = ตัวอักษรโดยเฉพาะถ้าคุณใช้ UTF-8 ดูที่นี่
กริช

1
@ DavidBalažic: แม้ว่าจะเป็นจริง PATH_MAX ภายใต้ linux เป็นเพียงแนวทาง แต่ส่วนใหญ่ระบบไฟล์พื้นฐานไม่มีข้อ จำกัด สิ่งนี้ทำให้ยากต่อการอ้างอิงเส้นทางที่ใหญ่กว่าขนาดนั้น ฉันมักจะใช้ "chunks" ของ PATH_MAX เป็นขนาด
Rahly

23

ฉันหมายถึงคำตอบอื่น ๆ โปรด upvote พวกเขา

มีการ จำกัด ชื่อไฟล์หรือความยาวเส้นทางบน Linux หรือไม่?

ใช่ความยาวชื่อไฟล์และชื่อพา ธ ถูก จำกัด โดย:

ในการรับคุณสมบัติเหล่านี้แบบไดนามิก:

  • ใช้ฟังก์ชั่นpathconfและfpathconfตามที่เสนอโดยMichael Aaron Safyan
  • สร้างชื่อไฟล์ (หรือชื่อพา ธ ) อีกต่อไปและนานขึ้นตามที่อธิบายโดยdogbane
  • ใช้คำสั่งgetconfตามที่เสนอโดยทิมที่มีอยู่ใน Linux ด้วย:

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

นี่คือตัวอย่าง pathconf ใน C: stackoverflow.com/questions/16285623/…
Ciro Santilli 新疆改造中心中心法轮功六四事件

20

และเพื่อประโยชน์ในการประหยัดเวลา (และยึดกับหน่วยความจำ):

ext2, ext3, ext4, zfs: ไม่ จำกัด ชื่อพา ธ ; ขีด จำกัด ชื่อไฟล์ 255 ไบต์


1
โปรแกรมส่วนใหญ่จะถูก จำกัด ที่มีเส้นทางที่แน่นอนที่จะPATH_MAX = 4096แม้ว่า สิ่งนี้สามารถแก้ไขได้หากโปรแกรมของคุณสามารถใช้เส้นทางสัมพัทธ์และคุณเปลี่ยนไดเรกทอรีการทำงานก่อน
Mikko Rantalainen

มันเป็นเพราะ APIs POSIX ต่างๆเช่นgetcwdและrealpath(ซึ่งคุณสามารถ reimplement ในรหัส userspace โดยการอ่านข้อมูลเมตาของ.แล้วเปลี่ยนไป..และการทำซ้ำจนกว่าคุณจะตีรากระบบแฟ้ม) PATH_MAXพึ่งพา ( ที่มา )
ssokolow

6

เหล่านี้คือความยาวชื่อระบบไฟล์ "linux" เองก็มีบ้างเช่นกัน ตัวอย่างเช่นจาก bits / stdio_lim.h:

# define FILENAME_MAX 4096

ดังนั้นเนื่องจากระบบไฟล์ extX มีขีด จำกัด ของชื่อไฟล์ต่ำกว่าที่กำหนดไว้ในเคอร์เนลคุณจะไม่เคยโดนขีด จำกัด นั้นเว้นแต่ว่ามันจะรวมชื่อพา ธ ด้วยใช่ไหม
Ivan

1
นั่นคือสิ่งที่ดูเหมือนกับฉัน นอกจากนี้ยังมี PATH_MAX สำหรับเส้นทางซึ่งก็คือ 4096 ดังนั้นมันจะถูกชนก่อนขนาดพา ธ "ไม่ จำกัด " บน exts ... ฉันไม่แน่ใจว่าระบบปฏิบัติการจะแก้ไขข้อ จำกัด ภายในของตัวเองและ FS ได้อย่างไร แขนของฉันลึก คำถามที่น่าสนใจว่า
jj33

4096 ตัวอักษรเป็นชื่อพา ธ ของ Helluva ฉันแน่ใจว่ามันสามารถเลี้ยงดูด้วย recompile แต่โดยสุจริต / ทำไมคุณต้องใช้ชื่อพา ธ ที่ยาว? /
Avery Payne

ฉันไม่แน่ใจว่าคุณจะต้องการหรือไม่ ฉันดูเพิ่มเติมเพื่อเป็นการป้องกันโปรแกรมที่เป็นอันตรายหรือประมาทเลินเล่อ (ฉันสามารถดูสคริปต์ที่ทำงานได้ไม่ดีและเริ่มสร้าง dir เดียวกันซ้ำ ๆ ซ้ำ ๆ จริง ๆ แล้วฉันได้สร้างสคริปต์นั้น แต่มันเปลี่ยนเส้นทางเว็บไซต์ไม่ใช่สร้าง dirs ... )
jj33

@AveryPayne locateการเพิ่มแท็กไปยังไฟล์เพื่อพวกเขาจะได้รับการค้นหาโดยใช้ที่เรียบง่าย
Hubert Kario

3

นอกจากนี้ไม่มีทางที่จะกำหนดความยาวสูงสุดของเส้นทางบน Linux ในทางแบบพกพา ในระบบของฉัน:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

แต่ฉันสามารถสร้างเส้นทางที่ยาวกว่า 4096 ตัวอักษรได้อย่างง่ายดาย แทนที่จะมองPATH_MAXว่าเป็นขอบล่าง คุณรับประกันว่าจะสามารถสร้างเส้นทางที่ยาวนี้ แต่คุณอาจสร้างเส้นทางที่ยาวกว่าได้อีกมาก


วิธีแบบพกพาง่าย ๆ ในการค้นหาความยาวสูงสุดเชิงประจักษ์คือการเขียนโปรแกรมที่สร้างไดเรกทอรีไดเรกทอรีที่ยาวขึ้นและยาวขึ้นและดูว่ามันล้มเหลวที่ไหน คุณจะไม่รู้ว่าทำไมมันถึงล้มเหลว (แม้ว่าคุณจะหวังว่าจะมีข้อความแสดงข้อผิดพลาดที่มนุษย์สามารถอ่านได้) แต่คุณจะรู้ว่าคุณจะไปได้ไกลแค่ไหน อย่าลืมตรวจสอบทั้งความยาวไดเรกทอรีแต่ละรายการความยาวชื่อพา ธ แบบสัมพันธ์และความยาวชื่อพา ธ แบบสัมบูรณ์
tripleee

นอกจากนี้เช่นos.pathconf()โมดูลPython จะมีคำตอบบางอย่าง; ถ้าพอร์ต Python ดีใด ๆ ก็ควรจะสมเหตุสมผล
tripleee

2
คุณไม่สามารถเพราะ filesystems บางส่วนไม่ได้กำหนดข้อ จำกัด ใด ๆ ในไม่ช้ามันก็จะล้มเหลวด้วยข้อผิดพลาดหน่วยความจำไม่เพียงพอซึ่งโปรแกรมใด ๆ จะมีเวลาในการกู้คืนยาก
Björn Lindqvist

นี่คือคำตอบที่ถูกต้องยกเว้นนี่เป็นเพราะความคิดเห็น @ BjörnLindqvist PATH_MAX เป็นเพียงแนวทางและ 99% ของไฟล์อาจอยู่ในขอบเขตที่กำหนด
Rahly

1

คุณควรใช้pathconfหรือฟังก์ชั่นบางอย่างเช่นนี้เพื่อรับค่ารันไทม์เกี่ยวกับรายการที่ระบุตามที่หน้านี้บอกว่า:

อย่างไรก็ตามควรสังเกตว่าข้อ จำกัด ที่ระบุไว้หลายรายการนั้นไม่คงที่และ ณ เวลารันไทม์ค่าของขีด จำกัด อาจแตกต่างจากที่ให้ไว้ในส่วนหัวนี้ด้วยเหตุผลดังต่อไปนี้:

  • ขีด จำกัด ขึ้นอยู่กับชื่อพา ธ

  • ขีด จำกัด แตกต่างกันระหว่างเครื่องคอมไพล์และรันไทม์

ด้วยเหตุผลเหล่านี้แอปพลิเคชันอาจใช้ฟังก์ชั่น fpathconf (), pathconf () และ sysconf () เพื่อกำหนดมูลค่าที่แท้จริงของข้อ จำกัด ที่รันไทม์


0

มันระบุไว้ในไฟล์ส่วนหัวของระบบlimit.h

นี่คือหนึ่งในไฟล์เหล่านี้:

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

นี่คือที่ตั้งของสำเนาของไฟล์นี้และค่าที่กำหนด:

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

เอาท์พุท:

...
/usr/include/linux/limits.h:#define NAME_MAX         255        /* # chars in a file name */
...
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.