web-dev-qa-db-ja.com

同じ場所にある同じフォルダーとファイル名

Ubuntuで同じ場所に「MyFile」という名前のフォルダーと「MyFile」という名前のドキュメントを配置できないのはなぜですか? item already used in this locationエラーが表示されます。 Ubuntu/Linuxはフォルダーとファイルを同じオブジェクト(ディスクへのポインター)として扱いますか?

14
pebox11

Linuxでは、ほとんどすべてがファイル記述子です。ディレクトリは、ユーザーの観点から他のファイルを保持できる特殊なタイプのファイルです。

そのため、同じディレクトリに同時に同じ名前で両方を持つことはできません。

可能であれば、コーダーにとって人生は悲惨なものになるでしょう。誰かがディレクトリを作成して存在することを確認したい場合、コマンド「isDir」は何を返しますか。 isDir( "/ home/shrodingers/cat")はtrue、false、または両方を返す必要がありますか?そして、誰かが何らかのコードでファイルのディレクトリを開きたい場合はどうなりますか?

そして、何かを開くように指示したとき、システムは何をすべきでしょうか?ファイルが必要だと仮定しますか?それはトラブルを綴る;)

ところで、これはLinuxだけでなく、すべてのオペレーティングシステムに当てはまります。デスクトップの観点からは、オペレーティングシステムはファイルまたはディレクトリに一意の識別子を追加し、リストから削除することができます。ただし、コマンドラインの観点からは問題があります。

Windowsには、大文字と小文字を区別する名前を使用することがあります。したがって、「MYFILE」と「myfile」は異なるものです。

28
Rinzwind

私はこれが古いトピックであることを知っていますが、同じ問題を抱えていたので、共有したいと思いました。
これが私の話です(辛抱強く、ハッピーエンドがあります)。

環境:
reiserfs上のGentooカーネル4.12.5 64ビット

これがどのように発生したのか?
syncthingを使用して共有されたフォルダーを持つ複数のマシンがあります。過去のある時点で、「。stfolder」という名前のファイルを削除し、代わりにその名前でディレクトリを作成しました。そのため、おそらくバグは、この操作を別のマシンで同期するsyncthingによるものです。

バグを調べてみましょう:(ここで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

ファイルはゴーストのように見えますが、フォルダは正常に応答しています(検索あり)

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

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

私は知っている、非常に奇妙な...

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

そのゴーストファイルは削除できません。

しかし、最終的には、tmpfsマウントポイントに移動することで正常に削除しました。

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

バグはtmpfsにまだ存在しているため、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

このbashの出力でわかるように、ファイルは同時に存在しますが、存在しません。このSchrödingercat機能により、同じ名前のフォルダーを作成できます。
しかし、待ってください、まだあります(これは明らかです)。同じ名前の別のファイルを作成することもできます。

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"

ゴーストはコピーできるので(バグを複製できます)、chown、chmodなどで操作できます。唯一の制限は名前を付けられないため、空のディレクトリに入れて "。*"を使用する必要があることです。それらのコマンドの引数...しかしそれは動作します!

その性質上、このファイルは最初から空でした(これは単なる同期のフラグです)。
そのため、そのファイルにデータを入れることができるかどうか興味がありました。
そして、ここで、解決策が私に来ました:

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

はい、そのファイルのドットの直後に目に見えない文字があります。
これはすべてを説明しています。
ありがとう、「エコーテスト>>。*」と猫を使用しなかった...

1
Stopi

同じ場所に同じ名前の2つのエンティティを含めることはできません。ファイルをcatまたはviにしたい場合はどうなりますか? OSが選択するのは魔女エンティティですか?混乱の可能性があるため、同じ場所にあるファイルとフォルダに同じ名前を付けることはできません。ちなみに、フォルダは他のファイルをホストするファイルです。

1
L. Barzic

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

wowこれは本当に奇妙なことですが、著者が尋ねたことをやっただけです。これが方法なので、本当の答えです: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

これは以下によって行われました:

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は、ディレクトリとファイルでさえなく、同じ名前の2つのファイルを交互に応答します、何が起こっているのか??? _

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 

全く奇妙な行動

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 #