Mesma pasta e nome de arquivo no mesmo local

15

No Ubuntu, por que não posso ter uma pasta chamada "MyFile" e um documento chamado "MyFile" no mesmo local? Eu recebo um item already used in this locationerro. O Ubuntu / Linux trata pastas e arquivos como os mesmos objetos (ponteiros para o disco)?

pebox11
fonte
É nomeado exatamente assim? O arquivo tem um ponto inicial no nome do arquivo? Por exemplo .myfile?
Sergiy Kolodyazhnyy
Eu tive o mesmo problema. Eu renomeei um. Existem várias opções: Renomeie a pasta para minúscula ou adicione uma extensão, por exemplo - myfile ou My.File. Ou renomeie o arquivo para MyFile.txt. Renomear qualquer um deles funcionará da mesma forma.
Buck
3
Duplicata de Por que não posso ter uma pasta e um arquivo com o mesmo nome?   (em Unix e Linux)
G-Man diz 'Reinstate Monica'
Eu compartilho sua frustração. Estou construindo um site estático e não posso ter uma versão local com uma pasta chamada blogcom postagens de blog e uma página html chamada blogcom uma lista de postagens de blog.
Costa

Respostas:

29

No Linux, quase tudo é um descritor de arquivos. Um diretório é um tipo especial de arquivo que, da perspectiva do usuário, pode conter outros arquivos.

Portanto, você não pode ter os dois com o mesmo nome, no mesmo diretório ao mesmo tempo.

Se você pudesse, a vida se tornaria miserável para os programadores. O que você deseja que o comando "isDir" retorne quando alguém quiser criar um diretório e verificar se ele existe. O isDir ("/ home / shrodingers / cat") deve retornar verdadeiro, falso ou ambos? E o que você esperaria se alguém quisesse abrir um diretório de um arquivo em algum código?

E o que o sistema deve fazer quando você pede para abrir alguma coisa? Suponha que você queira o arquivo? Isso significa problemas ;)

A propósito: isso é verdade para TODOS os sistemas operacionais, não apenas para Linux. Embora do ponto de vista da área de trabalho, um sistema operacional possa adicionar um identificador exclusivo ao arquivo ou diretório e removê-lo da lista. Do ponto de vista da linha de comando, isso seria problemático.

Há uma coisa que temos no Windows: usamos nomes com distinção entre maiúsculas e minúsculas. Então "MYFILE" e "myfile" são coisas diferentes.

Rinzwind
fonte
2
Não há problema :) Eu faço isso para os upvotes ;-)
Rinzwind
11
@Rinzwind pelos votos positivos? Ok, aqui está outro.
AB
11
A teoria do Linux para tudo: tudo é arquivo!
Byte Commander
Anthon e eu colaboramos no gato de Schrödinger / ambos, há quatro meses . E, como diz Byte Commander, a expressão é "Tudo é um arquivo", não "tudo é um descritor de arquivo".
G-Man diz 'Restabelecer Monica' em
11
O Plan9 ( plan9.bell-labs.com/plan9 ) (criadores originais do Unix) é provavelmente o único SO em que "tudo é um arquivo". Para todos os outros sistemas Unix e Linux, a frase correta é "tudo é um descritor de arquivo". "Tudo é um arquivo", exceto memória, chamadas de sistema, dispositivos de rede e praticamente tudo, exceto arquivos, mas todos têm um descritor de arquivo ;-) Caso alguém queira continuar com isso -> chat: =)
Rinzwind
1

você não pode ter duas entidades com o mesmo nome no mesmo local. o que acontecerá quando você quiser cat ou vi o arquivo? qual entidade o sistema operacional escolherá? portanto, devido à possibilidade de confusão, você não poderá ter o mesmo nome para um arquivo e pasta no mesmo local. e, a propósito, uma pasta é um arquivo que hospeda outros arquivos.

L. Barzic
fonte
3
Sua resposta lança a pergunta do OP de volta ao seu rosto ("você não pode ter duas entidades com o mesmo nome no mesmo local", que ele / ela claramente já conhece - a pergunta é "por quê?") E, em seguida, você faz perguntas retóricas , como se não pudessem responder, e isso resolveu a questão. Se eu tiver um arquivo e um diretório com o mesmo nome e eu catou viesse nome, obviamente, o sistema operacional deverá escolher o arquivo. Por que isso não funciona?
G-Man diz 'Restabelecer Monica' em
2
@ G-Man: na verdade, vique geralmente está vimno Ubuntu, está perfeitamente feliz em abrir e mostrar um diretório e até editá-lo. Experimente: vi .
arielf
11
@arielf: (1) Eu estava dizendo que, se fosse possível que um arquivo e um subdiretório com o mesmo nome existissem no mesmo diretório, então quando um comando (principalmente) orientado a arquivos como catou vié endereçado a esse nome , a interpretação lógica é invocá-la no arquivo e não no subdiretório. O fato de um comando ( vi) orientado a arquivos (principalmente) também funcionar em um diretório (sub) é irrelevante para essa declaração.
G-Man diz 'Reinstate Monica'
11
(2) Sua declaração é um arenque vermelho. vimnão está tratando argumentos de subdiretórios ingênuos; com o mesmo código com o qual ele lida com arquivos.  vimparece ser (em um nível muito simplista) dois programas em um: se for invocado em um arquivo, ele age como um editor de texto e, se for invocado em um subdiretório, atua como um gerenciador de arquivos.
G-Man diz 'Reinstate Monica'
11
@ G-Man: Eu estava me referindo apenas à sua última afirmação no 1º comentário: "então, obviamente, o sistema operacional deve escolher o arquivo". - foi por isso que me chamou a atenção vi. Felicidades.
Arielf 28/08/2015
1

Sei que esse é um tópico antigo, mas eu só tinha o mesmo problema e queria compartilhar.
Aqui está a minha história (seja paciente, há um final feliz).

Ambiente:
Gentoo kernel 4.12.5 64bits no reiserfs

Como isso pôde acontecer?
Eu tenho várias máquinas com uma pasta compartilhada usando syncthing. Em algum momento no passado, removi um arquivo chamado ".stfolder" e criei um diretório com esse nome. Talvez o bug seja devido à sincronização dessa operação em outra máquina.

Agora vamos examinar o bug: (Estou operando como root aqui)

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 o arquivo é um fantasma, no entanto, a pasta está respondendo normalmente (com localização)

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

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

Eu sei, muito estranho ...

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

Não consigo remover esse arquivo fantasma!

Mas no final, removi-o com sucesso movendo-o para um ponto de montagem tmpfs

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

Devo dizer que o bug ainda está presente no tmpfs, portanto não está relacionado ao 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 você pode ver nesta saída do bash, o arquivo está presente e não está presente ao mesmo tempo. Devido a essa habilidade de gato de Schrödinger , podemos criar uma pasta com o mesmo nome.
Mas espere, há mais (e você deve achar isso óbvio): podemos criar outro arquivo com o mesmo nome.

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"

O fantasma pode ser copiado (para que eu possa duplicar o bug) ou manipulado pelo chown, chmod, etc. a única restrição é que você não pode nomeá-lo, então você deve colocá-lo em um diretório vazio e usar ". *" Como argumentos para esses comandos ... mas funciona!

Devido à sua natureza, esse arquivo estava vazio desde o início (é apenas um sinalizador para sincronização).
Então, eu estava curioso para colocar alguns dados nesse arquivo.
E aqui, a solução veio para mim:

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

Sim, há um caractere invisível nesse arquivo, logo após o ponto.
Isso explica tudo.
Graças a Deus, eu não usei "teste de eco >>. *" E gato ...

Stopi
fonte
U+200bé um "espaço de largura zero" , a propósito. Gosto dessa história, embora tenha medo de que ela não conte totalmente como resposta.
PerlDuck 3/09/18
0

/unix//a/238056/139805

Uau, isso é realmente estranho, mas eu apenas fiz o que o autor pediu. É assim que, portanto, é uma resposta 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

isso foi feito 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 resposta alternativa dois arquivos com o mesmo nome, nem mesmo um diretório e um arquivo o que está acontecendo ??? _

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 

comportamento totalmente estranho

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
fonte
2
Um dos dois nomes tem alguma forma de espaço no final. Você pode dizer nas saídas "arquivo".
Dascandy