Linux / Windows / Unix / ... nombres de archivo: ¿Qué caracteres están permitidos? ¿Cuáles son sin escapes?

43

¿Qué caracteres están permitidos y cuáles de ellos deben escaparse en la línea de comandos en diferentes sistemas operativos?

java.is.for.desktop
fuente
Hay algunas respuestas útiles a continuación, pero ¿qué estás tratando de lograr? Codificar sus propias rutinas de listas blancas de personajes probablemente no sea la mejor ruta.
medina
¡Gracias a todos! Todas las respuestas son útiles. Para lo que necesito la información es: estoy escribiendo una herramienta que etiquetaría los archivos en todo el sistema de archivos, alterando sus nombres (sin metadatos).
java.is.for.desktop
Ver también la respuesta en superusuario .
pevik

Respuestas:

27

Hay una discusión sobre los caracteres del nombre de archivo en el artículo de Wikipedia sobre nombres de archivos .

Puede encontrar este ensayo informativo: Arreglando nombres de archivo Unix / Linux / POSIX .

Este artículo compara OS X y Windows XP: X vs. XP: Caracteres prohibidos en los nombres de archivo (PDF, ver págs. 64-66 aprox.).

Cosas que no deberían estar en los nombres de archivo por $ 1,000 Alex

No sé qué caracteres deben estar sin escape, pero en Linux, probablemente no sea una buena idea escapar de los caracteres que pueden tener un significado especial como "n" (nueva línea), "t" (tabulación) y otros, pero eso generalmente no es un problema en las operaciones de archivos. Quizás te refieres a "escapado" en lugar de "no escapado". Los más comunes son los que el intérprete interpretará, como el espacio, ">", "<", etc. Vea algunos de los artículos que vinculé para una discusión de ellos.

Pausado hasta nuevo aviso.
fuente
77
Esto no es realmente una respuesta: toda la información es externa. Y algunos de esos enlaces están rotos ahora.
Steve Bennett
26

Los únicos caracteres no permitidos en un nombre de archivo en * nix son NULy /. En Windows, solamente NUL, :y \están verdaderamente no permitidos, pero muchas de las aplicaciones que restringen aún más, impidiendo también ?, *, +, y %.

En ningún momento es necesario escapar de los caracteres de un nombre de archivo, excepto cuando sea necesario para que el intérprete no los interprete.

Ignacio Vazquez-Abrams
fuente
El segundo punto merece énfasis. Por lo general, "escape" se refiere a un mecanismo de shell que permite al usuario especificar cadenas (por ejemplo, nombres de ruta) que contienen caracteres que, de lo contrario, el shell trataría de una manera especial. Si el OP significa usar algo como "codificación porcentual" para codificar caracteres no permitidos, entonces ese es un "protocolo de ruta de acceso" de nivel de aplicación que cada programa involucrado debe adoptar (o no).
Chris Johnsen
Estoy escaneando una carpeta con readdir y luego intento abrir los archivos con los nombres que devuelve. Algunos de ellos no se abren con ENOENT, lo que sugiere que incluso para el sistema operativo a veces tienes que escapar.
gman
13

Si crea un archivo en Windows con Explorer utilizando uno de los siguientes caracteres, se quejará de que los caracteres no están permitidos:

\ / : * ? " < > |

Una buena referencia está aquí:

Nombrar archivos, rutas y espacios de nombres
http://msdn.microsoft.com/en-us/library/aa365247%28VS.85%29.aspx

Microsoft afirma además:

"... en plataformas de escritorio basadas en Windows, los caracteres de ruta no válidos pueden incluir caracteres ASCII / Unicode del 1 al 31, así como comillas ("), menor que (<), mayor que (>), canalización (|), retroceso (\ b), nulo (\ 0) y pestaña (\ t) ".

http://msdn.microsoft.com/en-us/library/system.io.path.getinvalidpathchars.aspx

Greg Askew
fuente
Recuerdo haber leído hace un par de años que Windows en modo de usuario tiene esas restricciones, además de no ser sensible a mayúsculas y minúsculas ("ABC.txt" === "abc.txt"). Sin embargo, el modo kernel de Windows tiene menos restricciones y distingue entre mayúsculas y minúsculas ("ABC.txt"! == "abc.txt" al igual que * NIX). Sin embargo, para todos los efectos, los caracteres anteriores se aplicarán a la mayoría de los programas porque se ejecutan en modo de usuario.
CubicleSoft
Puedo escapar de \ / : * ? " < > |todos ellos y crearlos con mkdir en mi sistema GNU / Linux. Puede usar mkdir '?'para crear el ?directorio también. He usado el ramdisk y el sistema de archivos XFS para probar eso.
S.Goswami
5

En Linux y otros sistemas POSIX compatibles, "/" está reservado ya que es el separador de directorio y "\ 0" (el carácter NULO) designa el final de la cadena. Todo lo demás está permitido.

janneb
fuente
1
Aunque es muy recomendable evitar nuevas líneas, pestañas, caracteres de control y similares, y asegurarse de que el nombre de archivo sea UTF-8 válido.
Flimm