web-dev-qa-db-fra.com

Même dossier et nom de fichier au même endroit

Sous Ubuntu, pourquoi ne puis-je pas avoir un dossier nommé "MyFile" et un document nommé "MyFile" au même endroit? Je reçois une erreur item already used in this location. Ubuntu/Linux traite-t-il les dossiers et les fichiers comme les mêmes objets (pointeurs sur le disque)?

14
pebox11

Sous Linux, presque tout est un descripteur de fichier. Un répertoire est un type de fichier spécial qui, du point de vue de l'utilisateur, peut contenir d'autres fichiers.

Donc, vous ne pouvez pas avoir les deux avec le même nom, dans le même répertoire en même temps.

Si vous le pouviez, la vie deviendrait misérable pour les codeurs. Que voulez-vous que la commande "isDir" retourne quand quelqu'un veut créer un répertoire et vérifier qu'il existe? Est-ce que isDir ("/ home/shrodingers/cat") doit retourner true, false ou les deux? Et qu'attendriez-vous si quelqu'un veut ouvrir un répertoire d'un fichier dans un code?

Et que doit faire le système lorsque vous lui dites d'ouvrir quelque chose? Supposons que vous vouliez le fichier? Cela provoque des problèmes ;)

À propos: ceci est vrai pour TOUS les systèmes d'exploitation, pas seulement Linux. Cependant, d’un point de vue du bureau, un système d’exploitation pourrait ajouter un identifiant unique au fichier ou au répertoire et le supprimer de la liste. Du point de vue de la ligne de commande, cela poserait cependant problème.

Il y a une chose que nous avons sur Windows: nous utilisons des noms sensibles à la casse. Donc, "MYFILE" et "myfile" sont des choses différentes.

28
Rinzwind

Je sais que c'est un sujet ancien, mais je n'avais que le même problème et je voulais le partager.
Voici mon histoire (soyez patient, la fin est heureuse).

Environnement:
Gentoo 4.12.5 64bits sur reiserfs

Comment cela a-t-il pu arriver?
J'ai plusieurs machines avec un dossier partagé en utilisant syncthing. Par le passé, j'ai supprimé un fichier nommé ".stfolder" et créé un répertoire portant ce nom. Donc, peut-être que le bogue est dû à la synchronisation de cette opération sur une autre machine.

Maintenant examinons le bogue: (je suis ici en tant que root )

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

ressemble à un fichier fantôme mais le dossier répond normalement (avec find)

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

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

Je sais, très bizarre ...

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

Je ne peux pas supprimer ce fichier fantôme!

Mais au final, je l’ai supprimé avec succès en le déplaçant sur un point de montage tmpfs

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

Je dois dire que le bogue est toujours présent sur les tmpfs, donc pas de rapport avec 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

Comme vous pouvez le voir dans cette sortie bash, le fichier est présent et non présent en même temps. En raison de cette capacité du chat de Schrödinger , nous pouvons créer un dossier portant le même nom.
Mais attendez, il y a plus (et vous devriez trouver cela évident): nous pouvons aussi créer un autre fichier du même nom.

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"

Le fantôme peut être copié (pour que je puisse dupliquer le bogue), ou manipulé par chown, chmod, etc. La seule restriction est que vous ne pouvez pas le nommer, vous devez donc le mettre dans un répertoire vide et utiliser ". *" arguments pour ces commandes ... mais ça marche!

En raison de sa nature même, ce fichier était vide depuis le début (il s’agit simplement d’un indicateur de synchronisation).
Je me demandais donc si je pouvais mettre des données dans ce fichier.
Et ici, la solution m'est venue:

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

Oui, il y a un caractère invisible dans ce fichier, juste après le point.
Cela explique tout.
Merci mon Dieu, je n'ai pas utilisé "écho test >>. *" Et chat ...

1
Stopi

vous ne pouvez pas avoir deux entités portant le même nom au même endroit. que se passera-t-il quand vous voudrez chatter ou vider le fichier? Quelle entité l'OS choisira-t-il? En raison du risque de confusion, vous ne pourrez donc pas attribuer le même nom à un fichier et à un dossier situés au même endroit. et au fait, un dossier est un fichier qui héberge d’autres fichiers.

1
L. Barzic

https://unix.stackexchange.com/a/238056/139805

wow c'est vraiment bizarre mais j'ai juste fait ce que l'auteur avait demandé. Voici comment, alors c’est une vraie réponse: 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

cela a été fait par:

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 réponse alternative deux fichiers avec le même nom, même pas un répertoire et un fichier ce qui se passe ??? _

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 

comportement totalement étrange

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 #