Linux'ta dosya adı uzunluğu sınırları?


Yanıtlar:


126

Dosya sistemleri karşılaştırması hakkında Vikipedi sayfasına bakın , özellikle Maksimum dosya adı uzunluğu sütununda .

Popüler dosya sistemlerinde bazı dosya adı uzunluğu sınırları :

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
cevap: sınır genellikle 255 karakterdir (bu bağlantıya tıklamak için çok tembel olanlar için)
doc_id

11
Cevabınız, en azından verilen bağlantıdaki ilgili bilgilerin bir özetini içermelidir. Sadece bir bağlantı değil.
zrajm

2
Dosya adı sınırları için doğru olan @rahmanisback, yol sınırları genellikle OS tarafından tanımlanır, FS (iso veya ntfs gibi bazı garip FS'ler hariç) ve
linux'da 4K'dır

2
Aslında ikisi de ile
ilgiliydi

7
Sadece işaret: bytes! = Karakter, özellikle UTF-8 kullanıyorsanız. Buraya bakınız .
Kris

87

Burada yol uzunluğu sınırının sistem başlıklarında olduğunu okudum . Dosya adı uzunluğu sınırı da var. Benim sistemimde bu dosya:

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

ve C-lang şunları tanımlar:

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

ve biraz daha.


10
Üzgünüm, ama ben burada yeniyim bir yorum bile yapamıyorum, oyu kaydet. Diğerleri kısmen kapalıyken, soruyu tamamen cevapladığı için önceki cevap (sfp tarafından) yükseltilmelidir. Yine, kuralların ötesine geçtiğim için üzgünüm ama en iyi cevap en altta olduğunda sessiz kalamam.
David Balažic

1
Sadece işaret: bytes! = Karakter, özellikle UTF-8 kullanıyorsanız. Buraya bakınız .
Kris

1
@ DavidBalažic: Doğru olmasına rağmen, linux altındaki PATH_MAX sadece bir kılavuzdur, temel dosya sistemlerinin çoğunun bir sınırı yoktur. Bu, bu boyuttan daha büyük olan yolları referans almayı zorlaştırır. Genellikle bir boyut olarak PATH_MAX'ın "parçalarını" kullanırım.
Rahly

23

Diğer cevaplara bakın, lütfen onları oylayın.

Linux'ta herhangi bir dosya adı veya yol uzunluğu sınırı var mı?

Evet, dosya adı ve yol adı uzunlukları:

Bu özellikleri dinamik olarak almak için:

  • İşlevleri kullanın pathconfve fpathconfMichael Aaron Safyan tarafından önerilen şekilde
  • Dogbane tarafından açıklanan şekilde daha uzun ve daha uzun bir dosya adı (veya yol adı) oluşturun.
  • Linux'ta da bulunan timgetconf tarafından önerilen komutu kullanın :

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

İşte C deki bir pathconf örneği: stackoverflow.com/questions/16285623/…
Ciro Santilli 23

20

Ve zamandan tasarruf etmek uğruna (ve onu hafızaya tutturmak için):

ext2, ext3, ext4, zfs: yol adı sınırı yok; 255 bayt dosya adı sınırı.


1
Çoğu program PATH_MAX = 4096olsa da, mutlak yollarla sınırlıdır . Programınız göreceli yolları kullanabiliyorsa ve bu durumda çalışma dizini değiştirirseniz, bu sorun çözülebilir.
Mikko Rantalainen

Gibi çeşitli POSIX API'leri da ondan getcwdve realpath(hangi olabilir userspace kodunda reimplement için meta verileri okuyarak .ve sonra değişen ..ve dosya sistemi kökünü çarpana kadar tekrarla) itimat PATH_MAX. ( Kaynak )
ssokolow

6

Bunlar dosya sistemi adı uzunlukları. "linux" un kendisi de vardır. Örneğin, bit / stdio_lim.h dosyasından:

# define FILENAME_MAX 4096

Böylece, extX dosya sistemlerinin çekirdekte tanımlandığından daha düşük bir dosya adı sınırı olduğundan, aynı zamanda yol adlarını da içermediği sürece bu sınıra ulaşamazsınız, değil mi?
Ivan

1
bana öyle geliyor. Ayrıca, 4096 olan yol için PATH_MAX var, bu yüzden çıkışlardaki "sınırsız" yol boyutundan önce çarptı ... İşletim sisteminin kendi iç kısıtlamalarını ve FS'ninkileri nasıl çözdüğünden emin değilim. Kollarım o derinlerde. ilginç bir soru olsa.
jj33

4096 karakter bir helluva yolu adıdır. Bir derleme ile büyütülebileceğinden eminim, ama dürüst olmak gerekirse, / neden bu kadar uzun yollara ihtiyacın olsun ki? /
Avery Payne

İhtiyacın olacak veya gerekmeyeceğinden emin değilim. Bunu daha çok kötü niyetli veya ihmalkar programlara karşı koruma olarak görüyorum (Zayıf davranan ve aynı diziyi yinelemeli oluşturmaya başlayan bir betiği kolayca görebiliyordum. Aslında, bu betiği yaptım, ancak bir web sitesini yönlendiriyor, dir oluşturmuyor ...).
jj33

@AveryPayne Dosyalara etiket eklemek, böylece basit bir yöntemle aranabilirler locate.
Hubert Kario

3

Orada hiçbir şekilde taşınabilir bir şekilde Linux üzerinde yollarının maksimum uzunluğunu belirlemek için. Sistemimde:

$ getconf PATH_MAX / 
4096
$ getconf _POSIX_PATH_MAX / 
4096

Ancak 4096 karakterden daha uzun yolları kolayca oluşturabilirim. Bunun yerine PATH_MAXbir alt sınır olarak bakın . Bu kadar uzun süre boyunca yol yaratabileceğiniz garantilidir, ancak daha uzun yol da oluşturabilirsiniz.


Ampirik olarak maksimum uzunluğu bulmak için basit bir taşınabilir yol, daha uzun ve daha uzun dizin zincirleri yaratan bir program yazmak ve nerede başarısız olduğunu görmek. Bunun neden başarısız olduğunu tam olarak bilemeyeceksiniz (düşünceli bir insan tarafından okunabilir hata mesajı almayı umsanız da) ama ne kadar güvenli bir şekilde gidebileceğinizi bileceksiniz. Hem bireysel dizin uzunluğunu hem de göreceli yol adı uzunluğunu ve mutlak yol adı uzunluğunu kontrol etmeyi unutmayın.
tripleee

Ayrıca, örneğin Python os.pathconf()modülü bazı cevaplar verecektir; Python portu iyi ise, makul olmalıdır.
üçlü

2
Yapamazsınız çünkü bazı dosya sistemleri herhangi bir sınırlama getirmemektedir . Herhangi bir programın kurtarılmakta zorlanacağı bir bellek yetersizliği hatasıyla daha erken başarısız olacaktır.
Björn Lindqvist

Bu, doğru cevap, bunun nedeni @ BjörnLindqvist yorumundan kaynaklanıyor. PATH_MAX sadece bir kılavuzdur ve dosyaların% 99'u muhtemelen bu sınır içinde olacaktır.
Rahly

1

Her zaman kullanmalısınız pathconf bu gibi belirtilen öğeler hakkında çalışma zamanı değeri elde etmek veya bunun gibi bazı işlevi sayfa söyledi:

Bununla birlikte, listelenen sınırların çoğunun değişmez olduğu ve çalışma zamanında, sınırın değerinin, aşağıdaki nedenlerden dolayı, bu başlıkta verilenlerden farklı olabileceği belirtilmelidir:

  • Sınır yol adına bağlıdır.

  • Sınır derleme ve çalışma zamanı makineleri arasında değişir.

Bu nedenlerden dolayı, bir uygulama çalışma zamanında bir limitin gerçek değerini belirlemek için fpathconf (), pathconf () ve sysconf () işlevlerini kullanabilir.


0

Sistem settings.h başlık dosyasında belirtildi.

İşte bu dosyalardan biri:

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

İşte bu dosyanın kopyalarının bulunduğu ve tanımladıkları değerler:

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

Çıktı:

...
/usr/include/linux/limits.h:#define NAME_MAX         255        /* # chars in a file name */
...
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.