Cùng tên thư mục và tệp trong cùng một vị trí


15

Trong Ubuntu tại sao tôi không thể có thư mục có tên "MyFile" và tài liệu có tên "MyFile" tại cùng một vị trí? Tôi nhận được một item already used in this locationlỗi. Ubuntu / Linux có xử lý các thư mục và tệp như cùng một đối tượng (con trỏ vào đĩa) không?


Nó được đặt tên chính xác như vậy? Tập tin có một dấu chấm hàng đầu trong tên tệp? Ví dụ , .myfile?
Sergiy Kolodyazhnyy

Tôi đã từng gặp vấn đề tương tự. Tôi đổi tên một cái. Có một số tùy chọn: Đổi tên thư mục thành chữ thường hoặc thêm phần mở rộng, ví dụ - myfile hoặc My.File. Hoặc đổi tên tệp thành MyFile.txt. Đổi tên một trong hai sẽ làm việc như là tốt.
Buck


Tôi chia sẻ sự thất vọng của bạn. Tôi đang xây dựng một trang web tĩnh và tôi không thể có một phiên bản cục bộ có một thư mục được gọi blogvới các bài đăng blog trong đó và một trang html được gọi blogvới một danh sách các bài đăng blog.
Costa

Câu trả lời:


29

Trong Linux, hầu hết mọi thứ là một mô tả tệp. Thư mục là một loại tệp đặc biệt mà theo quan điểm của người dùng có thể chứa các tệp khác.

Vì vậy, bạn không thể có cả hai cùng tên, trong cùng một thư mục.

Nếu bạn có thể, cuộc sống sẽ trở nên khốn khổ cho các lập trình viên. Bạn sẽ có lệnh "isDir" nào khi ai đó muốn tạo một thư mục và kiểm tra xem nó có tồn tại không. IsDir ("/ home / shrodingers / cat") nên trả về true, false hay cả hai? Và bạn sẽ mong đợi điều gì nếu ai đó muốn mở một tập tin trong một số mã?

Và hệ thống nên làm gì khi bạn bảo nó mở một cái gì đó? Giả sử bạn muốn tập tin? Điều đó đánh vần rắc rối ;)

Nhân tiện: điều này đúng với TẤT CẢ các hệ điều hành, không chỉ Linux. Mặc dù theo quan điểm của Desktop, một hệ điều hành có thể thêm một định danh duy nhất vào tệp hoặc thư mục và xóa nó khỏi danh sách. Từ quan điểm dòng lệnh, nó sẽ có vấn đề mặc dù.

Có một điều chúng tôi có trên Windows: chúng tôi sử dụng các tên phân biệt chữ hoa chữ thường. Vì vậy, "MYFILE" và "myfile" là những thứ khác nhau.


2
Không có vấn đề gì :) Tôi làm điều đó cho các
upvote

1
@Rinzwind cho upvotes? Ok, đây là một cái khác
AB

1
Lý thuyết Linux về mọi thứ: Mọi thứ đều là tệp!
Chỉ huy Byte

Anthon và tôi đã hợp tác với con mèo Schrödinger / cả hai đùa nhau bốn tháng trước . Và, như Byte Commander nói, biểu thức là "Mọi thứ đều là tệp", không phải "mọi thứ đều là mô tả tệp".
G-Man nói 'Phục hồi Monica'

1
Plan9 ( plan9.bell-labs.com/plan9 ) (người tạo ban đầu của Unix) có lẽ là HĐH duy nhất trong đó "mọi thứ là một tệp". Đối với tất cả các hệ thống Unix và Linux khác, cụm từ chính xác là "mọi thứ đều là mô tả tệp". "Mọi thứ là một tệp" ngoại trừ bộ nhớ, các cuộc gọi hệ thống, thiết bị mạng và hầu hết mọi thứ trừ các tệp NHƯNG tất cả chúng đều có một mô tả tệp ;-) Trong trường hợp ai đó muốn tiếp tục với điều này -> trò chuyện: =)
Rinzwind

1

bạn không thể có hai thực thể có cùng tên ở cùng một vị trí. Điều gì sẽ xảy ra khi bạn muốn cat hoặc vi tập tin? Thực thể phù thủy sẽ chọn hệ điều hành? do đó, vì khả năng nhầm lẫn, bạn sẽ không thể có cùng tên cho một tệp và thư mục trong cùng một vị trí. và nhân tiện, một thư mục là một tập tin lưu trữ các tập tin khác.


3
Câu trả lời của bạn ném lại câu hỏi của OP vào mặt anh ấy ("bạn không thể có hai thực thể có cùng tên ở cùng một vị trí", mà anh ấy / cô ấy đã biết rõ - câu hỏi là "tại sao?"), Và sau đó bạn hỏi những câu hỏi tu từ , như thể họ không thể trả lời được, và điều đó đã giải quyết câu hỏi. Nếu tôi có một tệp và một thư mục có cùng tên và tôi cathoặc vitên đó, thì rõ ràng, HĐH nên chọn tệp đó. Tại sao không thể làm việc?
G-Man nói 'Phục hồi Monica'

2
@ G-Man: thực sự vithường có vimtrên Ubuntu là hoàn hảo khi mở và hiển thị một thư mục và thậm chí chỉnh sửa nó. Hãy thử: vi .
thân

1
@arielf: (1) Tôi đã nói rằng, nếu nó đã có thể cho một tập tin và thư mục con có cùng tên để tồn tại trong cùng một thư mục, sau đó khi một lệnh (chủ yếu) tập tin theo định hướng như cathay viđược đề cập đến cái tên đó , giải thích logic là để gọi nó trên tệp chứ không phải trên thư mục con. Thực tế là một lệnh (chủ yếu) hướng tệp ( vi) cũng hoạt động trên thư mục (phụ) không liên quan đến câu lệnh đó.
G-Man nói 'Phục hồi Monica'

1
(2) Tuyên bố của bạn là cá trích đỏ. vimkhông đối xử với các đối số thư mục con ngây thơ; với cùng một mã mà nó xử lý các tập tin.  vimdường như (ở mức độ rất đơn giản) hai chương trình trong một: nếu nó được gọi trên một tệp, nó hoạt động như một trình soạn thảo văn bản và nếu nó được gọi trên thư mục con, nó hoạt động như một trình quản lý tệp.
G-Man nói 'Phục hồi Monica'

1
@ G-Man: Tôi chỉ đề cập đến khẳng định cuối cùng của bạn trong bình luận đầu tiên: "sau đó, rõ ràng, hệ điều hành nên chọn tệp." - đó là những gì nhảy vào tôi là không đúng sự thật vi. Chúc mừng.
thân

1

Tôi biết đây là một chủ đề cũ, nhưng tôi chỉ có cùng một vấn đề và tôi muốn chia sẻ.
Đây là câu chuyện của tôi (hãy kiên nhẫn, có một kết thúc có hậu).

Môi trường:
Gentoo kernel 4.12,5 64 bit trên reiserfs

Làm thế nào điều này có thể xảy ra?
Tôi đã có một số máy với một thư mục được chia sẻ bằng cách sử dụng đồng bộ hóa. Tại một số thời điểm trong quá khứ, tôi đã xóa một tệp có tên ".stfolder" và thay vào đó, tạo một thư mục có tên đó. Vì vậy, có thể lỗi là do đồng bộ hóa đồng bộ hóa hoạt động này trên một máy khác.

Bây giờ chúng ta hãy kiểm tra lỗi: (Tôi đang hoạt động như root ở đây)

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

Có vẻ như tệp là một con ma tuy nhiên thư mục đang trả lời bình thường (có tìm)

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

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

Tôi biết, rất kỳ lạ ...

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

Tôi không thể xóa tập tin ma đó!

Nhưng cuối cùng, tôi đã loại bỏ nó thành công bằng cách di chuyển nó trên điểm gắn kết tmpfs

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

Tôi phải nói rằng lỗi vẫn còn trên tmpfs, vì vậy không liên quan đến 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

Như bạn có thể thấy trong đầu ra bash này, tệp có mặt và không hiện diện cùng một lúc. Vì khả năng mèo Schrödinger này , chúng tôi có thể tạo một thư mục có cùng tên.
Nhưng chờ đã, còn nhiều điều nữa (và bạn sẽ thấy điều này rõ ràng): chúng ta cũng có thể tạo một tệp khác có cùng tên.

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"

Con ma có thể được sao chép (vì vậy tôi có thể sao chép lỗi) hoặc thao tác bằng chown, chmod, v.v. Hạn chế duy nhất là bạn không thể đặt tên cho nó để bạn phải đặt nó vào một thư mục trống và sử dụng ". *" đối số cho các lệnh đó ... nhưng nó hoạt động!

Do bản chất của nó, tập tin này trống rỗng khi bắt đầu (nó chỉ là một lá cờ cho đồng bộ hóa).
Vì vậy, tôi đã tò mò nếu tôi có thể đặt một số dữ liệu trong tập tin đó.
Và đây, giải pháp đã đến với tôi:

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

Vâng, có một nhân vật vô hình trong tập tin đó, ngay sau dấu chấm.
Cái này giải thích tất cả.
Cảm ơn chúa, tôi đã không sử dụng "echo test >>. *" Và mèo ...


U+200bNhân tiện, đây là một không gian có chiều rộng bằng 0 . Tôi thích giai thoại này, mặc dù tôi sợ nó có thể không hoàn toàn được coi là một câu trả lời.
PerlDuck

0

/unix//a/238056/139805

wow điều này thực sự kỳ lạ nhưng tôi chỉ làm những gì tác giả yêu cầu. Đây là cách, vì vậy nó là một câu trả lời thực sự: 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

điều này đã được thực hiện bởi:

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 thay thế trả lời hai tệp có cùng tên, thậm chí không phải là thư mục và tệp nữa, chuyện gì đang xảy ra ??? _

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 

hành vi hoàn toàn lạ

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 # 

2
Một trong hai tên có một số không gian ở cuối. Bạn có thể nói trong đầu ra "tập tin".
dascandy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.