~$ ls * >> teso.n
~$ ln teso.n teso.h
~$ ls -i teso.*
410105 teso.h 410105 teso.n
~$ ls * >> teso.h
~$ ls -i teso.*
410105 teso.h 410105 teso.n
~$ vi teso.h (:wq)
~$ ls -i teso.*
410225 teso.h 410105 teso.n
Miksi linkki katosi kun editoisin sitä editorilla? Millä/miten voin muokata niin ettei linkki katoa?
~$ ln teso.n teso.h
~$ ls -i teso.*
410105 teso.h 410105 teso.n
~$ ls * >> teso.h
~$ ls -i teso.*
410105 teso.h 410105 teso.n
~$ vi teso.h (:wq)
~$ ls -i teso.*
410225 teso.h 410105 teso.n
Miksi linkki katosi kun editoisin sitä editorilla? Millä/miten voin muokata niin ettei linkki katoa?
Vastaukset 10
Vanhimmat
kokeileppas ln -s vipua
~$ ln -s teso.n teso.s
410205 teso.s 410105 teso.n
Käy samanlai kuin edelisessä tapauksessa (linkki katoaa).
Haluan siis kaksi tiedostoa jotka osoittaa samaan node:en (Data ei saisi kadota jos tuhoan teso.n tiedoston mutta en siitä tehtyjä linkkejä). Pitäisi myös saada editoitua jompaa kumpaa tiedostoa niin että kummatkin muuttuvat (Kuten kävi tuossa ls * >> teso.h lauseessa, mutta kun editoin sitä vi editorilla niin ne alkoivatkin osoitamaan eriin node:en eli linkki katosi).
Linkki on linkki (osoitin?) alkuperäiseen tiedostoon. Ei linkin poistaminen edes oletuksena poista alkuperäistä tiedostoa eikä alkuperäisen tiedoston poistaminen poista linkkiä.
Parametrisi -i:
-i, --interactive
prompt whether to remove destinations
man ln
Ehkä selkeä esimerkki on useissa jakeluissa /etc/grub/menu.lst, joka on linkki tiedostoon /boot/grub/grub.conf
Toinen esimerkki voisi olla vmlinuz, joka osoittaa kulloinkin viimeiseksi asennettuun kernel-versioon (hieman jakelusta hieman riippuen).
Siis tarkoitan miksi linkki katosi/katkesi/katosi kun editoisin sitä vi editorilla mutta ei silloin kun "editoin" sitä (>>) operaattorilla (vai miksi tota merkkiä sanotaan).
~$ ls * >> teso.n
~$ ln teso.n teso.h
~$ ls -i teso.*
410105 teso.h 410105 teso.n
~$ ls * >> teso.h (Muutan >> operattorilla sisältöä)
~$ ls -i teso.*
410105 teso.h 410105 teso.n (Linkki on viellä voimassa)
~$ vi teso.h (:wq) (Muutan vi:n kanssa sisältöä)
~$ ls -i teso.*
410225 teso.h 410105 teso.n (Linki on katkennut/kadonnut/poistunut)
Siis mitä mun pitää muuttaa ettei toi linkki katoa/katkea/poistu kun editoin sitä vi:llä vai katoaako se aina?
(Ähh. Mikä on hyvä sivu missä kerrotan linkin käytöstä by finska kun ei tää englanti ole vahvin alani)
Pelkkä ln komento tekee niinsanotun hard linkin eli linkki ja tiedosto jota linkataan ovat eroittamattomia ne jakavat saman inoden. Siinä syy ongelmaasi. Hard linkkejä ei tulisi käyttää!!!
ln -s vipu tekee soft linkin joka on oma tiedostotyyppinsä eli osoitin toiseen tiedostoon. Kun poistat soft linkin poistuu vain tämä linkki kun poistat hard linkin häviää myös tiedosto johon linkkasit.
Siis ÄLÄ käytä hard linkkejä!!
info coreutils ln kertoo
A "hard link" is another name for an existing file; the link and the
original are indistinguishable. Technically speaking, they share the
same inode, and the inode contains all the information about a
file--indeed, it is not incorrect to say that the inode _is_ the file.
On all existing implementations, you cannot make a hard link to a
directory, and hard links cannot cross filesystem boundaries. (These
restrictions are not mandated by POSIX, however.)
"Symbolic links" ("symlinks" for short), on the other hand, are a
special file type (which not all kernels support: System V release 3
(and older) systems lack symlinks) in which the link file actually
refers to a different file, by name. When most operations (opening,
reading, writing, and so on) are passed the symbolic link file, the
kernel automatically "dereferences" the link and operates on the target
of the link. But some operations (e.g., removing) work on the link
file itself, rather than on its target. *Note Symbolic Links:
(libc)Symbolic Links.
Tarkoitan linkin tuhoamisella rm komentoa.
rm teso.h (hard linkkin tuhoaminen)
rm teso.s (symbolinen linkki tuhoaminen)
rm teso.n (alkuperäinen tiedoston tuhoaminen)
Eli jos poistaisin alkuperäisen tiedoston niin teso.h säylyy ja sisältää edelleen alkp. datan mutta teso.s taas viittaa tiedoston nimeen jota ei enää joten se ei sisällä "mitään" dataa paitsi.
Mutta edelleen ihmetelen sitä miksi pystyn muuttamaan "kummankin" (eli teso.n sisältö myös muuttuu) sisältöä yhtäaikaa komennolla.
ls >> teso.h
ls >> teso.s
ls > teso.h
ls > teso.s
mutta en komennolla
vi teso.h
vi teso.s
Miksi toi vi editori räjäytää ton linkin atomeiksi? Millä komennolla tai editorilla pystyisin editoimaan linkiä niin ettei se hajoa.
siis haluasin kirjoittaa käskyn
vi [joku vipu] teso.[sh] (Poistun wq komennolla)
ja editoida sitä niin että kun tallennan muutokset niin alkuperäinen tiedosto myös on muuttunut sekä kaikki siitä tehdyt linkit. Mutta mun tapauksessa toi vi editori ei näytä editoivan alkuperäistä tiedostoa vaan antaa olla sen selaisena kuin se oli???
En käytä vi:tä joten toistin operaatiosi käyttämällä nanoa. Toimii.
Tästä voisi tehdä sen johtopäätöksen, että vi kaipaa jotain parametriä tms. toimiakseen samoin. Eipä muuta kuin 'man vi' sitten.
Hardlinkin tuhoaminen ei poista alkuperäistä tiedostoa. Alkuperäisen tiedoston tuhoaminen ei poista linkkejä - softlink ei enää osoita mihinkään olevaan, mutta hardlink avaa alkuperäisen tiedoston (kuin kopio). Kieltämättä tuo hardlink on vaikeasti ymmärrettävä.
Hardlink siis avaa kiintolevyltä saman alkuperäisen tiedoston, joka poistetaan vasta kun kaikki hardlinkitkin on poistettu.
Täytyy koittaa kun pääsen taas linux koneelle.