Gleicher Ordner und Dateiname am selben Ort

15

Warum kann ich in Ubuntu keinen Ordner mit dem Namen "MyFile" und ein Dokument mit dem Namen "MyFile" am selben Ort haben? Ich bekomme eine item already used in this locationFehlermeldung. Behandelt Ubuntu / Linux Ordner und Dateien als gleiche Objekte (Zeiger auf die Festplatte)?

pebox11
quelle
Heißt es genau so? Hat die Datei einen führenden Punkt im Dateinamen? Zum Beispiel .myfile?
Sergiy Kolodyazhnyy
Ich hatte das gleiche problem Ich habe einen umbenannt. Es gibt verschiedene Möglichkeiten: Benennen Sie den Ordner in Kleinbuchstaben um oder fügen Sie eine Erweiterung hinzu, z. B. myfile oder My.File. Oder benennen Sie die Datei in MyFile.txt um. Das Umbenennen von beiden wird genauso gut funktionieren.
Buck,
3
Duplikat von Warum kann ich keinen Ordner und keine Datei mit demselben Namen haben?   (unter Unix und Linux)
G-Man sagt, dass Monica
Ich teile deine Frustration. Ich erstelle eine statische Website und kann keine lokale Version mit einem Ordner blogmit Blogposts und einer HTML-Seite blogmit einer Liste von Blogposts erstellen.
Costa

Antworten:

29

Unter Linux ist fast alles ein Dateideskriptor. Ein Verzeichnis ist ein spezieller Dateityp, der aus Benutzersicht andere Dateien enthalten kann.

Sie können also nicht beide mit demselben Namen gleichzeitig im selben Verzeichnis haben.

Wenn Sie könnten, würde das Leben für Programmierer miserabel werden. Was soll der Befehl "isDir" zurückgeben, wenn jemand ein Verzeichnis erstellen und prüfen möchte, ob es existiert? Sollte isDir ("/ home / shrodingers / cat") true, false oder beides zurückgeben? Und was würden Sie erwarten, wenn jemand ein Verzeichnis einer Datei in einem Code öffnen möchte?

Und was soll das System tun, wenn Sie es auffordern, etwas zu öffnen? Angenommen, Sie möchten die Datei? Das bedeutet Ärger ;)

Übrigens: Dies gilt für ALLE Betriebssysteme, nicht nur für Linux. Aus der Sicht des Desktops könnte ein Betriebssystem der Datei oder dem Verzeichnis eine eindeutige Kennung hinzufügen und sie aus der Liste entfernen. Aus Sicht der Kommandozeile wäre dies jedoch problematisch.

Wir haben eines gegenüber Windows: Wir verwenden Namen, bei denen die Groß- und Kleinschreibung beachtet wird. "MYFILE" und "myfile" sind also verschiedene Dinge.

Rinzwind
quelle
2
Kein Problem :) Ich mache es für die Upvotes ;-)
Rinzwind
1
@Rinzwind für die Upvotes? Ok, hier ist noch einer
AB
1
Die Linux-Theorie von allem: Alles ist Datei!
Byte Commander
Anthon und ich haben vor vier Monaten an Schrödingers Katze / beiden Witzen zusammengearbeitet . Und wie Byte Commander sagt, lautet der Ausdruck "Alles ist eine Datei", nicht "Alles ist ein Dateideskriptor".
G-Man sagt, dass Monica
1
Plan9 ( plan9.bell-labs.com/plan9 ) (ursprünglicher Entwickler von Unix) ist wahrscheinlich das einzige Betriebssystem, auf dem "alles eine Datei ist". Für alle anderen Unix- und Linux-Systeme lautet der korrekte Ausdruck "Alles ist ein Dateideskriptor". "Alles ist eine Datei" mit Ausnahme von Speicher, Systemaufrufen, Netzwerkgeräten und so ziemlich allem außer Dateien, ABER alle haben einen Dateideskriptor ;-) Falls jemand damit weitermachen möchte -> chat: =)
Rinzwind
1

Sie können nicht zwei Entitäten mit demselben Namen am selben Ort haben. Was passiert, wenn Sie die Datei katzen oder vi wollen? Welche Entität wird das Betriebssystem wählen? Aus Gründen der Verwechslungsgefahr können Sie für eine Datei und einen Ordner nicht denselben Namen am selben Speicherort verwenden. Übrigens ist ein Ordner eine Datei, die andere Dateien hostet.

L. Barzic
quelle
3
Ihre Antwort wirft die Frage des OP zurück in sein Gesicht ("Sie können nicht zwei Entitäten mit demselben Namen am selben Ort haben", was er / sie eindeutig bereits weiß - die Frage lautet "Warum?") Und dann stellen Sie rhetorische Fragen , als wären sie unbeantwortbar, und das löste die Frage. Wenn ich eine Datei und ein Verzeichnis mit demselben Namen habe und ich catoder vidieser Name, sollte das Betriebssystem natürlich die Datei auswählen. Warum kann das nicht funktionieren?
G-Man sagt, dass Monica
2
@ G-Man: eigentlich ist vidas, was normalerweise vimunter Ubuntu läuft, vollkommen glücklich, ein Verzeichnis zu öffnen und anzuzeigen und es sogar zu bearbeiten. Versuchen Sie es: vi .
Arielf
1
@arielf: (1) Ich sagte , dass, wenn sie waren für eine Datei und ein Unterverzeichnis mit dem gleichen Namen möglich in demselben Verzeichnis zu existieren, dann , wenn ein ( in erster Linie) dateiorientierten Befehl wie catoder vian diesen Namen angesprochen wird Die logische Interpretation besteht darin, es in der Datei und nicht im Unterverzeichnis aufzurufen. Die Tatsache, dass ein (primär) dateiorientierter Befehl ( vi) auch in einem (Unter-) Verzeichnis funktioniert, ist für diese Anweisung irrelevant.
G-Man sagt, dass Monica
1
(2) Ihre Aussage ist ein roter Hering. vimbehandelt Argumente in Unterverzeichnissen nicht naiv; mit dem gleichen Code, mit dem es Dateien behandelt.  vimEs scheint (auf einer sehr vereinfachten Ebene) zwei Programme in einem zu sein: Wenn es für eine Datei aufgerufen wird, verhält es sich wie ein Texteditor, und wenn es für ein Unterverzeichnis aufgerufen wird, verhält es sich wie ein Dateimanager.
G-Man sagt, dass Monica
1
@ G-Man: Ich bezog mich nur auf Ihre letzte Behauptung im 1. Kommentar: "Dann sollte natürlich das Betriebssystem die Datei auswählen." - das war es, was mich als nicht wahr ansprach vi. Prost.
Arielf
1

Ich weiß, dass dies ein altes Thema ist, aber ich hatte gerade das gleiche Problem und wollte es teilen.
Hier ist meine Geschichte (sei geduldig, es gibt ein Happy End).

Umgebung:
Gentoo Kernel 4.12.5 64bit auf reiserfs

Wie konnte das passieren?
Ich habe mehrere Computer mit einem Ordner, der mithilfe der Synchronisierung freigegeben wurde. Irgendwann in der Vergangenheit habe ich eine Datei mit dem Namen ".stfolder" entfernt und stattdessen ein Verzeichnis mit diesem Namen erstellt. Vielleicht liegt der Fehler an der Synchronisierung dieses Vorgangs auf einem anderen Computer.

Lassen Sie uns nun den Fehler untersuchen: (Ich arbeite hier als 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

sieht aus wie eine Geisterdatei, der Ordner antwortet jedoch normal (mit find)

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

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

Ich weiß, sehr seltsam ...

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

Ich kann diese Geisterdatei nicht entfernen!

Aber am Ende habe ich es erfolgreich entfernt, indem ich es auf einen tmpfs-Mount-Punkt verschoben habe

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

Ich muss sagen, dass der Bug immer noch auf tmpfs vorhanden ist, also nicht mit reiserfs zu tun hat:

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

Wie Sie in dieser Bash-Ausgabe sehen können, ist die Datei gleichzeitig vorhanden und nicht vorhanden. Aufgrund dieser Schrödinger-Katzenfähigkeit können wir einen Ordner mit demselben Namen erstellen.
Aber warten Sie, es gibt noch mehr (und Sie sollten dies offensichtlich finden): Wir können auch eine andere Datei mit dem gleichen Namen erstellen.

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"

Der Ghost kann kopiert (damit ich den Bug duplizieren kann) oder durch chown, chmod usw. manipuliert werden. Die einzige Einschränkung besteht darin, dass Sie ihn nicht benennen können, also müssen Sie ihn in ein leeres Verzeichnis legen und ". *" Als verwenden Argumente für diese Befehle ... aber es funktioniert!

Diese Datei war von Anfang an leer (es ist nur ein Flag für die Synchronisierung).
Ich war also neugierig, ob ich einige Daten in diese Datei einfügen könnte.
Und hier kam die Lösung zu mir:

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

Ja, in dieser Datei befindet sich direkt nach dem Punkt ein unsichtbares Zeichen.
Das erklärt alles.
Gott sei Dank habe ich keinen "Echotest >>. *" Und keine Katze benutzt ...

Stopi
quelle
U+200bist übrigens ein "Null-Breiten-Raum" . Ich mag diese Anekdote, obwohl ich befürchte, dass sie nicht vollständig als Antwort gilt.
PerlDuck
0

/unix//a/238056/139805

Wow, das ist wirklich komisch, aber ich habe einfach getan, was der Autor gefragt hat. Das ist wie, also ist es eine echte Antwort: 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

dies wurde gemacht von:

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 antworte abwechselnd zwei dateien mit gleichem namen, nicht mal ein verzeichnis und eine datei mehr was ist los ??? _

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 

total seltsames Verhalten

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 # 
Charles Adrian Posinoff
quelle
2
Einer der beiden Namen hat am Ende ein Leerzeichen. Sie können in der "Datei" Ausgaben sagen.
Dascandy