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)?
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.
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 ...
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.
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 #