Windows ve Linux dizin adlarında hangi karakterler yasaklanmıştır?


356

Linux'ta / yasadışı olduğunu biliyorum ve aşağıdakiler Windows'ta yasadışı (bence) * . " / \ [ ] : ; | ,

Başka ne eksik?

Bununla birlikte, kapsamlı bir kılavuza ve çift baytlık karakterleri dikkate alan bir kılavuza ihtiyacım var. Dış kaynaklarla bağlantı kurmak benim için iyidir.

Önce yasak karakterler içerebilir bir ad kullanarak dosya sisteminde bir dizin oluşturmak gerekir, bu yüzden bu karakterleri alt çizgilerle değiştirmeyi planlıyorum. Daha sonra bu dizin ve içeriğini bir zip dosyasına (Java kullanarak) yazmanız gerekiyor, bu yüzden zip dizinlerinin adları ile ilgili herhangi bir ek tavsiye takdir edilecektir.


13
Bahsettiğiniz bazı karakterlere aslında Windows'da izin verilir. Bunu kontrol et:echo abc > "ab.;,=[1]"
dolmen

3
Ayrıca Windows'ta <ve> yasadışı olduğunu unutmayın.
AnotherParker

4
/ Linux'ta yasadışı değil. Yazarken bir \ ile kaçmak zorundasınız.
David

5
@ DavidC.Bishop: Bu SO yazısı , Linux çekirdeğinin eğik çizgi içeren bir dosya adıyla çalışmanızı engelleyeceğini iddia ediyor. Çalışmasını sağlayabildiniz mi?
Soren Bjornstad

15
"/ Linux'ta yasadışı değil. Yazarken bir \ ile kaçmanız gerekiyor" - bu ifade tamamen yanlış. dosyaadı bileşenleri / içeremez ve bundan kaçmanın bir etkisi yoktur.
Jim Balter

Yanıtlar:


216

Yasaklanmış dosya adı karakterlerinin “kapsamlı bir kılavuzu” Windows üzerinde çalışmayacaktır, çünkü karakterlerin yanı sıra dosya adlarını da saklı tutar. Evet, benzeri karakterler * " ?ve diğerleri yasaktır, ancak yalnızca geçerli karakterlerden oluşan sonsuz sayıda ad vardır. Örneğin, boşluklar ve noktalar geçerli dosya adı karakterleridir, ancak yalnızca bu karakterlerden oluşan adlar yasaktır.

Windows büyük ve küçük harfler arasında ayrım yapmaz, bu nedenle zaten Abir ad varsa bir klasör oluşturamazsınız a. Daha kötü, görünüşte izin verilen isimler PRNve CONve diğerleri gibi ayrılmış ve izin verilmiyor. Windows ayrıca birkaç uzunluk kısıtlamasına sahiptir; bir klasörde geçerli olan bir dosya adı başka bir klasöre taşınırsa geçersiz olabilir. Dosya ve klasör adlandırma kuralları Microsoft belgelerinde bulunur.

Genel olarak, Windows dizin adları oluşturmak için kullanıcı tarafından oluşturulan metni kullanamazsınız. Eğer istedikleri isim şey kullanıcıların izin vermek istiyorsanız, gibi güvenli adları oluşturmak zorunda A, AB, A2vd., Mağaza kullanıcı tarafından oluşturulan adları ve bir uygulama veri dosyasındaki kendi yolunu eşdeğerleri ve uygulamanızda yol eşlemesi gerçekleştirin.

Kullanıcı tarafından oluşturulan klasör adlarına kesinlikle izin vermeniz gerekiyorsa, geçersiz olup olmadıklarını anlamanın tek yolu istisnaları yakalamak ve adın geçersiz olduğunu varsaymaktır. Reddedilen erişim, çevrimdışı sürücüler ve sürücü dışı alan için atılan istisnalar geçersiz adlar için atılabilenlerle çakıştığından, bu tehlikeyle bile doludur. Büyük bir canı yakıyorsun.


11
MSDN bağlantısındaki anahtar sözcük "[ve hedef dosya sisteminin izin vermediği başka bir karakter" dir. Windows'da farklı dosya sistemleri olabilir. Bazıları Unicode'a izin verebilir, bazıları izin vermez. Genel olarak, bir adı doğrulamanın tek güvenli yolu, hedef cihazda denemektir.
Adrian McCarthy

72
Bazı yönergeler vardır ve “yalnızca yasaklanmış geçerli karakterlerden oluşan sonsuz sayıda ad vardır” yapıcı değildir. Aynı şekilde “Windows üst harf arasında ayrım yapmaz ve alt harf karakterleri” aptal istisnadır - OP sözdizimi ve olmayan semantik soruyor ve hiçbir sağ görüşlü insanlar gibi bir dosya adı söyleyebilirim A.txtoldu geçersiz çünkü a.TXTmevcut olabilir.
Borodin

9
COPY CON PRNklavye girişinden veya olası standartlardan okunması ve yazıcı aygıtına kopyalanması anlamına gelir. Modern pencerelerde hala geçerli olduğundan emin değilim, ama kesinlikle uzun zamandı. Eski günlerde metin yazmak ve nokta vuruşlu bir yazıcının çıktısını almak için kullanabilirsiniz.
AntonPiatek

6
"yapıcı değil" - aksine, bu bir gerçektir. Yapıcı olmayan şey Borodin'in savaşmasıdır.
Jim Balter

3
"Genel olarak, Windows dizin adları oluşturmak için kullanıcı tarafından oluşturulan metni kullanamazsınız." <- Bunu yapmak istiyorsanız, sadece bir karakter beyaz listesine sahip olabilirsiniz ve zaten var olan sorunu göz ardı ederseniz, büyük ölçüde işe yarayacaktır.
Casey

535

Önce basit tutalım ve soruyu cevaplayalım.

  1. Yasak yazdırılabilir ASCII karakterleri :

    • Linux / Unix:

      / (forward slash)
      
    • Pencereler:

      < (less than)
      > (greater than)
      : (colon - sometimes works, but is actually NTFS Alternate Data Streams)
      " (double quote)
      / (forward slash)
      \ (backslash)
      | (vertical bar or pipe)
      ? (question mark)
      * (asterisk)
      
  2. Yazdırılamayan karakterler

    Verileriniz yazdırılamayan karakterlere izin verecek bir kaynaktan geliyorsa, kontrol edilmesi gereken daha çok şey vardır.

    • Linux / Unix:

      0 (NULL byte)
      
    • Pencereler:

      0-31 (ASCII control characters)
      

    Not: Linux / Unix dosya sistemleri altında dosya adında kontrol karakterlerine sahip dosyalar oluşturmak yasal olsa da, kullanıcıların bu tür dosyalarla uğraşması bir kabus olabilir .

  3. Ayrılmış dosya adları

    Aşağıdaki dosya adları saklıdır:

    • Pencereler:

      CON, PRN, AUX, NUL 
      COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8, COM9
      LPT1, LPT2, LPT3, LPT4, LPT5, LPT6, LPT7, LPT8, LPT9
      

      (hem kendi başlarına hem de rastgele dosya uzantılarıyla LPT1.txt).

  4. Diğer kurallar

    • Pencereler:

      Dosya adları boşluk veya nokta ile bitemez.


5
Çoğu Windows dosya sistemi 8 bit karakterlerle sınırlı değildir. Windows'da yasaklanmış başka 8 bitlik karakterler (NUL, kontrol karakterleri) vardır. Bunları düşünmek bile, sorgulayıcının “dosya sisteminde bir dizin oluşturmasına” izin vermeyecektir, çünkü yasak olmayan karakterlerden oluşan sonsuz sayıda geçersiz dizin adı vardır.
Dour High Arch

38
Diğerleri bunu zaten söyledi ve yapıcı değil. Buraya bir cevap aramaya geldiğimde, listeyi başka bir yerde toplamak zorunda kaldım: Geçerli bir dosya adında iyi bir girişim oluştururken hangi karakterlerin kullanıcı girdisinden filtreleneceği. Karakterlerin birlikte geçersiz hale gelmesi sorusu da biraz ayrıntı gerektirebilir.
Christopher Oezbek

5
Linux'ta da NULL karakter yasaktır.
Dan Jones

3
Linux'ta yeni satırlar yasaklanmaz. Olmaları gerektiğini savunuyorum, ama ... ve eğer NUL Linux'ta yasaklanmışsa, o zaman Windows'da yasaklanmışsa, aynı amacı doldurur.
Alcaro

11
@ Soaku: Tabii ki değil, çünkü dünya Microsoft'un etrafında dönmüyor. Kesinlikle yasaklanması gereken iki karakter olduğunda neden gereksiz kısıtlamalar eklemelisiniz?
firegurafiku

68

Linux ve diğer Unix ile ilgili sistemlerde, bir dosya veya dizin adına görünmeyen yalnızca iki karakter vardır ve bunlar NUL '\0've eğik çizgi şeklindedir '/'. Eğik çizgi, elbette, dizin bileşenlerini ayırarak bir yol adında görünebilir.

Söylentiye 1 , Steven Bourne'un ('kabuk' şöhretinden) 254 dosya içeren bir dizine sahip olduğunu, bir dosya adında görünebilen her bir harf (karakter kodu) için bir dizin olduğunu (hariç /, '\0'adın .geçerli dizin olduğu elbette) ). Bourne kabuğunu test etmek için kullanıldı ve yedekleme programları gibi istenmeyen programlara rutin olarak zarar verdi.

Diğer insanlar Windows kurallarını karşıladı.

MacOS X'in büyük / küçük harfe duyarlı olmayan bir dosya sistemi olduğunu unutmayın.


1 Programlama Uygulamasında Kernighan & Pike , Bölüm 6, Test, §6.5 Stres Testleri'nde söylenenler:

Steve Bourne Unix kabuğunu yazarken (Bourne kabuğu olarak bilinir), '\0'Unix'te görünmeyen iki karakter hariç, bir bayt değeri için bir bayt değeri olan 254 dosyadan oluşan bir dizin oluşturdu. dosya adları. Bu dizini her türlü kalıp eşleme ve belirteç testleri için kullandı. (Test dizini elbette bir program tarafından oluşturuldu.) Yıllar sonra, bu dizin dosya-ağaç-yürüyüş programlarının bane idi; onları yıkım için test etti.

Dizinin giriş içermesi gerektiğini .ve ..bu nedenle 254 dosya yerine 253 dosya (ve 2 dizin) veya 255 ad girişi olması gerektiğini unutmayın. Bu, fıkraların etkililiğini veya açıkladığı dikkatli testleri etkilemez.


1
254 dosya? Peki ya utf8?
j_kubik

20
254 dosyanın tümü, dosya adında izin verilen her karakter için bir tane olmak üzere tek karakterli dosya adlarıdır. UTF-8, Steve Bourne Bourne kabuğunu yazdığında gözün arkasındaki bir parıltı bile değildi. UTF-8 geçerli bayt dizileri hakkında kurallar uygular (ve 0xC0, 0xC1, 0xF5-0xFF baytlarına tamamen izin vermez). Aksi takdirde, çok farklı değil - tartıştığım ayrıntı düzeyinde.
Jonathan Leffler

1
MacOS HFS + dosya sistemleri için diskteki dizin ayırıcı aslında '/' yerine ':' şeklindedir. İşletim sistemi genellikle (muhtemelen her zaman) * nix API'leriyle çalışırken doğru olanı yapar. Ancak, OSX dünyasına, örneğin el yazısı ile geçiyorsanız, bunun güvenilir bir şekilde gerçekleşmesini beklemeyin. Belki de Kakao API'leri / kullanmak ve: sizden de gizlemek gibi görünüyor, ama eski Karbon API'leri yok eminim.
Dan Pritts

@DanPritts Xcode tercihlerinde özel bir font / renk şeması oluşturdum /ve adında bir ile adlandırdım . Bu, şemada yeni bir dizin oluşturduğu için bazı sorunlara neden oldu.
Andreas

Dizin adında iki nokta üst üste işareti varsa, PATHiki nokta üst üste ayırıcı (Windows'ta noktalı virgül) olarak kullanıldığından dizini bir Unix değişkenine ekleyemeyeceğinizi unutmayın . Bu nedenle, böyle bir dizindeki programların ya nerede olduğunu (göreceli ya da mutlak olabilir) belirten bir yol adıyla çalıştırılması ya da dizinde olmanız ve yaygın olarak kabul edilen noktaya ( ., geçerli dizine) sahip olmanız gerekir. PATHgüvensiz.
Jonathan Leffler

36

Kara bir karakter listesi oluşturmak yerine bir beyaz liste kullanabilirsiniz . Her şey göz önüne alındığında, bir dosya veya dizin adı bağlamında anlamlı olan karakter aralığı oldukça kısadır ve çok belirli bir adlandırma gereksiniminiz yoksa, kullanıcılarınız ASCII tablosunun tamamını kullanamazlarsa uygulamanıza karşı tutmazlar.

Hedef dosya sistemindeki ayrılmış adlar sorununu çözmez, ancak bir beyaz listeyle kaynaktaki riskleri azaltmak daha kolaydır.

Bu ruhla, bu güvenli olarak kabul edilebilecek bir dizi karakterdir:

  • Harfler (az AZ) - Gerekirse Unicode karakterler de
  • Rakamlar (0-9)
  • Vurgulamak (_)
  • Kısa çizgi (-)
  • Uzay
  • Nokta (.)

Ve izin vermek istediğiniz ek güvenli karakterler. Bunun ötesinde, boşluklar ve noktalar ile ilgili bazı ek kurallar uygulamak zorundasınız . Bu genellikle yeterlidir:

  • Ad en az bir harf veya sayı içermelidir (yalnızca nokta / boşluklardan kaçınmak için)
  • Ad bir harf veya sayı ile başlamalıdır (önde gelen nokta / boşluklardan kaçınmak için)
  • Ad bir nokta veya boşlukla bitmeyebilir (varsa Explorer'da olduğu gibi kırpmanız yeterlidir)

Bu zaten oldukça karmaşık ve saçma isimlere izin veriyor. Örneğin, bu adlar bu kurallarla mümkün olabilir ve Windows / Linux'ta geçerli dosya adları olabilir:

  • A...........ext
  • B -.- .ext

Özünde, çok az beyaz listedeki karakterle bile, neyin gerçekten anlamlı olduğuna karar vermeli ve adı buna göre doğrulamalısınız / ayarlamalısınız. Uygulamalarımdan birinde, yukarıdakiyle aynı kuralları kullandım, ancak yinelenen noktaları ve boşlukları çıkardım.


15
Peki İngilizce bilmeyen kullanıcılara ne demeli?
pkh

2
@pkh: Yazımda bahsettiğim gibi, beyaz listenize gerekli tüm unicode karakterleri eklersiniz. Özellikle düzenli ifadeler kullanıyorsanız, karakter aralıkları genellikle oldukça kolay bir şekilde belirtilebilir.
AeonOfTime

2
Beyaz liste yaklaşımı kullanıyoruz, ancak Windows'ta cihaz adları (prn, lpt1, con) ve gibi ayrılmış, büyük / küçük harf bağımsız dizeleri yönetmeniz gerektiğini unutmayın. and ..
tahoar

2
Windows kısıtlamasını kaçırdınız: nokta veya boşlukla bitmemelidir.
Martin Bonner, Monica

1
"Her şey göz önüne alındığında, bir dosya veya dizin adı bağlamında anlamlı olan karakter aralığı oldukça kısadır." Belki bazı kullanım durumları için. Şimdi 20 dilde medya dosyaları içeren bir proje üzerinde çalışıyorum ve son kullanıcılar içeriği bu şekilde bulacağından dosya adlarının medya öğesinin başlığını yansıtması gerekiyor. İsimlerin çoğu noktalama işaretleri kullanır. Dosya adı karakterleriyle ilgili herhangi bir kısıtlama bir fiyat taşır, bu nedenle bu durumda kısıtlamaları en aza indirmeliyiz. Bu kullanım durumunda, dosya adında anlam ifade etmeyen karakter aralığı , dakilerden çok daha kısa ve basittir.
LarsH

30

Windows'un size cevabı söylemesini sağlamanın kolay yolu, bir dosyayı Explorer aracılığıyla yeniden adlandırmaya ve yeni ad için / yazın. Windows, size yasadışı karakterlerin listesini belirten bir mesaj kutusu açar.

A filename cannot contain any of the following characters:
    \ / : * ? " < > | 

https://support.microsoft.com/en-us/kb/177506


28

Peki, sadece araştırma amaçlı ise, o zaman en iyi bahsiniz, dosya adlarındaki bu Wikipedia girişine bakmaktır .

Kullanıcı girişini doğrulamak ve buna göre dosya adları oluşturmak için taşınabilir bir işlev yazmak istiyorsanız, kısa yanıt gelmez . Böyle bir "basit" görevi gerçekleştirmek için gereken tüm atlamalara bir göz atmak için Perl's File :: Spec gibi taşınabilir bir modüle göz atın .


5

Windows için PowerShell kullanarak kontrol edebilirsiniz

$PathInvalidChars = [System.IO.Path]::GetInvalidPathChars() #36 chars

UTF-8 kodlarını görüntülemek için dönüştürebilirsiniz

$enc = [system.Text.Encoding]::UTF8
$PathInvalidChars | foreach { $enc.GetBytes($_) }

$FileNameInvalidChars = [System.IO.Path]::GetInvalidFileNameChars() #41 chars

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference

PowershelI konuşmayanlar için $ FileNameInvalidChars 0x00 ile 0x1F arasındadır ve: "<> | *? \ /
Robin Davies

4

Windows 10 (2019) 'da, aşağıdaki karakterleri yazmaya çalıştığınızda bir hata tarafından yasaklanmıştır:

Bir dosya adı aşağıdaki karakterlerden hiçbirini içeremez:

\ / : * ? " < > |


3

İşte Christopher Oezbek'in cevabına dayanan pencereler için ac # uygulaması

İçerdiği klasör tarafından daha karmaşık hale getirildiKlasik boolean, ancak umarım her şeyi kapsar

/// <summary>
/// This will replace invalid chars with underscores, there are also some reserved words that it adds underscore to
/// </summary>
/// <remarks>
/// /programming/1976007/what-characters-are-forbidden-in-windows-and-linux-directory-names
/// </remarks>
/// <param name="containsFolder">Pass in true if filename represents a folder\file (passing true will allow slash)</param>
public static string EscapeFilename_Windows(string filename, bool containsFolder = false)
{
    StringBuilder builder = new StringBuilder(filename.Length + 12);

    int index = 0;

    // Allow colon if it's part of the drive letter
    if (containsFolder)
    {
        Match match = Regex.Match(filename, @"^\s*[A-Z]:\\", RegexOptions.IgnoreCase);
        if (match.Success)
        {
            builder.Append(match.Value);
            index = match.Length;
        }
    }

    // Character substitutions
    for (int cntr = index; cntr < filename.Length; cntr++)
    {
        char c = filename[cntr];

        switch (c)
        {
            case '\u0000':
            case '\u0001':
            case '\u0002':
            case '\u0003':
            case '\u0004':
            case '\u0005':
            case '\u0006':
            case '\u0007':
            case '\u0008':
            case '\u0009':
            case '\u000A':
            case '\u000B':
            case '\u000C':
            case '\u000D':
            case '\u000E':
            case '\u000F':
            case '\u0010':
            case '\u0011':
            case '\u0012':
            case '\u0013':
            case '\u0014':
            case '\u0015':
            case '\u0016':
            case '\u0017':
            case '\u0018':
            case '\u0019':
            case '\u001A':
            case '\u001B':
            case '\u001C':
            case '\u001D':
            case '\u001E':
            case '\u001F':

            case '<':
            case '>':
            case ':':
            case '"':
            case '/':
            case '|':
            case '?':
            case '*':
                builder.Append('_');
                break;

            case '\\':
                builder.Append(containsFolder ? c : '_');
                break;

            default:
                builder.Append(c);
                break;
        }
    }

    string built = builder.ToString();

    if (built == "")
    {
        return "_";
    }

    if (built.EndsWith(" ") || built.EndsWith("."))
    {
        built = built.Substring(0, built.Length - 1) + "_";
    }

    // These are reserved names, in either the folder or file name, but they are fine if following a dot
    // CON, PRN, AUX, NUL, COM0 .. COM9, LPT0 .. LPT9
    builder = new StringBuilder(built.Length + 12);
    index = 0;
    foreach (Match match in Regex.Matches(built, @"(^|\\)\s*(?<bad>CON|PRN|AUX|NUL|COM\d|LPT\d)\s*(\.|\\|$)", RegexOptions.IgnoreCase))
    {
        Group group = match.Groups["bad"];
        if (group.Index > index)
        {
            builder.Append(built.Substring(index, match.Index - index + 1));
        }

        builder.Append(group.Value);
        builder.Append("_");        // putting an underscore after this keyword is enough to make it acceptable

        index = group.Index + group.Length;
    }

    if (index == 0)
    {
        return built;
    }

    if (index < built.Length - 1)
    {
        builder.Append(built.Substring(index));
    }

    return builder.ToString();
}

Üç sorum var: 1. Neden StringBuilderilk kapasite değeriyle başlangıç yaptınız ? 2. Neden uzunluğuna 12 eklediniz filename? 3. 12 keyfi olarak mı seçildi yoksa bu sayının arkasında bir düşünce var mıydı?
iiminov

2

18/04/2017 tarihinden itibaren, bu konunun cevapları arasında basit bir siyah-beyaz karakter ve dosya adı listesi görülmemektedir - ve birçok cevap vardır.

Gelebileceğim en iyi öneri, kullanıcının istediği dosyayı adlandırmasına izin vermekti. Uygulama dosyayı kaydetmeye, istisnaları yakalamaya çalıştığında bir hata işleyici kullanarak, dosya adının suçlandığını varsayalım (kayıt yolunun da iyi olduğundan emin olduktan sonra) ve kullanıcıdan yeni bir dosya adı isteyin. En iyi sonuçlar için, bu kontrol prosedürünü kullanıcı doğru olana veya vazgeçene kadar devam eden bir döngü içine yerleştirin. Benim için en iyi çalıştı (en azından VBA'da).


1
Cevabınız @FCastro teknik açıdan doğrudur. Ancak UX perspektifinden bakıldığında bir kabus - kullanıcı tekrar tekrar "bir şeyler yazın ve başarılı olup olmadığını söyleyeceğim" oyununu oynamak zorunda kalır. Kullanıcıya daha sonra dönüştürülecek geçersiz bir karakter girdiklerini söyleyen bir mesaj (uyarı stili) görmeyi tercih ederim.
Mike

Christopher Oezbek 2015 yılında böyle bir kara liste verdi.
Jim Balter

1

Tek yasadışı Unix karakterleri olsa da /ve NULLkomut satırı yorumlaması için biraz dikkate alınmasına rağmen.

Örneğin, bir dosyayı 1>&2veya 2>&1Unix'te adlandırmak yasal olsa da, bunun gibi dosya adları bir komut satırında kullanıldığında yanlış yorumlanabilir.

Benzer şekilde bir dosyayı adlandırmak da mümkündür $PATH, ancak komut satırından erişmeye çalışırken kabuk $PATHdeğişken değerine çevrilir .


$'myvalueis'$ echo 'hi' > $'2>&1'cat 2\>\&1
BASH'deki

1

Tanımlamakla zorluklar, neyi yasal değil edilmiş zaten adressed ve beyaz listeler önerilmiştir . Ancak Windows 8 bitten fazla karakteri destekler. Wikipedia , (örneğin)

değiştirici harf iki nokta üst üste [( bkz. aşağıda 7. ) dosya adları için kullanılan Segoe UI yazı tipindeki iki nokta üst üste işareti ile aynı olduğundan bazen Windows dosya adlarında kullanılır. [Kalıtsal ASCII] kolonunun kendisine izin verilmez.

Bu nedenle, "yasadışı" olanların yerine Unicode karakterleri kullanarak çok daha liberal bir yaklaşım sunmak istiyorum. Sonucu, karşılaştırılabilir kullanım durumumda çok daha okunabilir buldum. Örneğin bu bloğa bakın . Ayrıca orijinal içeriği bundan geri yükleyebilirsiniz. Olası seçenekler ve araştırmalar aşağıdaki listede verilmiştir:

  1. Yerine *( U+002A * ASTERISK), kullanabilirsiniz birçok birini örneğin, listelenen U+2217 ∗ (ASTERISK OPERATOR)veyaFull Width Asterisk U+FF0A *
  2. Yerine ., sen birini kullanabilirsiniz bu örneğin,⋅ U+22C5 dot operator
  3. Bunun yerine "kullanabilirsiniz “ U+201C english leftdoublequotemark(Alternatifler buraya bakın )
  4. /( / SOLIDUS U+002F) Yerine, ( ∕ DIVISION SLASH U+2215diğerleri burada )
  5. \( \ U+005C Reverse solidus) Yerine ⧵ U+29F5 Reverse solidus operator( daha fazla ) kullanabilirsiniz
  6. Yerine [( U+005B Left square bracket) ve ]( U+005D Right square bracket), örneğin kullanabilirsiniz U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETve U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET(dan burada daha olanakları, burada )
  7. Bunun yerine veya :kullanabilirsiniz , ( bazen Windows dosya adlarında kullanılan iki nokta üst üste (harf) , dosya adları için kullanılan Segoe UI yazı tipindeki iki nokta üst üste işareti ile aynıdır . İki nokta üst üste kullanımına izin verilmez) ( Buraya bakın )U+2236 ∶ RATIO (for mathematical usage)U+A789 ꞉ MODIFIER LETTER COLON
  8. Bunun yerine ;kullanabilirsiniz U+037E ; GREEK QUESTION MARK( buraya bakın )
  9. İçin |: bazı iyi yerine örneğin vardır U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDESya da U+01C0 ǀ LATIN LETTER DENTAL CLICK( Vikipedi ). Ayrıca kutu çizim karakterleri çeşitli başka seçenekler de içerir.
  10. ,( , U+002C COMMA) Yerine, örneğin kullanabilirsiniz ‚ U+201A SINGLE LOW-9 QUOTATION MARK( buraya bakın )
  11. İçin ?( U+003F ? QUESTION MARK:), bunlar iyi adaylardır U+FF1F ? FULLWIDTH QUESTION MARKveya U+FE56 ﹖ SMALL QUESTION MARK(dan o re , daha iki Dingbat'ler Blok , "soru" için arama)

0

Windows'ta internet kısayolları oluştururken, dosya adını oluşturmak için eksi haline getirilen eğik çizgi hariç yasadışı karakterleri atlar.


3
"bir cevap değil ... reddetti - bir moderatör bayrağını inceledi, ama onu destekleyecek hiçbir kanıt bulamadı". Şaka yapıyor olmalısın. Daha iyi moderatörler, lütfen.
Jim Balter

-1

Unix mermilerinde, hemen hemen her karakteri tek tırnak içinde alabilirsiniz '. Tek tırnak dışında ve kontrol karakterlerini ifade edemezsiniz, çünkü \genişlemez. Tek tırnak içine alıntı yapılan bir dize içinden erişmek mümkündür, çünkü dizeleri tek ve çift tırnak işaretleri ile birleştirebilirsiniz, bunun gibi 'I'"'"'m'bir dosyaya erişmek için kullanılabilir "I'm"(burada çift tırnak da mümkündür).

Bu yüzden tüm kontrol karakterlerinden kaçınmalısınız, çünkü kabuğa girmek çok zordur. Gerisi hala iki tire yoksa çoğu komutları seçenekleri olarak bu okuma çünkü özellikle, bir tire ile başlayan dosyaları, komik --önce veya bunları belirtmek ./de başlangıç gizler hangi -.

Güzel olmak istiyorsanız, kabuğun ve tipik komutların sözdizimsel elemanlar olarak kullandığı karakterlerden hiçbirini kullanmayın, bazen konuma bağımlıdır, bu nedenle örneğin -ilk karakter olarak kullanmaya devam edebilirsiniz , ancak yine de kullanabilirsiniz ; aynı şekilde ., onu sadece kastettiğinizde ilk karakter olarak kullanabilirsiniz ("gizli dosya"). Demek istediğiniz zaman, dosya adları VT100 kaçış dizileri ;-), böylece ls çıktı garbles.


Soru mermilerle ilgili değil.
Jim Balter

-8

Aynı ihtiyacı vardı ve tavsiye veya standart referanslar arıyordu ve bu iş parçacığı rastladı. Dosya ve dizin adlarında kaçınılması gereken geçerli karakter kara listem:

$CharactersInvalidForFileName = {
    "pound" -> "#",
    "left angle bracket" -> "<",
    "dollar sign" -> "$",
    "plus sign" -> "+",
    "percent" -> "%",
    "right angle bracket" -> ">",
    "exclamation point" -> "!",
    "backtick" -> "`",
    "ampersand" -> "&",
    "asterisk" -> "*",
    "single quotes" -> "“",
    "pipe" -> "|",
    "left bracket" -> "{",
    "question mark" -> "?",
    "double quotes" -> "”",
    "equal sign" -> "=",
    "right bracket" -> "}",
    "forward slash" -> "/",
    "colon" -> ":",
    "back slash" -> "\\",
    "lank spaces" -> "b",
    "at sign" -> "@"
};

4
@listede olması hakkında yorum yapmak ister misiniz ?
PypeBros

8
Soru, hangi karakterlerin yasadışı olduğuydı. Listenizdeki karakterlerin çoğu yasaldır.
Nigel Alderton

6
mektup b? lol, sanırım b den lank spaces... hala birkaç tane bırakır ... Bir resmi yeniden adlandırdım (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpgama kızgın görünmesi nedeniyle geri değiştirmek zorunda kaldım ...
ashleedawg 3:18 '
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.