Qué caracteres son seguros en los nombres de archivos multiplataforma para Linux, Windows y OS-X

60

Actualmente, uso un YYMMDD-NAME+PAGEnombre para la mayoría de mis archivos. NAMEtiene espacios convertidos en guiones bajos.

Me gustaría usar el YYYY-MM-DDformato de fecha, pero no estoy seguro de cómo separarlo del nombre. A -parecería extraño si el nombre comenzara con un número. Si uso a _, entonces entra en conflicto con el guión bajo que representa un espacio.

¿Qué caracteres son razonablemente seguros en los nombres de archivo que funcionarían aquí? Estoy en Linux, pero podría compartir archivos con otras personas (Windows 7, Mac OS X).

Martin Ueding
fuente
... en Unix, Windows, un Amiga 1000?
slhck
Principalmente Linux moderno.
Martin Ueding
- el símbolo es seguro para usar en Windows 7 ... puede haber otro sistema operativo moderno que haga lo mismo ... puede usar el símbolo menos para separar ...
Niranjan Singh
posible duplicado de sitios cruzados de: stackoverflow.com/questions/4814040/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Respuestas:

48

Resumen:

  • Windows: cualquier cosa excepto los caracteres de control ASCII y \/:*?"<>|
  • Linux, OS-X: cualquier cosa excepto nulo o /

En todas las plataformas, es mejor evitar los caracteres no imprimibles, como los caracteres de control ASCII.

Ventanas

En Windows, el Explorador de Windows no permite caracteres de control o \/:*?"<>|puede usar espacios. Si usa espacios, a menudo tendrá que citar el nombre del archivo cuando lo use desde la línea de comandos (pero las aplicaciones GUI no se ven afectadas hasta donde yo sé). El sistema de archivos de Windows como NTFS aparentemente almacena la codificación con el nombre del archivo, pero UTF-16 es estándar.

Algunas partes de Windows distinguen entre mayúsculas y minúsculas, otras partes no distinguen entre mayúsculas y minúsculas. Es fácil crear nombres de archivo distintos como "Ab" y "ab" en un sistema de archivos NTFS de Windows. Estos nombres se refieren a archivos separados que contienen contenido separado distinto. Sin embargo, aunque el símbolo del sistema de Windows listará felizmente ambos archivos usando dir, no puede acceder fácilmente o manipular uno de ellos usando comandos como type. Vea abajo.

Linux, OS-X

/Creo que en Linux y OS-X solo está prohibido el conjunto ASCII imprimible. Algunos caracteres (como los metacaracteres de shell *?!) causarán problemas en las líneas de comando y requerirán que el nombre de archivo se cite o se escape correctamente.

Los sistemas de archivos de Linux como ext2, ext3 son independientes del conjunto de caracteres (creo que simplemente lo tratan más o menos como una secuencia de bytes, solo nulos y /están prohibidos). Esto significa que puede almacenar nombres de archivo en codificación UTF-8. Creo que depende del shell u otra aplicación saber qué codificación usar para convertir correctamente el nombre de archivo para su visualización o procesamiento.

Conclusión

Entonces, probablemente podría usar algo como (si no fuera tan difícil de escribir)


Case- (in) sensibilidad en Windows

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

Tenga en cuenta que no podemos escribir el contenido del segundo archivo, el typecomando de Windows solo devuelve el contenido de Ab. El tercer archivo también sería distinto de aB en Linux.

(Windows 10 NTFS).

RedGrittyBrick
fuente
1
En general, es una buena respuesta, pero me abstendría de usar nombres de archivo en espacios. Escaparlos adecuadamente en todos los contextos es más problemático de lo que vale. Observe que Microsoft dejó de usar espacio en los nombres de directorio del sistema. Si necesita indicar límites de palabras en los nombres, CamelCase funciona bien.
Isaac Rabinovitch
44
"C: \ Archivos de programa (x86)" todavía existe en Win8: ¿no es un directorio del sistema? Estoy de acuerdo en que los espacios pueden causar problemas.
RedGrittyBrick
Lo es, pero se puede renombrar a casi cualquier cosa. Por supuesto, muchos programas se asustarán si cambia el nombre a "]: \ foobar", pero Windows se refiere a él como "% programfiles (x86)%" de todos modos.
Marca Thomas el
2
Algo a tener en cuenta aquí, el sistema Linux puede considerar mayúsculas y minúsculas como distintas, mientras que Windows las considera iguales.
thecoshman
1
Te sorprendería cuántos programas son malos al analizar. Es por eso que no había Windows 9.
Isaac Rabinovitch
46

Si bien la respuesta de RedGrittyBrick es técnicamente correcta, la seguridad no es el único problema: la usabilidad también es importante. Creo que una mejor pregunta es "qué caracteres son buenos para usar en un nombre de archivo".

Algunas pautas potenciales:

  • [0-9a-zA-Z_] : los caracteres alfanuméricos y el guión bajo siempre están bien para usar.
  • \/:*?"<>|y el byte nulo son problemáticos en al menos un sistema, y siempre deben evitarse.
  • Los espacios se usan como separadores de argumentos en muchos sistemas, por lo que se deben evitar los nombres de archivo con espacios cuando sea posible. Otros espacios en blanco (por ejemplo, pestañas) aún más.
  • Los puntos y comas (;) se usan para separar comandos en muchos sistemas. Los puntos y comas (,) se usan para separar los argumentos de la línea de comandos en (algunas versiones de?) La línea de comandos de Windows.
  • []()^ #%&!@:+={}'~y [`] todos tienen significados especiales en muchos proyectiles, y son molestos para evitarlos, por lo que deben evitarse. También tienden a verse horribles en las URL .
  • Personajes principales a evitar:
    • Muchos programas de línea de comando usan el guión [-] para indicar argumentos especiales.
    • * los sistemas basados ​​en nix usan un punto [.] como personaje principal para archivos y directorios ocultos.
  • Cualquier cosa que no esté en el conjunto ASCII puede causar problemas en sistemas más antiguos o más básicos (por ejemplo, algunos sistemas integrados), y debe usarse con cuidado.

Eso básicamente te deja con:

[0-9a-zA-Z -._]

que siempre son seguros y no molestos de usar (siempre que comience el nombre de archivo con un alfanumérico) :)

nada101
fuente
1
Las llaves ( []) son parte de expresiones regulares y también tienen un significado especial en el shell. Pero no son tan malos para trabajar, excepto algunos casos de esquina malvados.
Martin Ueding
1
Hrm ... supongo que se podría decir lo mismo (), en realidad.
naught101
44
En zsh, los caracteres que se pueden interpretar de manera diferente incluyen []()^;, por lo que creo que la respuesta correcta podría ser [0-9a-zA-Z.,_-]Coma, también podría excluirse solo porque es extraño ver en un nombre de archivo, aunque no puedo pensar en un caso real en el que podría causar problemas.
Casey Rodarmor
sí, los
eliminé
1
la coma puede ser molesta, intente echo whereami > a,b,cen la ventana del símbolo del sistema de Win10.
RedGrittyBrick
4

Tú podrías:

  1. reemplace los guiones bajos actuales con #(símbolo del corrector de pruebas para el espacio)
  2. subrayar la fecha de 'sección' del nombre de archivo (o un segundo guión, más fácil de escribir)

Alt-1. las mayúsculas iniciales pueden reemplazar espacios: YYMMDD-HHMM-FileName.extoYYMMDD-HHMM_FileName.ext

Caracteres mínimos para una visualización clara, que se ordena automáticamente con ceros rellenos para enero-septiembre (y del 1 al 9 de cada mes).

tb01
fuente