[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Automatic updating links?



Greg Wooledge <wooledg@eeg.ccf.org> writes:

> On Tue, Jun 06, 2017 at 12:27:06PM +0100, Rodolfo Medina wrote:
>> I wish to create a link to a file that wouldn't break when that file is
>> moved on elsewhere in the filesystem or renamed, nay the link would
>> automatically `update' pointing at the new name/address of the file.  Is
>> that possible?  Besides, I wish that form of automatic update also when
>> moving or renaming the directory where the link itself lives.
>
> There are two types of links in Unix: "hard" links, and "soft" (symbolic)
> links.
>
> A symbolic link contains the name of its "target".  When you open the
> symlink, the underlying file system drivers see that it's a symlink,
> read the target, and rewrite the filename to open the target that the
> symlink points to.  For example:
>
> wooledg:~$ ls -ld file
> -rw-r--r-- 1 wooledg 563 24 Jul  2  2015 file
> wooledg:~$ cat file
> line one
> line two
> match
> wooledg:~$ ln -s file slink
> wooledg:~$ ls -ld slink
> lrwxrwxrwx 1 wooledg wooledg 4 Jun  6 08:18 slink -> file
> wooledg:~$ cat slink
> line one
> line two
> match
>
> Now, if I rename "file", the symlink "slink" will no longer point to
> the right place:
>
> wooledg:~$ mv file xfile
> wooledg:~$ cat slink
> cat: slink: No such file or directory
>
> I believe that's what you already knew before asking this question,
> but I had to include this information to be sure, because you didn't
> actually say what you had already tried.
>
> Now, the other type of link is older and much more subtle.  Hard links
> work at the inode level.  To really understand what a hard link is, you
> need to understand how directories and inodes work in Unix.
>
> A directory in Unix is (conceptually) just a list of filenames and
> inode numbers.  Imagine a telephone book.  You can look up a person's
> name, and next to their name is their telephone number.  This is how
> Unix directories work.  This is where the name "directory" actually
> comes from.  (Phone books are formally called "directories".)
>
> (If you're too young to know what a phone book is... then I don't know
> how to help you with that.)
>
> So.  You have a directory, and inside the directory is a file.  Let's
> revert back to our original state:
>
> wooledg:~$ rm slink; mv xfile file
> wooledg:~$ ls -ld file
> -rw-r--r-- 1 wooledg 563 24 Jul  2  2015 file
>
> Now let's create a "hard" link to the file:
>
> wooledg:~$ ln file hlink
> wooledg:~$ ls -ld file hlink
> -rw-r--r-- 2 wooledg 563 24 Jul  2  2015 file
> -rw-r--r-- 2 wooledg 563 24 Jul  2  2015 hlink
>
> See the "2" between the permissions and the owner?  That's the link
> count.  That tells us how many hard links there are to the file.  If
> we inspect the inode numbers for these two directory entries, we'll
> see that they are the same:
>
> wooledg:~$ ls -li file hlink
> 1573283 -rw-r--r-- 2 wooledg 563 24 Jul  2  2015 file
> 1573283 -rw-r--r-- 2 wooledg 563 24 Jul  2  2015 hlink
>
> Same inode number.  They are in fact two different names for the same
> *file*.  Both directory entries contain the same inode number, which
> is the only thing a directory can tell you.
>
> Now, if I rename the file, let's observe what happens:
>
> wooledg:~$ mv file xfile
> wooledg:~$ ls -li xfile hlink
> 1573283 -rw-r--r-- 2 wooledg 563 24 Jul  2  2015 hlink
> 1573283 -rw-r--r-- 2 wooledg 563 24 Jul  2  2015 xfile
> wooledg:~$ cat hlink
> line one
> line two
> match
>
> In this case, the renaming of *one* of the hard links did not matter.
> The *other* hard link still "points to" the inode that contains the
> actual contents.  You can move the hard link ("file") to a subdirectory,
> or any other directory inside the file system, and it won't matter.
> The hard links still point to the same inode number.
>
> Now, this part is very important: inode numbers are only meaningful
> within a single file system.  If you move one of the "files" *outside*
> of this file system, then the hard links will no longer reference 
> the same file.  If you modify one of them, the other will still contain
> a copy of the original content.
>
> wooledg:~$ mkdir /run/user/1000/tmp
> wooledg:~$ mv xfile file
> wooledg:~$ mv hlink /run/user/1000/tmp
> wooledg:~$ ls -lid file /run/user/1000/tmp/hlink
> 1573283 -rw-r--r-- 1 wooledg     563 24 Jul  2  2015 file
>  319746 -rw-r--r-- 1 wooledg wooledg 24 Jul  2  2015 /run/user/1000/tmp/hlink
> wooledg:~$ echo "another line" >> /run/user/1000/tmp/hlink
> wooledg:~$ cat file
> line one
> line two
> match
>
> At this point, even though the two "files" were orignally hard linked,
> that changed when we moved one of them to a different file system.
> Now they are simply two files with no relationship to each other.
>
> So... to answer your question, as long as you only have *ONE* file
> system to worry about, you can make hard links, and I believe they
> will satisfy your stated requirements.


Thanks indeed to Greg for his complete explanation and to all who provided
help...  Yes, hardlink should be the case for what I'm looking for...  But, I
also need that, when renaming the target file, the link would automatically
change its name so that it keeps equal to the target's name...  Is this
possibile?

Thanks, kind regards

Rodolfo


Reply to: