Та же папка и имя файла в том же месте


15

В Ubuntu почему я не могу иметь папку с именем «MyFile» и документ с именем «MyFile» в одном месте? Я получаю item already used in this locationошибку. Ubuntu / Linux рассматривает папки и файлы как одни и те же объекты (указатели на диск)?


Это так точно называется? Есть ли в файле начальная точка в имени файла? Например .myfile,?
Сергей Колодяжный

У меня такая же проблема. Я переименовал один. Существует несколько вариантов: переименовать папку в нижний регистр или добавить расширение, например, myfile или My.File. Или переименуйте файл в MyFile.txt. Переименование любого из них будет работать так же хорошо.
Бак


Я разделяю ваше разочарование. Я создаю статический веб-сайт, и у меня не может быть локальной версии, в которой есть папка blogс сообщениями в блоге и html-страница blogсо списком сообщений в блоге.
Коста

Ответы:


29

В Linux почти все является файловым дескриптором. Каталог - это специальный тип файла, который с точки зрения пользователя может содержать другие файлы.

Таким образом, вы не можете иметь оба с одним и тем же именем в одном и том же каталоге одновременно.

Если бы ты мог, жизнь стала бы несчастной для программистов. Что бы у вас команда «isDir» возвращала, когда кто-то хочет создать каталог и проверить, существует ли он. Должен ли isDir ("/ home / shrodingers / cat") возвращать true, false или оба? И что вы ожидаете, если кто-то захочет открыть файл в каком-то коде?

И что должна делать система, когда вы говорите, чтобы она открыла что-то? Предположим, вы хотите файл? Это говорит о беде ;)

Кстати: это верно для ВСЕХ операционных систем, а не только для Linux. Хотя с точки зрения рабочего стола операционная система может добавить уникальный идентификатор в файл или каталог и удалить его из списка. С точки зрения командной строки это было бы проблематично.

В Windows есть одна вещь: мы используем имена с учетом регистра. Так что «MYFILE» и «myfile» - это разные вещи.


2
Нет проблем :) Я делаю это для голосов ;-)
Rinzwind

1
@ Rinzwind для голосов? Хорошо, вот еще один
AB

1
Теория Linux всего: все файл!
Byte Commander

Мы с Энтоном работали над шутом-шредингером четыре месяца назад . И, как говорит Byte Commander, выражение «Все - это файл», а не «все - дескриптор файла».
G-Man говорит: «Восстановите Монику»

1
Plan9 ( plan9.bell-labs.com/plan9 ) (оригинальные создатели Unix), вероятно, единственная ОС, в которой «все является файлом». Для всех других систем Unix и Linux правильная фраза «все является дескриптором файла». «Все является файлом», кроме памяти, системных вызовов, сетевых устройств и почти всего, кроме файлов, НО все они имеют дескриптор файла ;-) На случай, если кто-то захочет продолжить -> chat: =)
Rinzwind

1

Вы не можете иметь два объекта с одинаковым именем в одном месте. что произойдет, когда вы захотите кошку или vi файл? какую сущность выберет ОС? поэтому из-за возможности путаницы вы не сможете иметь одинаковое имя для файла и папки в одном месте. и, кстати, папка - это файл, содержащий другие файлы.


3
Ваш ответ отбрасывает вопрос ОП обратно ему в лицо («у вас не может быть двух сущностей с одинаковым именем в одном месте», о которых он / она уже точно знает - вопрос «почему?»), И затем вы задаете риторические вопросы , как будто они были безответственны, и это решило вопрос. Если у меня есть файл и каталог с тем же именем, и я с тем catили viиным именем, то, очевидно, ОС должна выбрать файл. Почему это не может работать?
G-Man говорит: «Восстановите Монику»

2
@ G-Man: на самом деле, viкоторый обычно находится vimв Ubuntu, очень рад открыть и показать каталог и даже отредактировать его. Попробуйте: vi .
Ариэльф

1
@arielf: (1) Я говорил , что, если бы это было возможно для файла и подкаталог с тем же именем существует в том же каталоге, а затем , когда команда ( в первую очередь) файл-ориентированные , например , как catи viадресуется к этому имени , то логическая интерпретация вызвать его на файл , а не на поддиректории. Тот факт, что (в основном) файлово-ориентированная команда ( vi) также работает с (под) каталогом, не имеет отношения к этому утверждению.
G-Man говорит: «Восстановите Монику»

1
(2) Ваше заявление - красная сельдь. vimне рассматривает аргументы подкаталогов наивно; с тем же кодом, с которым он обрабатывает файлы.  vimкажется (на очень упрощенном уровне) две программы в одной: если она вызывается для файла, она действует как текстовый редактор, а если она вызывается в подкаталоге, она действует как файловый менеджер.
G-Man говорит: «Восстановите Монику»

1
@ G-Man: Я имел в виду только ваше последнее утверждение в 1-м комментарии: «тогда, очевидно, ОС должна выбрать файл». - это было то, что прыгнуло на меня, как не соответствует действительности vi. Приветствия.
Ариэльф

1

Я знаю, что это старая тема, но у меня была та же проблема, и я хотел поделиться.
Вот моя история (наберитесь терпения, есть счастливый конец).

Окружающая обстановка:
ядро Gentoo 4.12.5 64bit на reiserfs

Как это могло случиться?
У меня есть несколько машин с общей папкой с использованием синхронизации. Когда-то в прошлом я удалял файл с именем .stfolder и вместо этого создал каталог с таким именем. Поэтому, возможно, ошибка связана с синхронизацией синхронизации этой операции на другом компьютере.

Теперь давайте рассмотрим ошибку: (я работаю как 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

похоже, что файл является призраком, однако папка отвечает нормально (с помощью команды find)

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, файл присутствует и не присутствует одновременно. Благодаря этой способности кошки Шредингера мы можем создать папку с таким же именем.
Но подождите, это еще не все (и вы должны найти это очевидным): мы можем создать еще один файл с таким же именем.

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

Да, в этом файле есть невидимый символ, сразу после точки.
Это все объясняет.
Слава богу, я не использовал "Эхо-тест >>. *" И кот ...


U+200bявляется «нулевой шириной пространства» , кстати. Мне нравится этот анекдот, хотя я боюсь, что он не может полностью считаться ответом.
PerlDuck

0

/unix//a/238056/139805

вау, это действительно странно, но я просто сделал то, что спросил автор. Вот как, так это реальный ответ: 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 чередуют два файла с одинаковыми именами, даже не каталог и не файл, что происходит ??? _

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 # 

2
У одного из двух имен есть некоторая форма пробела в конце. Вы можете сказать в «файл» выводов.
dascandy
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.