Se dice que en Unix y Linux en general, debe evitar tener espacios en un nombre de archivo de un archivo (archivo ordinario, directorio, enlace, archivo de dispositivo, ...).
Pero hago eso todo el tiempo. Para un nombre de archivo con un espacio adentro,
- En Nautilus, el carácter de espacio se muestra como un espacio.
- En la terminal Bash, utilizo
\
para representar un espacio o encerrar el nombre del archivo dentro de un par de comillas dobles. - en los archivos de algunas aplicaciones (Nautilus, no estoy seguro si el sistema operativo también lo hará), el nombre del archivo se escribe con el espacio reemplazado por
%20
.
¿Realmente no se permite un espacio en un nombre de archivo?
¿Cómo utiliza o maneja un espacio en un nombre de archivo correctamente?
-rf ~
(usotouch -- "-rf ~"
), pero no lo recomendaría./
separador). El uso de los 254 bytes restantes abre la puerta a todas las formas de "nombres" indescriptibles. Obviamente esto es una locura, pero no todos están de acuerdo en lo que es "cuerdo", y diferentes personajes romperán diferentes herramientas. La intersección de la cordura de todos es bastante pequeña .Respuestas:
Los espacios, y de hecho todos los caracteres excepto
/
NUL, están permitidos en los nombres de archivo. La recomendación de no usar espacios en los nombres de archivo proviene del peligro de que puedan ser malinterpretados por un software que los admite de manera deficiente. Podría decirse que dicho software tiene errores. Pero también podría decirse que los lenguajes de programación como el scripting de shell hacen que sea muy fácil escribir software que se rompa cuando se presentan con nombres de archivo con espacios en ellos, y estos errores tienden a pasar porque los scripts de shell no suelen ser probados por sus desarrolladores usando nombres de archivos con espacios en ellos.Los espacios reemplazados por
%20
no se ven a menudo en los nombres de archivo. Eso se usa principalmente para URL (web). Aunque es cierto que la codificación% de las URL a veces se abre paso en los nombres de archivo, a menudo por accidente.fuente
bash
. Intenté algunas cosas como citarlo con Ctrl-V y algo así,$(echo -e \\0)
pero no funcionó. El hecho es que la razón por la que NUL no se puede usar en los nombres de archivo es que no se puede usar en cadenas C (porque es el terminador de cadena) y todas las API subyacentes, así como prácticamente todas las cadenas manejadas por los programas C usan ese formato . Comobash
está escrito en C, es posible que simplemente no tenga ningún soporte para las cadenas con NUL en ellas. Podría estar equivocado, podría haber alguna forma oscura ...NUL
y golpear, lo necesitas$'\0'
. Por ejemplo:find . -print0 | while read -d $'\0' f; do echo "$f"; done
Los espacios están permitidos en los nombres de archivo, como ha observado.
Si observa la entrada "la mayoría de los sistemas de archivos UNIX" en este cuadro en Wikipedia , notará:
Se permite cualquier conjunto de caracteres de 8 bits. También podemos incluir ASCII de 7 bits bajo este paraguas, ya que es un subconjunto de varios conjuntos de 8 bits y siempre se implementa utilizando bytes de 8 bits.
Los únicos caracteres prohibidos son
/
y "nulo". "Nulo" se refiere a un byte cero, pero de todos modos no están permitidos en los datos de texto.Sin embargo , si utiliza el shell, puede darse cuenta de que hay algunos caracteres que crearán una molestia
*
, lo que es más significativo , que es un operador de POSIX globbing.Dependiendo de cómo desee definir "molestia", puede incluir espacios en blanco (espacios, pestañas, líneas nuevas, etc.), ya que esto crea la necesidad de citar con
""
. Pero esto es inevitable, ya que los espacios están permitidos, así que ...En un contexto de línea de comando / shell, ajuste el nombre del archivo entre comillas simples o dobles (pero tenga en cuenta que no son los mismos problemas de WRT), o escape de los espacios con
\
, por ejemplo:fuente
touch $(echo -e "foo\00bar")
--e
procesos\0N
como un valor octal, pero todavía se pone en algún lugar perdido, como que sólo crea un archivo llamadofoobar
. Por supuesto, NULL no es imprimible, pero garantizo que desapareció debido a la restricción de la cadena C.foo[NULL]bar
terminaría comofoo
para la mayoría de los intentos y propósitos. El hecho de que eso no suceda con esoecho -e
muestra que el NULL ha sido eliminado en alguna parte./
que es el separador de directorio y no se puede citar, por lo que puede estar en un nombre de ruta pero no en un nombre de archivo).La razón es en gran medida histórica: en el camino hacia atrás en la niebla de los espacios de tiempo no se permitían los nombres de archivo, por lo que los espacios se usaban como separadores de palabras clave / nombre de archivo. Los futuros intérpretes de shell tenían que ser inversamente compatibles con los scripts antiguos y, por lo tanto, estamos atrapados con el dolor de cabeza que tenemos hoy.
Los desarrolladores de procesos que no necesitan tratar mucho con los humanos pueden hacer las cosas mucho, mucho más fáciles al dejar espacios por completo. Apple hace esto, el contenido de / System / Library / CoreServices / contiene muy pocos espacios, los programas con espacios se abren en nombre del usuario yWouldLookStrangeIfCamelCased. Las rutas similares de solo Unix también evitan espacios.
(anécdota algo relacionada: a mediados de los 90, un dron de Windows dijo "Nombre una cosa que puede hacer en una Mac que no puedo hacer en Windows" -> "Use 12 caracteres en un nombre de archivo". -> Silencio. Los espacios fueron también posible en esos 12 caracteres)
fuente
Entonces, sí, como se dice muchas veces en otra parte, un nombre de archivo puede contener casi cualquier carácter. Pero hay que decir que un nombre de archivo no es un archivo. Tiene cierto peso como atributo de archivo, ya que normalmente necesita un nombre de archivo para abrir un archivo, pero el nombre de un archivo solo apunta al archivo real. Es un enlace, almacenado en el directorio que lo ha grabado, junto con el número de inodo , que es una aproximación mucho más cercana a un archivo real .
Entonces, ya sabes, llámalo como quieras. Al núcleo no le importa: todas las referencias de archivos que manejará tratarán con números de inodo reales de todos modos. El nombre de archivo es algo para consumo humano ; si quieres que sea una locura, bueno, es tu sistema de archivos. Aquí, haré algunas cosas locas:
Primero crearé 20 archivos y los nombraré con nada más que espacios, cada nombre de archivo contiene un espacio más que el anterior:
Esto es un poco gracioso. Mira mi
ls
:Ahora voy a reflejar este directorio:
Aquí están
../mirror/
los contenidos:Ok, pero tal vez estás preguntando, pero ¿de qué sirve eso? ¿Cómo puedes saber cuál es cuál? ¿Cómo puede estar seguro de haber vinculado el número de inodo correcto al nombre de archivo correcto?
Bien...
SALIDA
Vea, tanto el número de inodo contenido
../mirror/"${tgt%% .*}"
como el referenciado se./' '
refieren al mismo archivo. Describen el mismo archivo. Lo nombran, pero nada más. No hay ningún misterio, en realidad, solo algunos inconvenientes que podrías hacerte, pero que finalmente tendrán poco o ningún efecto en el funcionamiento de tu sistema de archivos Unix al final.fuente