Sé que esto no es algo que deba hacerse nunca, pero ¿hay alguna manera de usar el carácter de barra que normalmente separa los directorios dentro de un nombre de archivo en Linux?
La respuesta es que no puede, a menos que su sistema de archivos tenga un error. Este es el por qué:
Hay una llamada al sistema para cambiar el nombre de su archivo definido en fs/namei.c
llamado renameat
:
SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
int, newdfd, const char __user *, newname)
Cuando se invoca la llamada al sistema, realiza una búsqueda de ruta ( do_path_lookup
) en el nombre. Siga rastreando esto, y llegamos a lo link_path_walk
que tiene esto:
static int link_path_walk(const char *name, struct nameidata *nd)
{
struct path next;
int err;
unsigned int lookup_flags = nd->flags;
while (*name=='/')
name++;
if (!*name)
return 0;
...
Este código se aplica a cualquier sistema de archivos. ¿Que significa esto? Significa que si intenta pasar un parámetro con un '/'
carácter real como nombre del archivo usando medios tradicionales, no hará lo que desea. No hay forma de escapar del personaje. Si un sistema de archivos "admite" esto, es porque:
Por otra parte, si lo hizo entrar y editar los bytes añadir un carácter de barra en un nombre de archivo, las cosas malas que pasaría. Eso es porque nunca podrías referirte a este archivo por su nombre :( ya que siempre que lo hicieras, Linux supondría que te refieres a un directorio inexistente. Usar la técnica 'rm *' tampoco funcionaría, ya que bash simplemente expande eso al nombre del archivo. Incluso rm -rf
no funcionaría, ya que un simple strace revela cómo van las cosas bajo el capó (abreviado):
$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0) = 0
unlinkat(3, "out", 0) = 0
fcntl(3, F_GETFD) = 0x1 (flags FD_CLOEXEC)
close(3) = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...
Tenga en cuenta que estas llamadas a unlinkat
fallarían porque necesitan hacer referencia a los archivos por su nombre.
e2fsck
considera cualquier nombre de archivo como un nombre de archivo ilegal que debe corregirse; consulte la fuente . Entonces, si de alguna manera termina con un nombre de archivo que tiene barras, puede usarlo fsck
para solucionar el problema.
e2fsck
: p
Puede usar un carácter Unicode que se muestre como "/" (por ejemplo, este glifo aparentemente redundante ) asumiendo que su sistema de archivos lo admite.
SOLIDUS
, está prohibido. Hay muchos otros candidatos adecuados: ⁄ es U + 2044 FRACTION SLASH
; ∕ es U + 2215 DIVISION SLASH
; ⧸ es U + 29F8 BIG SOLIDUS
; / Es U + FF0F FULLWIDTH SOLIDUS
y ╱ es U + 2571 es BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT
. ¡Todo funcionaría admirablemente!
---
. su elección del delimitador puede usar un carácter diferente y variar el número de repeticiones.
Depende del sistema de archivos que esté utilizando. De algunos de los más populares:
grep -r "'/'" *
en la fuente del kernel)
Solo con una codificación acordada. Por ejemplo, podría aceptar que %
se codificará como %%
y eso %2F
significará un /
. Todo el software que accedió a este archivo debería comprender la codificación.
La respuesta corta es: No, no puedes. Es una prohibición necesaria debido a cómo se define la estructura del directorio.
Y, como se mencionó, puede mostrar un carácter Unicode que "parece" una barra, pero eso es todo lo que puede llegar a tener.
En general, es una mala idea intentar utilizar caracteres "malos" en un nombre de archivo; incluso si lo administra de alguna manera, tiende a dificultar el uso del archivo más adelante. El separador del sistema de archivos es plano y no va a funcionar en absoluto, por lo que tendrá que elegir un método alternativo.
¿Ha considerado codificar la URL y luego usarla como nombre de archivo? El resultado debería estar bien como nombre de archivo y es fácil reconstruir el nombre a partir de la versión codificada.
Otra opción es crear un índice: cree el nombre del archivo de salida utilizando el método que desee: nombres numerados secuencialmente, hashes SHA1, lo que sea, luego escriba un archivo con el par de nombre de archivo / URL generado. Puede guardar eso en un hash y usarlo para hacer una búsqueda de URL a nombre de archivo o viceversa con la versión inversa del hash, y puede escribirlo y volver a cargarlo más tarde si es necesario.
*
y luego preguntó: "¿Cómo elimino un archivo?" Respondí,rm
seguido del nombre del archivo. Bueno, ya sabes el resto.ls
para enumerar los archivos que desea eliminar y luego cambiar ells
comando arm
después.