Stessa cartella e nome file nella stessa posizione


15

In Ubuntu perché non posso avere una cartella denominata "MyFile" e un documento chiamato "MyFile" nella stessa posizione? Ho ricevuto un item already used in this locationerrore Ubuntu / Linux tratta le cartelle e i file come gli stessi oggetti (puntatori al disco)?


Si chiama esattamente così? Il file ha un punto iniziale nel nome del file? Per esempio .myfile?
Sergiy Kolodyazhnyy,

Ho avuto lo stesso problema. Ne ho rinominato uno. Esistono diverse opzioni: Rinomina la cartella in minuscolo o aggiungi un'estensione, ad esempio myfile o My.File. O rinominare il file in MyFile.txt. Rinominare uno dei due funzionerà altrettanto bene.
Buck,


Condivido la tua frustrazione. Sto costruendo un sito Web statico e non posso avere una versione locale che contenga una cartella chiamata blogcon post di blog e una pagina html chiamata blogcon un elenco di post di blog.
Costa

Risposte:


29

In Linux, quasi tutto è un descrittore di file. Una directory è un tipo speciale di file che dal punto di vista dell'utente può contenere altri file.

Quindi non puoi avere entrambi con lo stesso nome, nella stessa directory allo stesso tempo.

Se potessi, la vita diventerebbe miserabile per i programmatori. Cosa vorresti che il comando "isDir" restituisse quando qualcuno vuole creare una directory e verificarne l'esistenza. IsDir ("/ home / shrodingers / cat") dovrebbe restituire true, false o entrambi? E cosa ti aspetteresti se qualcuno volesse aprire una directory di un file in un codice?

E cosa dovrebbe fare il sistema quando gli dici di aprire qualcosa? Supponiamo di volere il file? Che incantesimi guai ;)

A proposito: questo vale per TUTTI i sistemi operativi, non solo Linux. Sebbene dal punto di vista del desktop un sistema operativo potrebbe aggiungere un identificatore univoco al file o alla directory e rimuoverlo dall'elenco. Da un punto di vista della riga di comando sarebbe comunque problematico.

C'è una cosa che abbiamo su Windows: usiamo nomi con distinzione tra maiuscole e minuscole. Quindi "MYFILE" e "myfile" sono cose diverse.


2
Nessun problema :) Lo faccio per i voti ;-)
Rinzwind

1
@Rinzwind per i voti? Ok, eccone un altro
AB

1
La teoria Linux di tutto: tutto è file!
Byte Commander

Anthon e io abbiamo collaborato al gatto di Schrödinger / entrambi scherziamo quattro mesi fa . E, come dice Byte Commander, l'espressione è "Tutto è un file", non "tutto è un descrittore di file".
G-Man dice "Ripristina Monica" il

1
Plan9 ( plan9.bell-labs.com/plan9 ) (creatori originali di Unix) è probabilmente l'unico sistema operativo in cui "tutto è un file". Per tutti gli altri sistemi Unix e Linux la frase corretta è "tutto è un descrittore di file". "Tutto è un file" tranne la memoria, le chiamate di sistema, i dispositivi di rete e praticamente tutto tranne i file MA hanno tutti un descrittore di file ;-) Nel caso qualcuno voglia continuare con questo -> chat: =)
Rinzwind

1

non puoi avere due entità con lo stesso nome nella stessa posizione. cosa succederà quando si desidera cat o vi il file? quale entità strega sceglierà il sistema operativo? quindi a causa della possibilità di confusione non sarà possibile avere lo stesso nome per un file e una cartella nella stessa posizione. e comunque una cartella è un file che ospita altri file.


3
La tua risposta gli restituisce in faccia la domanda del PO ("non puoi avere due entità con lo stesso nome nella stessa posizione", che lui / lei chiaramente conosce già - la domanda è "perché?"), E poi fai domande retoriche , come se fossero senza risposta e questo ha risolto la domanda. Se ho un file e una directory con lo stesso nome e io cato viquel nome, ovviamente, il sistema operativo dovrebbe scegliere il file. Perché non funziona?
G-Man dice "Ripristina Monica" il

2
@ G-Man: in realtà viche di solito si trova vimsu Ubuntu è perfettamente felice di aprire e mostrare una directory e persino modificarla. Provalo: vi .
arielf

1
@arielf: (1) Dicevo che, se fosse possibile che un file e una sottodirectory con lo stesso nome di esistere nella stessa directory, quindi quando un comando (in primo luogo) di file-oriented quali cato visi rivolge a quel nome , l' interpretazione logica è di invocarlo nel file anziché nella sottodirectory. Il fatto che un comando (principalmente) orientato ai file ( vi) funzioni anche su una (sotto) directory è irrilevante per tale affermazione.
G-Man dice "Ripristina Monica" il

1
(2) La tua dichiarazione è un'aringa rossa. vimnon tratta ingenuamente gli argomenti delle sottodirectory; con lo stesso codice con cui gestisce i file.  vimsembra essere (a un livello molto semplicistico) due programmi in uno: se viene invocato su un file, si comporta come un editor di testo e se viene invocato su una sottodirectory, si comporta come un file manager.
G-Man dice "Ripristina Monica" il

1
@ G-Man: mi riferivo alla tua ultima affermazione nel primo commento: "quindi, ovviamente, il sistema operativo dovrebbe scegliere il file". - questo è ciò che mi è saltato addosso perché non è vero vi. Saluti.
Ari

1

So che questo è un vecchio argomento, ma ho avuto lo stesso problema e volevo condividere.
Ecco la mia storia (abbi pazienza, c'è un lieto fine).

Ambiente:
kernel Gentoo 4.12.5 64 bit su reiserfs

Come è potuto succedere?
Ho diverse macchine con una cartella condivisa usando syncthing. Ad un certo punto in passato, ho rimosso un file denominato ".stfolder" e invece ho creato una directory con quel nome. Quindi forse il bug è dovuto alla sincronizzazione della sincronizzazione di questa operazione su un altro computer.

Ora esaminiamo il bug: (sto operando come root qui)

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

sembra che il file sia un fantasma, tuttavia la cartella risponde normalmente (con find)

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

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

Lo so, molto strano ...

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

Non riesco a rimuovere quel file fantasma!

Ma alla fine, l'ho rimosso con successo spostandolo su un punto di montaggio tmpfs

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

Devo dire che il bug è ancora presente su tmpfs, quindi non correlato a 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

Come puoi vedere in questo output bash, il file è presente e non presente allo stesso tempo. Grazie a questa abilità del gatto Schrödinger , possiamo creare una cartella con lo stesso nome.
Ma aspetta, c'è di più (e dovresti trovare questo ovvio): possiamo creare anche un altro file con lo stesso 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"

Il fantasma può essere copiato (quindi posso duplicare il bug), o manipolato da chown, chmod, ecc. L'unica limitazione è che non puoi nominarlo, quindi devi metterlo in una directory vuota e usare ". *" Come argomenti per quei comandi ... ma funziona!

Per la sua stessa natura, questo file era vuoto dall'inizio (è solo una bandiera per la sincronizzazione).
Quindi ero curioso di poter inserire alcuni dati in quel file.
E qui, la soluzione è arrivata a me:

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

Sì, c'è un carattere invisibile in quel file, subito dopo il punto.
Questo spiega tutto.
Grazie a Dio, non ho usato "echo test >>. *" E cat ...


U+200bè uno "spazio di larghezza zero" , tra l'altro. Mi piace questo aneddoto, anche se temo che potrebbe non essere considerato come una risposta.
PerlDuck,

0

/unix//a/238056/139805

wow, questo è davvero strano ma ho appena fatto quello che l'autore ha chiesto. Ecco come, quindi è una vera risposta: 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

questo è stato fatto da:

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 alternano la risposta a due file con lo stesso nome, nemmeno una directory e un file cosa sta succedendo ??? _

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 assolutamente strano

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
Uno dei due nomi ha una qualche forma di spazio alla fine. Puoi dire negli output "file".
dascandy
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.