Bir dosya adında "/" kullanmak mümkün mü?


111

Bunun yapılması gereken bir şey olmadığını biliyorum, ancak Linux'ta bir dosya adı içindeki dizinleri normalde ayıran eğik çizgi karakterini kullanmanın bir yolu var mı?


1
Sanırım, sabit disk bölümünüze doğrudan erişim kullanarak bir dosyanın adını değiştirebilir ve bir yerde '/' karakteriyle yama yapabilirsiniz. Olanlar ilginç bir sorudur ... büyük olasılıkla istediğiniz şey değil.
hochl

1
Ancak kısa cevap şu olmalı: hayır, bu asla yapılması gereken bir şey değil :-)
Simeon Visser

FS'deki dizin girişindeki dosya adına bir bölü çizgisi eklemek önemli mi? Tavsiye edilmez; dosyaya asla erişemezsiniz.
Jonathan Leffler

35
Bu bana arkadaşımın adında bir dosya oluşturduğu *ve ardından "Bir dosyayı nasıl kaldırırım?" Sorusunu hatırlatıyor. Cevap verdim, rmardından dosya adı geldi. Gerisini biliyorsun.
David Heffernan

1
Yeni Linux kullanıcıları için, bir ifade veya dosya adı lskonusunda emin değilseniz, kaldırmak istediğiniz dosyaları listelemek ve ardından lskomutu daha rmsonra değiştirmek için kullanmanın iyi bir uygulama olduğunu düşünüyorum .
Dave F

Yanıtlar:


129

Cevap, dosya sisteminizde bir hata olmadığı sürece yapamayacağınızdır. İşte nedeni:

Dosyanızın yeniden adlandırılması için fs/namei.cçağrıda tanımlanan bir sistem çağrısı var renameat:

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                int, newdfd, const char __user *, newname)

Sistem çağrısı çağrıldığında, do_path_lookupad üzerinde bir yol araması ( ) yapar. Bunu izlemeye devam edin ve link_path_walkhangisinin buna sahip olduğunu anlıyoruz :

static int link_path_walk(const char *name, struct nameidata *nd)
{
       struct path next;
       int err;
       unsigned int lookup_flags = nd->flags;

       while (*name=='/')
              name++;
       if (!*name)
              return 0;
...

Bu kod, herhangi bir dosya sistemi için geçerlidir. Bunun anlamı nedir? Bu '/', dosyanın adı olarak gerçek bir karaktere sahip bir parametreyi geleneksel araçları kullanarak iletmeye çalışırsanız , istediğinizi yapmayacağı anlamına gelir. Karakterden kaçmanın bir yolu yok. Bir dosya sistemi bunu "destekliyorsa", bunun nedeni:

  • Unicode karakter veya eğik çizgiye benzeyen ancak olmayan bir şey kullanın .
  • Bir böcekleri var.

Eğer Dahası, yaptığımız bir dosya adı içine eğik çizgi karakteri eklemek ve düzenlemek bayt gidin kötü şeyler olacağını. Bunun nedeni, bu dosyaya asla isminizle atıfta bulunamayacağınız içindir :( yaptığınız her seferinde, Linux varolmayan bir dizine atıfta bulunduğunuzu varsayacaktır. 'Rm *' tekniğini kullanmak da işe yaramaz, çünkü bash bunu dosya adı olarak genişletir. Hatta rm -rfişe yaramazdı, çünkü basit bir adım işlerin kaputun altında nasıl gittiğini gösteriyor (kısaltılmış):

$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0)               = 0
unlinkat(3, "out", 0)                   = 0
fcntl(3, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
close(3)                                = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...

unlinkatDosyalara isimleriyle başvurmaları gerektiğinden bu çağrıların başarısız olacağına dikkat edin .


8
Ayrıca, en azından e2fsckherhangi bir dosya adını düzeltilmesi gereken geçersiz bir dosya adı olarak kabul ettiğine dikkat edin - kaynağa bakın . Dolayısıyla, bir şekilde içinde eğik çizgi olan bir dosya adıyla karşılaşırsanız fsck, sorunu çözmek için kullanabilirsiniz .
ehabkost

4
@ehabkost Herhangi bir dosya adı? Bir hata gibi geliyor e2fsck: p
flarn2006

36

Dosya sisteminizin desteklediğini varsayarak, "/" olarak görüntülenen bir Unicode karakteri (örneğin bu görünüşte fazlalık glif ) kullanabilirsiniz.


43
Evet, kesin olarak: U + 002F olan yalnızca / SOLIDUSyasaktır. Pek çok başka uygun aday var: ⁄ U + 2044 FRACTION SLASH; ∕ U + 2215'tir DIVISION SLASH; ⧸, U + 29F8'dir BIG SOLIDUS; /, U + FF0F'dir FULLWIDTH SOLIDUSve ╱ , U + 2571'dir BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT. Hepsi takdire şayan çalışırdı!
tchrist

2
Peki kullanıcı dosya / dizin adlarında bu gerçek karakterleri kullanırsa ne olur? Genel bir kaçış çözümüne ihtiyacımız var. Çok kötü Linux'un normal kodu, ASCII 0x2F ile tam anlamıyla eşleştiği için hiçbirini desteklemiyor. ASCII, en az 20 yıldır büyük bir hayır-hayır. (Unicode 1.0 1991'den itibaren!)
Evi1M4chine

@tchrist Unicode'a bağlı kalmamayı tercih ediyorum. bu yüzden muhtemelen çok karakterli bir sınırlayıcı tercih ederim ---. ayırıcı seçiminiz farklı bir karakter kullanabilir ve tekrar sayısını değiştirebilir.
Trevor Boyd Smith

Farklı dosya sistemlerinde yasak olan çeşitli karakterlerin olası değiştirmelerinin bir listesi için
cevabıma

9

Hangi dosya sistemini kullandığınıza bağlıdır. Daha popüler olanlardan bazıları:


1
sadece dosya sistemine bağlı değildir, tüm * nix sistemlerindeki sistem çağrıları / dizini ağacının bir bileşeni olarak ayrıştırır.
Blackle Mori

2
Eğik çizgi karakteri, dosya sisteminden bağımsız olarak çekirdeğe sabit kodlanmıştır ( grep -r "'/'" *çekirdek kaynağınızda yapmayı deneyin )
Robert Martin

20
@tchrist Affedersiniz. "Eğik çizgi", hangi eğik çizgiden bahsedildiğini iyice netleştirmek için eğik çizgi karakterine atıfta bulunmanın tamamen kabul edilebilir bir yoludur . Bazen insanların kafası karışır: P
Robert Martin

2
Hah, ama @tchrist'in de haklı olduğunu düşünüyorum. Neden ileri "/" ve "geri" "\" anlamına gelir? Şimdiye kadar sahip olduğum en iyi açıklama, bir satırda başlayan, aşağıdan yukarıya bir kalemle yazılırsa, okurken / yazarken '/' sağa veya 'ileri' ve '\' 'sola' veya 'geri' hareket eder. soldan sağa. Yine de bu açıklamayı pek sevmiyorum, çünkü kısmen karakterlerimi her zaman aşağıdan yazıp yukarı çıkmıyorum. Bence bir karakter yazarken yukarıdan başlayıp aşağı inmek çoğu zaman daha iyi akıyor.
Jesse W. Collins

4
@jwso Bu tamamen bir yan noktadır, ancak bu standart, kanonik dildir. Eğik çizgi, unicode'un buna benzeyen semboller dediği şey değildir, onlara katılaşma adını verir, ancak "\" ters bir katılaşmadır ve geriye doğru, dolayısıyla ters eğik çizgi ile eşanlamlıdır. Ancak bir gerekçeye ihtiyaç duyulursa, geriye ve ileriye doğru yazının yönüne göre (soldan sağa) çizginin eğildiği veya düşmesi gereken yöndür. Eğilir veya "\" gibi görünüyorsa <== veya geriye düşmelidir ve ==> veya "/" gibi görünüyorsa öne doğru düşmelidir.
Stuart R. Jefferys

4

Yalnızca üzerinde anlaşmaya varılmış bir kodlama ile. Örneğin, bir anlaşma yapabiliriz %olarak kodlanmış %%ve bu%2F a anlamına/ . Bu dosyaya erişen tüm yazılımların kodlamayı anlaması gerekir.


19
"başka bir adla eğik çizgi dediğimiz şey kötü kokacaktır" - Shakespeare
Robert Martin

1

Kısa cevap: Hayır, yapamazsınız. Dizin yapısının nasıl tanımlandığından dolayı gerekli bir yasak.

Ve belirtildiği gibi, eğik çizgiye "benzeyen" bir unicode karakteri görüntüleyebilirsiniz, ancak alabildiğiniz kadar uzaktır.


1

Genel olarak, bir dosya adında "kötü" karakterler kullanmaya çalışmak kötü bir fikirdir; Bir şekilde yönetseniz bile, dosyayı daha sonra kullanmayı zorlaştırma eğilimindedir. Dosya sistemi ayırıcısı tamamen çalışmayacak, bu yüzden alternatif bir yöntem seçmeniz gerekecek.

URL'yi URL olarak kodlamayı ve sonra bunu dosya adı olarak kullanmayı düşündünüz mü? Sonuç, bir dosya adı olarak iyi olmalıdır ve kodlanmış sürümden adı yeniden oluşturmak kolaydır.

Diğer bir seçenek de bir dizin oluşturmaktır - istediğiniz yöntemi kullanarak çıktı dosya adını oluşturun - sıralı olarak numaralandırılmış adlar, SHA1 sağlamaları, her neyse - ardından oluşturulan dosya adı / URL çiftiyle bir dosya yazın. Bunu bir karma olarak kaydedebilir ve URL'den dosya adına arama yapmak için kullanabilir veya karmanın tersine çevrilmiş sürümüyle bunun tersini yapabilirsiniz ve gerekirse yazıp daha sonra yeniden yükleyebilirsiniz.

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.