Batas panjang nama file di linux?


Jawaban:


126

Lihat halaman Wikipedia tentang perbandingan sistem file , terutama di kolom Panjang nama file maksimum .

Berikut adalah beberapa batasan panjang nama file dalam sistem file populer:

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
jawabannya adalah: batas biasanya 255 karakter (bagi mereka yang terlalu malas untuk mengklik tautan ini)
doc_id

11
Jawaban Anda harus mengandung setidaknya ringkasan informasi yang relevan di tautan yang disediakan. Bukan sekadar tautan.
zrajm

2
@rahmanisback itu tepat untuk batas nama file, sedangkan batas jalur biasanya ditentukan oleh OS, bukan FS (kecuali untuk beberapa FS aneh seperti iso atau ntfs), dan, di linux, adalah 4K
nonchip

2
Sebenarnya itu tentang keduanya: D
nonchip

7
Hanya menunjukkan: byte! = Karakter, terutama jika Anda menggunakan UTF-8. Lihat di sini .
Kris

87

Saya telah membaca di sini bahwa batas panjang jalur ada di header sistem. Batas panjang nama file juga ada di sana. Di sistem saya ini adalah file:

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

dan C-lang mendefinisikan:

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

dan lainnya.


10
Maaf, tapi saya baru di sini dan bahkan tidak bisa berkomentar, menyimpan suara. Jawaban sebelumnya (oleh sfp) harus dinaikkan, karena menjawab pertanyaan sepenuhnya, sementara yang lain sebagian tidak aktif. Sekali lagi, maaf karena melanggar aturan, tapi saya tidak bisa diam ketika jawaban terbaik ada di bagian bawah.
David Balažic

1
Hanya menunjukkan: byte! = Karakter, terutama jika Anda menggunakan UTF-8. Lihat di sini .
Kris

1
@ DavidBalažic: Walaupun benar, PATH_MAX di linux hanyalah sebuah pedoman, sebagian besar sistem file yang mendasarinya tidak memiliki batasan. Ini mempersulit referensi jalur yang lebih besar dari ukuran itu. Saya biasanya menggunakan "potongan" dari PATH_MAX sebagai ukuran.
Rahly

23

Saya merujuk pada jawaban lain, mohon utas mereka.

Apakah ada batasan nama file atau panjang jalur di Linux?

Ya, panjang nama file dan nama path dibatasi oleh:

Untuk mendapatkan properti ini secara dinamis:

  • Gunakan fungsi pathconfdanfpathconf seperti yang diusulkan oleh Michael Aaron Safyan
  • Buat nama file (atau pathname) lebih lama dan lebih lama seperti yang dijelaskan oleh dogbane
  • Gunakan perintah getconfseperti yang diusulkan oleh tim yang juga tersedia di Linux:

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


20

Dan demi menghemat waktu (dan menambatkannya ke memori):

ext2, ext3, ext4, zfs: tidak ada batasan pathname; Batas nama file 255 byte.


1
Namun, sebagian besar program dibatasi dengan jalur absolut PATH_MAX = 4096. Itu dapat dikerjakan jika program Anda dapat menggunakan jalur relatif dan Anda mengubah direktori kerja Anda terlebih dahulu.
Mikko Rantalainen

Itu karena berbagai API POSIX seperti getcwddan realpath(yang dapat Anda implementasikan dalam kode userspace dengan membaca metadata untuk .dan kemudian mengubah ..dan mengulangi hingga Anda menekan root filesystem) bergantung PATH_MAX. ( Sumber )
ssokolow

6

Itu adalah panjang nama sistem file. "linux" sendiri juga memiliki beberapa. Misalnya, dari bits / stdio_lim.h:

# define FILENAME_MAX 4096

Jadi karena filesystem extX memiliki batas nama file lebih rendah dari apa yang didefinisikan dalam kernel, Anda tidak akan pernah mencapai batas itu, kecuali jika itu juga mencakup nama path, kan?
Ivan

1
itu seperti apa bagiku. Ada juga PATH_MAX untuk jalur, yaitu 4096, jadi itu akan mengenai sebelum ukuran jalur "tidak terbatas" di exts ... Saya tidak yakin bagaimana OS menyelesaikan pembatasan internal sendiri dan orang-orang dari FS, tidak pernah memiliki tangan saya sedalam itu. pertanyaan yang menarik.
jj33

4096 karakter adalah nama jalur helluva. Saya yakin itu bisa dinaikkan dengan kompilasi ulang, tapi jujur, / mengapa Anda membutuhkan nama path selama itu? /
Avery Payne

Saya tidak yakin Anda akan membutuhkannya atau tidak. Saya melihatnya lebih sebagai perlindungan terhadap program jahat atau lalai (saya dapat dengan mudah melihat skrip yang berperilaku buruk dan mulai membuat dir yang sama secara rekursif. Sebenarnya, saya telah membuat skrip itu, tetapi itu mengarahkan ulang situs web, bukan membuat arahan ...).
jj33

@ AveryPayne Untuk menambahkan tag ke file sehingga mereka dapat dicari menggunakan sederhana locate.
Hubert Kario

3

Tidak ada cara untuk menentukan panjang maksimum lintasan di Linux dengan cara portabel. Di sistem saya:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Tapi saya dapat dengan mudah membuat jalur lebih dari 4096 karakter. Alih-alih melihat PATH_MAXsebagai batas bawah. Anda dijamin bisa membuat jalur selama ini, tetapi Anda juga bisa membuat yang lebih panjang.


Cara portabel sederhana untuk menemukan panjang maksimum secara empiris adalah menulis program yang membuat rantai direktori lebih lama dan lebih lama, dan melihat di mana ia gagal. Anda tidak akan tahu persis mengapa itu gagal (meskipun Anda akan berharap untuk pesan kesalahan yang dapat dibaca manusia sugestif) tetapi Anda akan tahu seberapa jauh Anda bisa pergi dengan aman. Ingatlah untuk memeriksa panjang direktori individual, panjang nama path relatif, dan panjang nama path absolut.
tripleee

Juga, misalnya os.pathconf()modul Python akan memiliki beberapa jawaban; jika port Python bagus, mereka harus masuk akal.
tripleee

2
Anda tidak bisa karena beberapa sistem file tidak menerapkan batasan apa pun . Akan lebih cepat gagal dengan kesalahan kehabisan memori di mana program mana pun akan kesulitan pulih.
Björn Lindqvist

Ini adalah jawaban yang benar, kecuali ini karena komentar @ BjörnLindqvist. PATH_MAX hanyalah panduan, dan 99% file mungkin berada dalam batas itu.
Rahly

1

Anda harus selalu menggunakan pathconf atau beberapa fungsi seperti ini untuk mendapatkan nilai runtime tentang item yang ditentukan, karena halaman ini mengatakan bahwa:

Perlu dicatat, bahwa banyak batas yang tercantum tidak invarian, dan pada saat runtime, nilai batas mungkin berbeda dari yang diberikan dalam header ini, karena alasan berikut:

  • Batasnya adalah pathname-dependent.

  • Batasnya berbeda antara kompilasi dan mesin runtime.

Untuk alasan ini, aplikasi dapat menggunakan fungsi fpathconf (), pathconf (), dan sysconf () untuk menentukan nilai aktual dari batas saat runtime.


0

Ini ditentukan dalam file header limit.h sistem .

Ini salah satu dari file-file ini:

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

Di sinilah letak salinan file ini dan nilai yang ditentukan:

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

Keluaran:

...
/usr/include/linux/limits.h:#define NAME_MAX         255        /* # chars in a file name */
...
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.