¿Qué caracteres están prohibidos en los nombres de directorio de Windows y Linux?

356

Sé que / es ilegal en Linux, y lo siguiente es ilegal en Windows (creo) * . " / \ [ ] : ; | ,

¿Qué más me estoy perdiendo?

Sin embargo, necesito una guía completa que tenga en cuenta los caracteres de doble byte. Vincular a recursos externos está bien para mí.

Primero necesito crear un directorio en el sistema de archivos usando un nombre que pueda contener caracteres prohibidos, así que planeo reemplazar esos caracteres con guiones bajos. Luego necesito escribir este directorio y su contenido en un archivo zip (usando Java), por lo que cualquier consejo adicional sobre los nombres de los directorios zip sería apreciado.

Jeff
fuente
13
De hecho, algunos de los caracteres que menciona están permitidos en Windows. Mira esto:echo abc > "ab.;,=[1]"
dolmen
3
Además, no olvide que <y> son ilegales en Windows.
AnotherParker
44
/ no es ilegal en Linux. Solo tiene que escapar con un \ al escribirlo.
David C. Bishop
55
@ DavidC.Bishop: Esta publicación SO afirma que el kernel de Linux le impedirá trabajar con un nombre de archivo que contenga una barra oblicua. ¿Has podido hacer que funcione?
Soren Bjornstad
14
"/ no es ilegal en Linux. Solo tienes que escapar con un \ cuando lo escribes" - esta afirmación es completamente incorrecta. los componentes de nombre de archivo no pueden contener /, y escapar no tiene efecto.
Jim Balter

Respuestas:

215

Una "guía completa" de caracteres de nombre de archivo prohibidos no funcionará en Windows porque reserva nombres de archivo y caracteres. Sí, los caracteres como * " ?y otros están prohibidos, pero hay un número infinito de nombres compuestos solo por caracteres válidos que están prohibidos. Por ejemplo, los espacios y puntos son caracteres válidos de nombre de archivo, pero los nombres compuestos solo por esos caracteres están prohibidos.

Windows no distingue entre mayúsculas y minúsculas, por lo que no puede crear una carpeta con nombre Asi aya existe una con nombre . Peor, los nombres aparentemente permitidos como PRNy CON, y muchos otros, están reservados y no permitidos. Windows también tiene varias restricciones de longitud; un nombre de archivo válido en una carpeta puede volverse inválido si se mueve a otra carpeta. Las reglas para nombrar archivos y carpetas están en los documentos de Microsoft.

En general, no puede usar texto generado por el usuario para crear nombres de directorio de Windows. Si desea permitir a los usuarios a nombre de todo lo que quieran, hay que crear nombres seguros como A, AB, A2et al., Nombres de las tiendas generados por los usuarios y sus equivalentes de ruta en un archivo de datos de la aplicación, y realizar el mapeo de ruta en su aplicación.

Si absolutamente debe permitir nombres de carpetas generados por el usuario, la única forma de saber si son inválidos es detectar excepciones y asumir que el nombre no es válido. Incluso eso está plagado de peligros, ya que las excepciones lanzadas para el acceso denegado, las unidades fuera de línea y el espacio fuera de la unidad se superponen con las que se pueden lanzar por nombres no válidos. Estás abriendo una enorme lata de dolor.

Dour High Arch
fuente
11
La frase clave del enlace de MSDN es "[y un] otro carácter que el sistema de archivos de destino no permite". Puede haber diferentes sistemas de archivos en Windows. Algunos pueden permitir Unicode, otros no. En general, la única forma segura de validar un nombre es probarlo en el dispositivo de destino.
Adrian McCarthy
72
Hay algunas pautas y "no hay una cantidad infinita de nombres compuestos solo por caracteres válidos que estén prohibidos" no es constructivo. Del mismo modo, "Windows no distingue entre mayúsculas y minúsculas" es una estúpida excepción: el OP pregunta por la sintaxis y no por la semántica, y ninguna persona acertada diría que un nombre de archivo como noA.txt es válido porque a.TXTpuede existir.
Borodin
99
COPY CON PRNsignifica leer desde la entrada del teclado, o posible stdin, y copiarlo al dispositivo de la impresora. No estoy seguro de que siga siendo válido en las ventanas modernas, pero ciertamente lo fue durante mucho tiempo. En los viejos tiempos, podía usarlo para escribir texto y tener una impresora de matriz de puntos simplemente emitirlo.
AntonPiatek
66
"no es constructivo", por el contrario, es un hecho. Lo que no es constructivo es la beligerancia de Borodin.
Jim Balter
3
"En general, no puede usar texto generado por el usuario para crear nombres de directorio de Windows". <- Si desea hacer esto, puede tener una lista blanca de caracteres y funcionará en gran medida, si puede ignorar el problema ya existente.
Casey
533

Hagámoslo simple y respondamos la pregunta primero.

  1. Los caracteres ASCII imprimibles prohibidos son:

    • Linux / Unix:

      / (forward slash)
      
    • Ventanas:

      < (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. Caracteres no imprimibles

    Si sus datos provienen de una fuente que permitiría caracteres no imprimibles, entonces hay más para verificar.

    • Linux / Unix:

      0 (NULL byte)
      
    • Ventanas:

      0-31 (ASCII control characters)
      

    Nota: Si bien es legal bajo los sistemas de archivos Linux / Unix crear archivos con caracteres de control en el nombre del archivo, puede ser una pesadilla para los usuarios tratar con dichos archivos .

  3. Nombres de archivo reservados

    Los siguientes nombres de archivo están reservados:

    • Ventanas:

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

      (tanto solos como con extensiones de archivo arbitrarias, por ejemplo LPT1.txt).

  4. Otras reglas

    • Ventanas:

      Los nombres de archivo no pueden terminar en un espacio o punto.

Christopher Oezbek
fuente
55
La mayoría de los sistemas de archivos de Windows no están restringidos a caracteres de 8 bits. Hay muchos otros caracteres de 8 bits (NUL, caracteres de control) que están prohibidos en Windows. Incluso teniendo en cuenta que no permitirá que el interlocutor "cree un directorio en el sistema de archivos" como lo pidió porque hay un número infinito de nombres de directorio no válidos formados por caracteres no prohibidos.
Dour High Arch
38
Otros ya lo han dicho y no es constructivo. Cuando llegué aquí buscando una respuesta, quería la lista que tenía que reunir en otro lugar: qué caracteres filtrar de la entrada del usuario al crear un buen intento de un nombre de archivo válido. La pregunta de si los caracteres juntos se vuelven inválidos, también podría necesitar alguna elaboración.
Christopher Oezbek
55
Un carácter NULL también está prohibido en Linux.
Dan Jones
3
Las nuevas líneas no están prohibidas en Linux. Sin embargo, diría que deberían serlo ... y si NUL está prohibido en Linux, entonces está prohibido en Windows, cumple el mismo propósito.
Alcaro
11
@Soaku: por supuesto que no, ya que el mundo no gira en torno a Microsoft. ¿Por qué agregar restricciones innecesarias cuando solo hay dos caracteres que son absolutamente necesarios para prohibir?
firegurafiku
67

Bajo Linux y otros sistemas relacionados con Unix, solo hay dos caracteres que no pueden aparecer en el nombre de un archivo o directorio, y esos son NUL '\0'y barra oblicua '/'. La barra oblicua, por supuesto, puede aparecer en un nombre de ruta, separando los componentes del directorio.

El rumor 1 dice que Steven Bourne (de fama 'shell') tenía un directorio que contenía 254 archivos, uno por cada letra (código de carácter) que puede aparecer en un nombre de archivo (excluyendo /, '\0'el nombre .era el directorio actual, por supuesto ) Se usó para probar el shell Bourne y ocasionar estragos en programas incautos como los programas de respaldo.

Otras personas han cubierto las reglas de Windows.

Tenga en cuenta que MacOS X tiene un sistema de archivos que no distingue entre mayúsculas y minúsculas.


1 Fue Kernighan & Pike en The Practice of Programming quien dijo lo mismo en el Capítulo 6, Pruebas, §6.5 Pruebas de resistencia:

Cuando Steve Bourne estaba escribiendo su shell de Unix (que se conoció como el shell de Bourne), creó un directorio de 254 archivos con nombres de un carácter, uno para cada valor de byte excepto '\0'y barra, los dos caracteres que no pueden aparecer en Unix nombres de archivo Utilizó ese directorio para todo tipo de pruebas de coincidencia de patrones y tokenización. (El directorio de prueba, por supuesto, fue creado por un programa). Durante años después, ese directorio fue la ruina de los programas de caminar por el árbol de archivos; los probó a la destrucción.

Tenga en cuenta que el directorio debe haber contenido entradas .y .., por lo tanto, podría decirse que eran 253 archivos (y 2 directorios) o 255 entradas de nombre, en lugar de 254 archivos. Esto no afecta la efectividad de la anécdota o las pruebas cuidadosas que describe.

Jonathan Leffler
fuente
1
254 archivos? ¿Y qué hay de utf8?
j_kubik
20
Los 254 archivos eran todos nombres de archivo de un solo carácter, uno por carácter que estaba permitido en un nombre de archivo. UTF-8 ni siquiera era un brillo en el ojo cuando Steve Bourne escribió el shell Bourne. UTF-8 impone reglas sobre las secuencias válidas de bytes (y no permite los bytes 0xC0, 0xC1, 0xF5-0xFF por completo). De lo contrario, no es muy diferente, al nivel de detalle que estoy discutiendo.
Jonathan Leffler
1
El separador de directorio en disco para sistemas de archivos HFS + de MacOS es en realidad un ':' en lugar de un '/'. El sistema operativo generalmente (probablemente siempre) hace lo correcto cuando trabaja con las API * nix. Pero no espere que esto suceda de manera confiable si se muda al mundo OSX, por ejemplo, con AppleScript. Parece que quizás las API de Cocoa usan / y ocultan el: de usted también, pero estoy bastante seguro de que las antiguas API de carbono no lo hacen.
Dan Pritts
@DanPritts Creé un esquema de fuente / color personalizado en las preferencias de Xcode, nombrándolo con un /nombre. Eso causó algunos problemas, ya que creó un nuevo directorio con el esquema.
Andreas
Tenga en cuenta que si un directorio tiene dos puntos en su nombre, no puede agregar el directorio a una PATHvariable Unix porque dos puntos se usan como separador (punto y coma en Windows). Por lo tanto, los programas en dicho directorio deben ejecutarse con un nombre de ruta que especifique dónde está (podría ser relativo o absoluto), o debe estar en el directorio y tener un punto ( .el directorio actual) PATH, que es ampliamente considerado como Un inseguro.
Jonathan Leffler
36

En lugar de crear una lista negra de caracteres, puede usar una lista blanca . A fin de cuentas, el rango de caracteres que tiene sentido en un contexto de nombre de archivo o directorio es bastante corto, y a menos que tenga algunos requisitos de nomenclatura muy específicos, sus usuarios no lo incluirán en su aplicación si no pueden usar toda la tabla ASCII.

No resuelve el problema de los nombres reservados en el sistema de archivos de destino, pero con una lista blanca es más fácil mitigar los riesgos en la fuente.

En ese espíritu, esta es una gama de personajes que pueden considerarse seguros:

  • Letras (az AZ) : caracteres Unicode también, si es necesario
  • Dígitos (0-9)
  • Guion bajo (_)
  • Guión (-)
  • Espacio
  • Punto (.)

Y cualquier personaje seguro adicional que desee permitir. Más allá de esto, solo tiene que aplicar algunas reglas adicionales con respecto a espacios y puntos . Esto suele ser suficiente:

  • El nombre debe contener al menos una letra o número (para evitar solo puntos / espacios)
  • El nombre debe comenzar con una letra o número (para evitar puntos / espacios iniciales)
  • El nombre puede no terminar con un punto o espacio (simplemente recorte esos si están presentes, como lo hace Explorer)

Esto ya permite nombres bastante complejos y sin sentido. Por ejemplo, estos nombres serían posibles con estas reglas y serían nombres de archivo válidos en Windows / Linux:

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

En esencia, incluso con tan pocos caracteres en la lista blanca, aún debe decidir qué tiene sentido y validar / ajustar el nombre en consecuencia. En una de mis aplicaciones, utilicé las mismas reglas que antes pero eliminé los puntos y espacios duplicados.

AeonOfTime
fuente
15
¿Y qué hay de mis usuarios que no hablan inglés, a quienes les fastidiaría todo esto?
pkh
2
@pkh: Como mencioné en mi publicación, incluirías los caracteres Unicode necesarios en tu lista blanca. Los rangos de caracteres generalmente se pueden especificar con bastante facilidad, especialmente si utiliza expresiones regulares, por ejemplo.
AeonOfTime
2
Usamos un enfoque de lista blanca, pero no olvide que en Windows debe administrar cadenas reservadas e independientes de mayúsculas y minúsculas, como nombres de dispositivos (prn, lpt1, con) y. y ..
tahoar
2
Te has perdido la restricción de Windows: no debe terminar en punto o espacio.
Martin Bonner apoya a Mónica el
1
"A fin de cuentas, el rango de caracteres que tiene sentido en un contexto de nombre de archivo o directorio es bastante corto". Quizás para algunos casos de uso. Estoy trabajando en un proyecto que ahora incluye archivos multimedia en 20 idiomas, y los nombres de los archivos deben reflejar el título del elemento multimedia porque los usuarios finales encontrarán el contenido de esa manera. Muchos de los nombres usan puntuación. Cualquier restricción en los caracteres del nombre de archivo conlleva un precio, por lo que en este caso tenemos que minimizar las restricciones. En este caso de uso, el rango de caracteres que no tiene sentido en un nombre de archivo es mucho más corto y simple que los que sí lo tienen.
LarsH
29

La manera fácil de hacer que Windows le diga la respuesta es intentar cambiar el nombre de un archivo a través del Explorador y escribir / para el nuevo nombre. Windows abrirá un cuadro de mensaje que le indicará la lista de caracteres ilegales.

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

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

chrisjej
fuente
28

Bueno, aunque solo sea para fines de investigación, entonces su mejor opción es mirar esta entrada de Wikipedia sobre nombres de archivos .

Si desea escribir una función portátil para validar la entrada del usuario y crear nombres de archivo basados ​​en eso, la respuesta corta es no . Eche un vistazo a un módulo portátil como Perl's File :: Spec para echar un vistazo a todos los saltos necesarios para realizar una tarea tan "simple".

Leonardo Herrera
fuente
5

Para Windows puede verificarlo usando PowerShell

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

Para mostrar códigos UTF-8, puede convertir

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

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

$FileOnlyInvalidChars = @(':', '*', '?', '\', '/') #5 chars - as a difference
Wojciech Sciesinski
fuente
Para aquellos que no hablan PowershelI, $ FileNameInvalidChars es de 0x00 a 0x1F y: "<> | *? \ /
Robin Davies
4

En Windows 10 (2019), los siguientes caracteres están prohibidos por un error cuando intenta escribirlos:

Un nombre de archivo no puede contener ninguno de los siguientes caracteres:

\ / : * ? " < > |

Bret Cameron
fuente
3

Aquí está la implementación de ac # para Windows basada en la respuesta de Christopher Oezbek

Se hizo más complejo por el booleano contiene carpeta, pero es de esperar que cubra todo

/// <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();
}
Charlie Rix
fuente
Tengo tres preguntas: 1. ¿Por qué se inicializó StringBuildercon el valor de capacidad inicial? 2. ¿Por qué agregaste 12 a la longitud de filename? 3. ¿Se eligió 12 arbitrariamente o se pensó algo detrás de este número?
iiminov
2

A partir del 18/04/2017, no hay una lista simple en blanco o negro de caracteres y nombres de archivos entre las respuestas a este tema, y ​​hay muchas respuestas.

La mejor sugerencia que se me ocurrió fue dejar que el usuario nombrara el archivo como quisiera. Usando un controlador de errores cuando la aplicación intenta guardar el archivo, detectar cualquier excepción, asumir que el nombre de archivo es el culpable (obviamente, después de asegurarse de que la ruta de guardado también esté bien) y solicitar al usuario un nuevo nombre de archivo. Para obtener mejores resultados, coloque este procedimiento de verificación dentro de un ciclo que continúa hasta que el usuario lo haga bien o se dé por vencido. Funcionó mejor para mí (al menos en VBA).

FCastro
fuente
1
Su respuesta @FCastro es correcta desde el punto de vista técnico. Sin embargo, desde la perspectiva de UX es una pesadilla: el usuario se ve obligado a jugar el juego "escribe algo y te diré si tienes éxito" una y otra vez. Prefiero ver un mensaje (estilo de advertencia) que le dice al usuario que ha ingresado un carácter ilegal que luego se convertirá.
Mike
Christopher Oezbek proporcionó una lista tan negra en 2015.
Jim Balter
1

Aunque los únicos caracteres ilegales de Unix pueden ser /y NULL, aunque se debe incluir alguna consideración para la interpretación de la línea de comandos.

Por ejemplo, si bien puede ser legal nombrar un archivo 1>&2o 2>&1en Unix, los nombres de archivo como este pueden malinterpretarse cuando se usan en una línea de comando.

De manera similar, podría ser posible nombrar un archivo $PATH, pero cuando intente acceder a él desde la línea de comandos, el shell se traducirá $PATHa su valor variable.

Dogg Bookins
fuente
para literales en BASH, la mejor manera que he encontrado para declarar literales sin interpolación es $'myvalueis', por ejemplo $ echo 'hi' > $'2>&1', cat 2\>\&1"hola"
ThorSummoner
1

Las dificultades para definir, qué es legal y qué no , ya se abordaron y se sugirieron listas blancas . Pero Windows admite caracteres de más de 8 bits . Wikipedia dice que (por ejemplo) el

la letra del modificador de dos puntos [( Ver 7. más abajo ) se usa] a veces en los nombres de archivo de Windows, ya que es idéntica a los dos puntos en la fuente Segoe UI utilizada para los nombres de archivo. El colon [ASCII heredado] en sí mismo no está permitido.

Por lo tanto, quiero presentar un enfoque mucho más liberal utilizando caracteres Unicode para reemplazar los "ilegales". Encontré el resultado en mi caso de uso comparable mucho más legible. Mira por ejemplo en este bloque . Además, incluso puede restaurar el contenido original a partir de eso. Las posibles opciones e investigaciones se proporcionan en la siguiente lista:

  1. En lugar de *( U+002A * ASTERISK), puede usar uno de los muchos enumerados, por ejemplo U+2217 ∗ (ASTERISK OPERATOR)o elFull Width Asterisk U+FF0A *
  2. En lugar de ., puede usar uno de estos , por ejemplo⋅ U+22C5 dot operator
  3. En lugar de ", puedes usar “ U+201C english leftdoublequotemark(Alternativas ver aquí )
  4. En lugar de /( / SOLIDUS U+002F), puede usar ∕ DIVISION SLASH U+2215(otros aquí )
  5. En lugar de \( \ U+005C Reverse solidus), puede usar ⧵ U+29F5 Reverse solidus operator( más )
  6. En lugar de [( U+005B Left square bracket) y ]( U+005D Right square bracket), puede usar por ejemplo U+FF3B[ FULLWIDTH LEFT SQUARE BRACKETy U+FF3D ]FULLWIDTH RIGHT SQUARE BRACKET(desde aquí , más posibilidades aquí )
  7. En lugar de :, puede usar U+2236 ∶ RATIO (for mathematical usage)o U+A789 ꞉ MODIFIER LETTER COLON, (ver dos puntos (letra) , a veces se usa en los nombres de archivo de Windows, ya que es idéntico a los dos puntos en la fuente Segoe UI utilizada para los nombres de archivo. Los dos puntos en sí no están permitidos) (Ver aquí )
  8. En lugar de ;, puedes usar U+037E ; GREEK QUESTION MARK(ver aquí )
  9. Para |, hay algunos buenos sustitutos tales como: U+0964 । DEVANAGARI DANDA, U+2223 ∣ DIVIDESo U+01C0 ǀ LATIN LETTER DENTAL CLICK( Wikipedia ). Además, los caracteres del cuadro de dibujo contienen varias otras opciones.
  10. En lugar de ,( , U+002C COMMA), puede usar por ejemplo ‚ U+201A SINGLE LOW-9 QUOTATION MARK(ver aquí )
  11. Para ?( U+003F ? QUESTION MARK), estos son buenos candidatos: U+FF1F ? FULLWIDTH QUESTION MARKo U+FE56 ﹖ SMALL QUESTION MARK(a partir de él re , dos más de Script bloque , buscar "cuestión")
Cadoiz
fuente
0

Al crear accesos directos a Internet en Windows, para crear el nombre del archivo, omite los caracteres ilegales, excepto la barra diagonal, que se convierte en menos.

Matthias Ronge
fuente
3
"no es una respuesta ... rechazada: un moderador revisó su bandera, pero no encontró evidencia que la respalde". Tienes que estar bromeando. Mejores moderadores, por favor.
Jim Balter
-1

En shells de Unix, puede citar casi todos los caracteres entre comillas simples '. Excepto la comilla simple en sí, y no puede expresar caracteres de control, porque \no está expandido. Es posible acceder a la comilla simple dentro de una cadena entre comillas, porque puede concatenar cadenas con comillas simples y dobles, como las 'I'"'"'m'que se pueden usar para acceder a un archivo llamado "I'm"(la comilla doble también es posible aquí).

Por lo tanto, debe evitar todos los caracteres de control, porque son demasiado difíciles de ingresar en el shell. El resto sigue siendo divertido, especialmente los archivos que comienzan con un guión, porque la mayoría de los comandos los leen como opciones a menos que tenga dos guiones --antes, o los especifique con ./, lo que también oculta el inicio -.

Si quiere ser amable, no use ninguno de los caracteres que el shell y los comandos típicos usan como elementos sintácticos, a veces dependientes de la posición, por lo que, por ejemplo, aún puede usar -, pero no como primer carácter; lo mismo con ., puede usarlo como primer carácter solo cuando lo diga en serio ("archivo oculto"). Cuando eres malo, los nombres de tus archivos son secuencias de escape VT100 ;-), de modo que un ls confunde la salida.

42
fuente
La pregunta no es sobre conchas.
Jim Balter
-8

Tenía la misma necesidad y estaba buscando recomendaciones o referencias estándar y encontré este hilo. Mi lista negra actual de caracteres que se deben evitar en los nombres de archivo y directorio son:

$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" -> "@"
};
Meng Lu
fuente
44
¿te importaría comentar sobre tener @en la lista?
PypeBros
8
La pregunta era qué personajes son ilegales. La mayoría de los personajes de tu lista son legales.
Nigel Alderton el
66
la carta b? lol, supongo que esa es la b de lank spaces... bueno, eso todavía deja algunos ... (),-.;[]^_~€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖ×ØÙÚÛÜÝÞßàáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ.jpg
Cambié el