Misma carpeta y nombre de archivo en la misma ubicación


15

En Ubuntu, ¿por qué no puedo tener una carpeta llamada "MyFile" y un documento llamado "MyFile" en la misma ubicación? Me sale un item already used in this locationerror ¿Ubuntu / Linux trata las carpetas y los archivos como los mismos objetos (punteros al disco)?


¿Se llama exactamente así? ¿El archivo tiene un punto inicial en el nombre del archivo? Por ejemplo, .myfile?
Sergiy Kolodyazhnyy

Yo tuve el mismo problema. Cambié el nombre de uno. Hay varias opciones: cambie el nombre de la carpeta a minúsculas o agregue una extensión, por ejemplo, myfile o My.File. O cambie el nombre del archivo a MyFile.txt. Cambiar el nombre de cualquiera de los dos funcionará igual de bien.
Buck


Comparto tu frustración. Estoy construyendo un sitio web estático, y no puedo tener una versión local que tenga una carpeta llamada blogcon publicaciones de blog, y una página html llamada blogcon una lista de publicaciones de blog.
Costa

Respuestas:


29

En Linux, casi todo es un descriptor de archivo. Un directorio es un tipo especial de archivo que, desde la perspectiva del usuario, puede contener otros archivos.

Por lo tanto, no puede tener ambos con el mismo nombre, en el mismo directorio al mismo tiempo.

Si pudieras, la vida se volvería miserable para los codificadores. ¿Cuál sería el retorno del comando "isDir" cuando alguien quiere crear un directorio y verificar si existe? ¿Debería isDir ("/ home / shrodingers / cat") devolver verdadero, falso o ambos? ¿Y qué esperaría si alguien quiere abrir un directorio de un archivo en algún código?

¿Y qué debe hacer el sistema cuando le dices que abra algo? ¿Asume que quiere el archivo? Eso significa problemas ;)

Por cierto: esto es cierto para TODOS los sistemas operativos, no solo Linux. Aunque desde el punto de vista del escritorio, un sistema operativo podría agregar un identificador único al archivo o directorio y eliminarlo de la lista. Sin embargo, desde el punto de vista de la línea de comandos, sería problemático.

Hay una cosa que tenemos sobre Windows: utilizamos nombres que distinguen entre mayúsculas y minúsculas. Entonces "MYFILE" y "myfile" son cosas diferentes.


2
No hay problema :) Lo hago por los votos a favor ;-)
Rinzwind

1
@Rinzwind para los votos a favor? Ok, aquí hay otro
AB

1
La teoría de Linux de todo: ¡ Todo es archivo!
Byte Commander

Anthon y yo colaboramos en el gato de Schrödinger / ambos bromeamos hace cuatro meses . Y, como dice Byte Commander, la expresión es "Todo es un archivo", no "todo es un descriptor de archivo".
G-Man dice 'Reincorporar a Mónica'

1
Plan9 ( plan9.bell-labs.com/plan9 ) (creadores originales de Unix) es probablemente el único sistema operativo donde "todo es un archivo". Para todos los demás sistemas Unix y Linux, la frase correcta es "todo es un descriptor de archivo". "Todo es un archivo" excepto la memoria, las llamadas al sistema, los dispositivos de red y casi todo excepto los archivos PERO todos tienen un descriptor de archivo ;-) En caso de que alguien quiera continuar con esto -> chat: =)
Rinzwind

1

no puede tener dos entidades con el mismo nombre en la misma ubicación. ¿Qué sucederá cuando quieras capturar o vi el archivo? ¿Qué entidad elegirá el sistema operativo? así que debido a la posibilidad de confusión, no podrá tener el mismo nombre para un archivo y carpeta en la misma ubicación. y, por cierto, una carpeta es un archivo que aloja otros archivos.


3
Su respuesta arroja la pregunta del OP a su cara ("no puede tener dos entidades con el mismo nombre en la misma ubicación", que él / ella claramente ya sabe: la pregunta es "¿por qué?"), Y luego hace preguntas retóricas , como si fueran incontestables, y eso resolvió la cuestión. Si tengo un archivo y un directorio con el mismo nombre, y yo cato viese nombre, entonces, obviamente, el sistema operativo debería elegir el archivo. ¿Por qué no puede funcionar eso?
G-Man dice 'reinstalar a Mónica' el

2
@ G-Man: en realidad, lo vique generalmente está vimen Ubuntu, está perfectamente feliz de abrir y mostrar un directorio e incluso editarlo. Pruébalo: vi .
arielf

1
@arielf: (1) Estaba diciendo que, si fuera posible que existiera un archivo y un subdirectorio con el mismo nombre en el mismo directorio, entonces cuando un comando (principalmente) orientado a archivos como cato viestá dirigido a ese nombre , la interpretación lógica es invocarlo en el archivo en lugar de en el subdirectorio. El hecho de que un comando (principalmente) orientado a archivos ( vi) también funcione en un (sub) directorio es irrelevante para esa declaración.
G-Man dice 'Reincorporar a Monica' el

1
(2) Su declaración es un arenque rojo. vimno trata ingenuamente los argumentos de subdirectorios; con el mismo código con el que maneja los archivos.  vimparece ser (a un nivel muy simplista) dos programas en uno: si se invoca en un archivo, actúa como un editor de texto, y si se invoca en un subdirectorio, actúa como un administrador de archivos.
G-Man dice 'Reincorporar a Monica' el

1
@ G-Man: Solo me refería a su última afirmación en el primer comentario: "entonces, obviamente, el sistema operativo debería elegir el archivo". - eso fue lo que me llamó la atención porque no era cierto vi. Salud.
arielf

1

Sé que este es un tema antiguo, pero tuve el mismo problema y quería compartirlo.
Aquí está mi historia (sea paciente, hay un final feliz).

Entorno:
Gentoo kernel 4.12.5 64bits en reiserfs

¿Cómo pudo pasar esto?
Tengo varias máquinas con una carpeta compartida usando sincronización. En algún momento en el pasado, eliminé un archivo llamado ".stfolder" y creé un directorio con ese nombre. Entonces, tal vez el error se deba a la sincronización sincronizando esta operación en otra máquina.

Ahora examinemos el error: (estoy operando como root aquí)

ls -lahd .*
drwxrwx--- 5 stopi syncthing 656  3 sept. 18:24 .
drwxr-xr-x 5 stopi stopi     240  3 sept. 18:21 ..
drw-rw---- 2 stopi syncthing  48  3 sept. 18:24 .stfolder
-rw-rw---- 1 stopi syncthing   0 29 août  12:51 .stfolder
-rw-rw---- 1 stopi syncthing  23 28 oct.   2017 .stignore

find -type f -name .stfolder
                              (<= no output there)

find -type f -name ".*"
./.stignore
./.stfolder

find -type f -name ".s*"
./.stignore

parece que el archivo es un fantasma, sin embargo, la carpeta responde normalmente (con find)

file .*
.:             directory
..:            directory
.stfolder:     directory
.stfolder:     empty
.stignore:     C source, ASCII text

file .s*
.stfolder:     directory
.stignore:     C source, ASCII text

Lo sé, muy raro ...

rm -r .stfolder

ls -lahd .*
drwxrwx--- 5 stopi syncthing 656  3 sept. 18:24 .
drwxr-xr-x 5 stopi stopi     240  3 sept. 18:21 ..
-rw-rw---- 1 stopi syncthing   0 29 août  12:51 .stfolder
-rw-rw---- 1 stopi syncthing  23 28 oct.   2017 .stignore

rm .stfolder
rm: impossible de supprimer '.stfolder': Aucun fichier ou dossier de ce type

¡No puedo eliminar ese archivo fantasma!

Pero al final, lo eliminé con éxito moviéndolo en un punto de montaje tmpfs

mv .stfolder /elsewhere/
mv: impossible d'évaluer '.stfolder': Aucun fichier ou dossier de ce type
mv .* /elsewhere/

Debo decir que el error todavía está presente en tmpfs, por lo que no está relacionado con reiserfs:

cd /elsewhere

ls -lahd .*
-rw-rw----  1 stopi syncthing   0 29 août  12:51 .stfolder

ls -lahd .s*
ls: impossible d'accéder à '.s*': Aucun fichier ou dossier de ce type

Como puede ver en esta salida de bash, el archivo está presente y no presente al mismo tiempo. Debido a esta habilidad del gato Schrödinger , podemos crear una carpeta con el mismo nombre.
Pero espera, hay más (y deberías encontrar esto obvio): también podemos crear otro archivo con el mismo nombre.

touch .stfolder

ls -lahdQ
total 0
drwxrwxr-x  3 root   users  100  3 sept. 19:13 "."
drwxrwxrwt 18 root   root   440  3 sept. 17:35 ".."
-rw-r--r--  1 root   root     0  3 sept. 19:13 ".stfolder"
-rw-r-----  1 root   root     0  3 sept. 19:09 ".stfolder"

El fantasma puede ser copiado (para que pueda duplicar el error), o manipulado por chown, chmod, etc. La única restricción es que no puedes nombrarlo, así que debes ponerlo en un directorio vacío y usar ". *" Como argumentos para esos comandos ... pero funciona!

Debido a la naturaleza misma de este, este archivo estaba vacío desde el principio (es solo una bandera para la sincronización).
Así que tenía curiosidad si podía poner algunos datos en ese archivo.
Y aquí, la solución vino a mí:

vi .*
" ============================================================================
" Netrw Directory Listing                                        (netrw v162)
"   /elsewhere
"   Sorted by      name
"   Sort sequence: [\/]$,\<core\%(\.\d\+\)\=\>,\.h$,\.c$,\.cpp$,\~\=\*$,*,\.o$,\.obj$,\.info$,\.swp$,\.bak$,\~$
"   Quick Help: <F1>:help  -:go up dir  D:delete  R:rename  s:sort-by  x:special
" ==============================================================================
../
./
.<200b>stfolder

Sí, hay un carácter invisible en ese archivo, justo después del punto.
Esto explica todo.
Gracias a Dios, no usé "echo test >>. *" Y cat ...


U+200bes un "espacio de ancho cero" , por cierto. Me gusta esta anécdota, aunque me temo que podría no contar completamente como una respuesta.
PerlDuck

0

/unix//a/238056/139805

wow, esto es realmente extraño, pero acabo de hacer lo que me pidió el autor. Así es como, entonces es una respuesta real: P

charles@charles-MacBook ~ $ cd /usr/share
charles@charles-MacBook /usr/share $ ls -ld pix*
drwxr-xr-x 13 root root  4096 Oct 22 21:04 pixmaps
-rw-r--r--  1 root root 17626 Oct 22 21:07 pixmaps 
charles@charles-MacBook /usr/share $ mv pixmaps pixmaps
mv: cannot move ‘pixmaps’ to a subdirectory of itself, ‘pixmaps/pixmaps’
charles@charles-MacBook /usr/share $ ls -ld pix*
drwxr-xr-x 13 root root  4096 Oct 22 21:04 pixmaps
-rw-r--r--  1 root root 17626 Oct 22 21:07 pixmaps 
charles@charles-MacBook /usr/share $ file pix*
pixmaps:  directory
pixmaps : X pixmap image, ASCII text

esto fue hecho por:

charles-MacBook MaSSH # ls
instMaSSH.sh  MaSSHandra  MaSSHandra.desktop  MaSSHandraMesh.xpm
MaSSHandra.xpm  mime-MaSSHandra.xml
charles-MacBook MaSSH # cat instMaSSH.sh 
cp -i MaSSHandra.desktop /usr/share/applications
cp -i MaSSHandra.xpm /usr/share/pixmaps 
cp -i MaSSHandraMesh.xpm /usr/share/pixmaps
xdg-icon-resource install --context mimetypes --size 48 /usr/share/pixmaps/MaSSHandra.xpm application-x-MaSSHandra
xdg-icon-resource install --context mimetypes --size 48 /usr/share/pixmaps/MaSSHandraMesh.xpm application-x-MaSSHandraMesh
setcap cap_net_raw+ep /opt/MaSSHandra/bin/MaSSHandra
charles-MacBook MaSSH # ./instMaSSH.sh 
cp: overwrite ‘/usr/share/applications/MaSSHandra.desktop’? y
xdg-icon-resource: file '/usr/share/pixmaps/MaSSHandra.xpm' does not exist
xdg-icon-resource: file '/usr/share/pixmaps/MaSSHandraMesh.xpm' does not exist

whoah respuesta alternativa dos archivos con el mismo nombre, ni siquiera un directorio y un archivo más ¿qué está pasando ??? _

charles-MacBook share # ls -ld pi*
drwxr-xr-x 13 root root  4096 Oct 22 21:08 pixmaps
-rw-r--r--  1 root root 17626 Oct 22 21:09 pixmaps 
charles-MacBook share # mv pixmaps /tmp
charles-MacBook share # mv pixmaps  /tmp/pixmaps/
charles-MacBook share # ls -ld pix*
-rw-r--r-- 1 root root 21535 Oct 22 21:26 pixmaps
-rw-r--r-- 1 root root 17626 Oct 22 21:26 pixmaps 
charles-MacBook share # ls -li pix*
1849351 -rw-r--r-- 1 root root 21535 Oct 22 21:26 pixmaps
1841386 -rw-r--r-- 1 root root 17626 Oct 22 21:26 pixmaps 
charles-MacBook share # file pix*
pixmaps:  X pixmap image, ASCII text
pixmaps : X pixmap image, ASCII text
charles-MacBook share # ls -liF pix*
1849351 -rw-r--r-- 1 root root 21535 Oct 22 21:26 pixmaps
1841386 -rw-r--r-- 1 root root 17626 Oct 22 21:26 pixmaps 

comportamiento totalmente extraño

charles-MacBook MaSSH # ls -l /usr/share/pixmaps
pixmaps   pixmaps   
charles-MacBook MaSSH # rm -i /usr/share/pixmaps                                                                 
rm: remove regular file ‘/usr/share/pixmaps’? y
charles-MacBook MaSSH # ls -l /usr/share/pixmaps  
-rw-r--r-- 1 root root 17626 Oct 22 21:26 /usr/share/pixmaps 
charles-MacBook MaSSH # rm -i /usr/share/pixmaps
rm: cannot remove ‘/usr/share/pixmaps’: No such file or directory
charles-MacBook MaSSH # ls -l /usr/share/pixmaps  
-rw-r--r-- 1 root root 17626 Oct 22 21:26 /usr/share/pixmaps 
charles-MacBook MaSSH # cd /usr/share
charles-MacBook share # rm pixmaps  
charles-MacBook share # 

2
Uno de los dos nombres tiene alguna forma de espacio al final. Se puede ver en las salidas de "archivo".
dascandy
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.