ubicación tipos sistema qué procesos para muestra lista comandos comando borrar basicos archivos actual windows linux directory zip filenames

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



qué comando muestra tu ubicación actual en el sistema de archivos (12)

A partir del 18/04/2017, no hay una simple lista blanca o negra de caracteres y nombres de archivo entre las respuestas a este tema, y ​​hay muchas respuestas.

La mejor sugerencia que se me ocurrió fue dejar que el usuario nombre el archivo como quiera. Usar un controlador de errores cuando la aplicación intenta guardar el archivo, detectar excepciones, asumir que el nombre del archivo es el culpable (obviamente, después de asegurarse de que la ruta de guardado esté bien también) y pedirle al usuario un nuevo nombre de archivo. Para obtener los mejores resultados, coloque este procedimiento de verificación dentro de un bucle que continúe hasta que el usuario lo haga bien o se rinda. Funcionó mejor para mí (al menos en VBA).

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 y una que tenga en cuenta los caracteres de doble byte. La vinculación con recursos externos está bien conmigo.

Primero debo crear un directorio en el sistema de archivos con un nombre que pueda contener caracteres prohibidos, por lo 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 se agradecería cualquier consejo adicional sobre los nombres de los directorios zip.


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


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, aunque podría ser legal nombrar un archivo 1>&2 o 2>&1 en Unix, los nombres de archivo como este pueden ser mal interpretados cuando se usan en una línea de comando.

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


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 diagonal ''/'' . La barra, por supuesto, puede aparecer en un nombre de ruta, separando los componentes del directorio.

El rumor 1 dice que Steven Bourne (de ''shell'' fame) tenía un directorio que contenía 254 archivos, uno para 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 de forma rutinaria causó 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 lo dijo en el Capítulo 6, Pruebas, §6.5 Pruebas de estrés:

Cuando Steve Bourne estaba escribiendo su shell Unix (que se conoció como el shell Bourne), creó un directorio de 254 archivos con nombres de un solo carácter, uno para cada valor de byte excepto ''/0'' y barra diagonal, los dos caracteres que no puede aparecer en los nombres de archivos Unix. 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 pesadilla de los programas que caminan sobre el árbol de archivos; los probó a la destrucción.


Bueno, aunque solo sea para propósitos de investigación, entonces su mejor apuesta es mirar esta entrada de Wikipedia en Nombres de archivo .

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


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 nombre muy específicos, sus usuarios no lo mantendrán en su aplicación si no pueden usar la tabla ASCII completa.

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 el origen.

En ese sentido, este es un rango 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 otro personaje seguro que desees permitir. Más allá de esto, solo tienes que hacer cumplir algunas reglas adicionales con respecto a los 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 un número (para evitar puntos / espacios iniciales)

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 lo que realmente tiene sentido, y validar / ajustar el nombre en consecuencia. En una de mis aplicaciones, utilicé las mismas reglas anteriores pero eliminé los puntos y espacios duplicados.


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

Por lo tanto, debes evitar todos los caracteres de control, ya que son muy difíciles de ingresar en el shell. El resto aún es 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 ./ , que también oculta el inicio - .

Si desea 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 . , puedes usarlo como primer carácter solo cuando lo dices ("archivo oculto"). Cuando eres malo, tus nombres de archivos son secuencias de escape VT100 ;-), de modo que un ls confunde la salida.


La manera fácil de hacer que Windows le diga la respuesta es intentar cambiar el nombre de un archivo a través de Explorer 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


Mantengámoslo simple y respondamos la pregunta, primero.

  1. Los caracteres ASCII imprimibles prohibidos son:

    • Linux / Unix:

      / (forward slash)

    • Windows:

      < (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)

    • Windows:

      0-31 (ASCII control characters)

    Nota: si bien es legal en 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 archivos reservados

    Los siguientes nombres de archivos están reservados:

    • Windows:

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

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

  4. Otras reglas

    • Windows:

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


Para Windows puedes comprobarlo utilizando PowerShell.

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

Para mostrar los 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


Tenía la misma necesidad y estaba buscando recomendaciones o referencias estándar y encontré este hilo. Mi lista negra actual de caracteres que deben evitarse en los nombres de archivos y directorios 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" -> "@" };


Una "guía completa" de caracteres de nombres de archivo prohibidos no funcionará en Windows porque reserva los nombres de archivo y los 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 los 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 llamada A si ya existe una llamada a . Los nombres peores, aparentemente permitidos, como PRN y CON , y muchos otros, están reservados y no están permitidos. Windows también tiene varias restricciones de longitud; un nombre de archivo válido en una carpeta puede dejar de ser válido si se mueve a otra carpeta. Las reglas para nombrar archivos y carpetas están en MSDN.

En general, no puede utilizar texto generado por el usuario para crear nombres de directorio de Windows. Si desea permitir que los usuarios nombren lo que quieran, debe crear nombres seguros como A , AB , A2 y otros, almacenar los nombres generados por el usuario y sus equivalentes de ruta en un archivo de datos de la aplicación y realizar la asignación de ruta en su aplicación .

Si absolutamente debe permitir nombres de carpetas generados por el usuario, la única forma de saber si no son vá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 generar para nombres no válidos. Estás abriendo una enorme lata de dolor.