250 lines
19 KiB
Plaintext
250 lines
19 KiB
Plaintext
|
|
Episode: 1122
|
||
|
|
Title: HPR1122: LiTS 018: ln
|
||
|
|
Source: https://hub.hackerpublicradio.org/ccdn.php?filename=/eps/hpr1122/hpr1122.mp3
|
||
|
|
Transcribed: 2025-10-17 19:23:03
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
Welcome to Linux in the Shell episode 18, the link command.
|
||
|
|
My name is Dan Washco, I'm going to be your host today.
|
||
|
|
We're going to talk about the link or LN command, but before I do so I want to encourage
|
||
|
|
you to listen to other shows on HackerPublic Radio and or consider contributing to HackerPublic
|
||
|
|
Radio.
|
||
|
|
It's a fantastic community, always looking for contributors and always an entertaining
|
||
|
|
and informative show, so HackerPublic Radio support them, listening, we're contributing
|
||
|
|
either way and I want to thank them for supporting this show and hosting the website and
|
||
|
|
the audio, HackerPublicRadio.org.
|
||
|
|
Today we're going to talk about the link command, LN for short.
|
||
|
|
The link command essentially creates a link from a file or directory to in a different
|
||
|
|
location.
|
||
|
|
Some operating systems call these shortcuts, but in Linux and BSD they're called links and
|
||
|
|
they're created just by using the LN command.
|
||
|
|
LN command at its heart takes one parameter at its heart, well actually two parameters.
|
||
|
|
I recommend always two parameters to the link command, but you could actually get away
|
||
|
|
with only one parameter, get ahead of myself a little bit.
|
||
|
|
What the link command takes is LN and then it takes the target directory or file and then
|
||
|
|
the link you want created or where you want to create it.
|
||
|
|
Let's say you wanted to create a link to your file named test in your home directory and
|
||
|
|
you wanted to link that into your home directory in a subfolder called download.
|
||
|
|
All you would have to do is type LN slash home slash Dan, that's what we're going to use
|
||
|
|
as a home directory slash test and then the target and the destination will be slash home
|
||
|
|
slash Dan slash download slash test and it will create a link in download that points
|
||
|
|
to the file test in your home directory.
|
||
|
|
But that's a high level of the way that's working.
|
||
|
|
I said that it only takes really one parameter.
|
||
|
|
If I would have just said LN space slash home slash Dan slash test and I was in the download
|
||
|
|
directory and hit enter, it would create the link to the test file as if I didn't specify
|
||
|
|
the file name.
|
||
|
|
It would just create a link called test which would point back to the test in home Dan.
|
||
|
|
Now that's in a nutshell, we're going to build off of that syntax but before I continue
|
||
|
|
on the different options, you have to realize that there are two types of link files.
|
||
|
|
So a hard link which is created by default and a simlink, symbolic link which you would
|
||
|
|
have to specify the dash s and what the differences between these two really hinges around the
|
||
|
|
concept of an I node.
|
||
|
|
Now the Linux file systems, except for most Linux file systems, except for RISER FS that
|
||
|
|
uses what's called an I node and an I node is a data structure, a data structure object.
|
||
|
|
So for a file to exist in the Linux file system, you kind of have three different components.
|
||
|
|
You have the I node, you have the directory listing the file name and you have the actual
|
||
|
|
data of the file.
|
||
|
|
So what the I node is, an I node contains all the metadata for the file but it doesn't
|
||
|
|
contain the data and it doesn't contain the file name.
|
||
|
|
It contains stuff like permissions where the file is in the file system, the access time,
|
||
|
|
it contains all that metadata information but not the actual data for the file or the
|
||
|
|
file name itself.
|
||
|
|
So every file or directory in the Linux file system has an I node associated to it.
|
||
|
|
Now what a hard link is, a hard link creates a special kind of file, a link that essentially
|
||
|
|
has the same I node as a hard file.
|
||
|
|
So the hard link shares the same I node as a target file and that I node points to the
|
||
|
|
data for the file but it has a different file name because the file name is stored
|
||
|
|
in this directory.
|
||
|
|
So hard links have the same I node.
|
||
|
|
Now symbolic link does not share the same I node.
|
||
|
|
It has a separate I node but it is a special file that points to the file data and file
|
||
|
|
name in a different location.
|
||
|
|
So a symbolic link is a more of a pointer that points to the data for that file.
|
||
|
|
It has its own I node and its own file name and the directory structure but a hard link
|
||
|
|
shares an I node and has a different file name and different points to the same data structure.
|
||
|
|
So that's the two, that's the differences between a hard link and a symbolic link.
|
||
|
|
Now there are some restrictions here.
|
||
|
|
One of the restrictions is that a hard link cannot span file systems or partitions.
|
||
|
|
So a hard link has to exist in the same file system as its target and on the same partition
|
||
|
|
as its target.
|
||
|
|
A symbolic link is not restricted by that.
|
||
|
|
You can create a symbolic link that spans file systems and different partitions.
|
||
|
|
Also you generally cannot hard link to a directory.
|
||
|
|
Some special circumstances as the super user you can but most of the time if you try to hard
|
||
|
|
link to a directory even as a super user you will it will bark at you and tell you you
|
||
|
|
can't do it.
|
||
|
|
So if you want to create a link to a directory it has to be a symbolic link.
|
||
|
|
Alright, now let's cover some stuff here on links.
|
||
|
|
So just remember link two types of links, hard links symbolic links all based on I nodes.
|
||
|
|
I node contains a meta data information for a file does not contain the file name it does
|
||
|
|
not contain the data hard link creates a link that has the same I node as the target
|
||
|
|
but is in a different data directory structure and points to the same data.
|
||
|
|
Symbolic link is a different I node and points to the different directory you know file system
|
||
|
|
name of the directory structure and points to the same data the data for the file.
|
||
|
|
And you can tell you can look at I nodes if you want to with the dash I option to the
|
||
|
|
LS command.
|
||
|
|
So if you do a dash LS dash L I it will tell you the I nodes of the file in question.
|
||
|
|
So you can actually look at a link and see if it shares the same I node as its target.
|
||
|
|
Very simple.
|
||
|
|
Okay, so I had said that at its heart the LN command only needs one parameter to target.
|
||
|
|
If you are using the LN command which is the target it's going to create the link in
|
||
|
|
the current directory with the same name as a target.
|
||
|
|
So long as no other file or directory exists in that directory with the same name and
|
||
|
|
the target is not in the same directory that you're working with otherwise you would have
|
||
|
|
to specify the link name.
|
||
|
|
So I always recommend specifying the link name just to be on the safe side.
|
||
|
|
So again in the example I used before if we wanted to create a link to that test directory
|
||
|
|
in the download directory I had said LN space slash home slash day and slash test space
|
||
|
|
slash home slash day and slash download slash test and that creates the link.
|
||
|
|
Now default is creating hard links.
|
||
|
|
If you want to create a symbolic link you have to use the dash S command option.
|
||
|
|
So if I wanted to create a, for instance, let's say I had a WWW directory and my home
|
||
|
|
directory with stuff I wanted to use this website files but I didn't necessarily want
|
||
|
|
to create a whole directory structure.
|
||
|
|
I didn't want to move that into the website and I just wanted to do a temporary.
|
||
|
|
This is a bad example but bear with me.
|
||
|
|
So my website, my Apache server hosts my website files, my document root is VAR slash
|
||
|
|
VAR slash WW slash and that's my document root and in my home directory I have a WW directory.
|
||
|
|
What I could do like if I wanted to just temporarily share that out there's a whole lot of
|
||
|
|
ways of doing it but we're just going to do a symbolic link.
|
||
|
|
I can do an LN space dash S slash home slash day and slash WW and then do slash VAR slash
|
||
|
|
WW slash day and what that does is it creates a symbolic link from the home of my WWW directory
|
||
|
|
in the VAR WW directory called day and so if you went to VAR WW day and it would take
|
||
|
|
you right into the WWW directory in my home directory.
|
||
|
|
Now some things would be aware of how that all works.
|
||
|
|
One of the issues that you need to realize with links is permissions.
|
||
|
|
When you do a hard link to a file essentially because it's the same I node it's they have
|
||
|
|
the same permissions that those files have the same permissions and they'll always have
|
||
|
|
the permissions of the file that you have created.
|
||
|
|
So if you change the permissions on the hard link itself you are actually going to change
|
||
|
|
permissions on the target file or directory well target file you can't really create links
|
||
|
|
to the director's.
|
||
|
|
Whereas on a symbolic link when a symbolic link is created the permissions on a symbolic
|
||
|
|
link are 777 the world readable writeable everything that's the way they work.
|
||
|
|
If you try to change permissions on the symbolic link you are actually going to change permissions
|
||
|
|
on the target file so just be aware of that it passes it through to the target file
|
||
|
|
or directory that's the way it works.
|
||
|
|
Let's cover some other options here.
|
||
|
|
So we talked about the dash s is for symbolic creating symbolic link and you can create
|
||
|
|
symbolic links across file systems and you can create a symbolic link to a directory.
|
||
|
|
One of the options that you have available to you is the ability when you're doing it
|
||
|
|
and option is the let's talk about backups.
|
||
|
|
By default if you try to create a link to a file and link already like your target your
|
||
|
|
link already exists in a location it's going to complain that the file or target already
|
||
|
|
exists.
|
||
|
|
So it's not going to let you create that link of that name.
|
||
|
|
You can change that with the dash f or dash dash force option which will erase any
|
||
|
|
link that's there and overwrite any link or file that's there.
|
||
|
|
To help out with that you can use a dash b or dash dash backup and that will back up
|
||
|
|
any file that exists.
|
||
|
|
Now dash dash backup also takes with it an additional options.
|
||
|
|
So it's dash dash backup equals and the type of backup that you're going to do.
|
||
|
|
There are four parameters that you can put in here.
|
||
|
|
None are off which means never make a backup so even if the dash dash backup is given so
|
||
|
|
it's kind of like equals none or off either one of those and it will make a backup.
|
||
|
|
Then there's equals numbered or t which makes a number backup and what you'll end up with
|
||
|
|
is the file is already there it's going to rename the file the new file it's going to
|
||
|
|
be the same name but it's going to attack on the end of it dot tilde a number dot tilde
|
||
|
|
dot tilde a number tilde.
|
||
|
|
So every time that you create a link and it needs to back it up it's going to increment
|
||
|
|
that number so to be dot tilde one tilde dot tilde two tilde and so on.
|
||
|
|
Then there's existing while I'll cover existing next then then simple is just a the file
|
||
|
|
with us tilde after this is simple backup now the way that it operates is the final option
|
||
|
|
was existing or no what that does is if it's a if it's a simple backup that already exists
|
||
|
|
in place it's going to use that if it's a number backup that already exists in place it'll
|
||
|
|
continue to number otherwise it's just going to go simple by default is the way to operate.
|
||
|
|
So the dash B command works just like dash dash backup but it doesn't accept an argument
|
||
|
|
it kind of goes with existing so if there's a number backup already it'll continue with
|
||
|
|
a number backup structure otherwise it's going to default to simple so that's that's
|
||
|
|
what those there is and dash I or dash dash interactive which will prompt you if the destination
|
||
|
|
or the the link already exists or file that name exists it will prompt you whether or not
|
||
|
|
you want to remove the destination so that's a dash I option right there you can change the
|
||
|
|
suffix for backups with the dash capital S or dash dash at suffix equals and in a suffix name
|
||
|
|
so instead of getting like tilde or tilde number tilde it would just create that suffix name that
|
||
|
|
you're going to use and if it was numbered it would create a number after it so that's the dash
|
||
|
|
S capital S or dash dash suffix equals and then the suffix you want to use.
|
||
|
|
There's a verbose option to Ellen which is dash V or dash dash for both and that will echo
|
||
|
|
out exactly what it's going to do so if you did Ellen dash S for creating symbolic link
|
||
|
|
home dan www to var www dan it would spit out that it created a link to home dan or created a link
|
||
|
|
from home from www slash var slash dan to home dan www it's verbose it kind of makes sense right there
|
||
|
|
you can create a relative symbolic link now a relative symbolic link generally when you
|
||
|
|
when you create a symbolic link you pass the full you know the full parameters to them it'll
|
||
|
|
use the full parameters whereas if you create a relative symbolic link it will create that link
|
||
|
|
relative to the target so if you were to pass like I was saying before the full paths
|
||
|
|
creating a symbolic link from slash from slash dan slash www to slash var slash
|
||
|
|
www slash dan when you go to look at that the relative link that it would create in the
|
||
|
|
var www dan would be instead of showing the path to to dan in the home directory it would be
|
||
|
|
dot dot slash dot dot slash home slash dan slash www so that that's kind of what it does is
|
||
|
|
creates a relative path from the location of the link to the target so that that works like that
|
||
|
|
with the dash R now we are going to talk about some some kind of little more complex aspects of
|
||
|
|
the L and command and one of those is the dash P or capital P the dash capital P makes hard links
|
||
|
|
to symbolic links okay which is kind of odd you're like well why would you want to do that I have
|
||
|
|
no idea why you want to do it but you can if you were to do like if you were to have a say you had
|
||
|
|
a symbolic link and you did let's go let's go with the back to the original example where we had
|
||
|
|
a hard or a hard link to test in the home directory to test in the download directory we had a
|
||
|
|
symbolic link to test in the download directory to test in the home directory and I tried to create
|
||
|
|
a hard link against test in the download essentially what it would do is it would create a hard
|
||
|
|
link to its target so by doing the dash capital P that creates a hard link to the symbolic link
|
||
|
|
so now you have a hard link to the symbolic link as opposed directly to the target of the symbolic
|
||
|
|
link why you would want to do that I really do not know but you can let me let me correct something
|
||
|
|
there because I'm a little off on that we were afraid something if you attempt to create a hard link
|
||
|
|
to a existing symbolic link by default what it will do is create a symbolic link to the target
|
||
|
|
of the existing symbolic link so in the case if I just did Ellen
|
||
|
|
Ellen test and new in the download directory new would be a symbolic link to the target of test
|
||
|
|
which is test in my own directory whereas with the dash P creates a symbolic link
|
||
|
|
creates a hard link to the symbolic link now there's another option dash L which will tell
|
||
|
|
it to create in that case a hard link to the target of the symbolic link so the three ways
|
||
|
|
this works trying to create a hard link to a symbolic link by default will create a symbolic link
|
||
|
|
to the target of the symbolic link where if you pass the dash capital P is going to create
|
||
|
|
a hard link to the symbolic link and a dash capital L or logical maybe it is dash dash logical
|
||
|
|
dash dash logical will create a hard link to the target file instead of creating a symbolic link
|
||
|
|
so I cleared that up understand that there are two other options that I want to talk about these
|
||
|
|
are a little more complex and special in certain very limited circumstances it's the dash T
|
||
|
|
or dash dash target dash directory equals in the dash capital T dash dash no target no
|
||
|
|
dash target dash directory these are a little more complex and have very specialized usages
|
||
|
|
and generally speaking you probably will never need to use any of these unless you're actually
|
||
|
|
programming trying to talk about these these difference these more complex ones and I'm going
|
||
|
|
to throw the dash and in there also because it operates like dash T but it's a little weaker than
|
||
|
|
dash T they're really a little bit hard to talk about because they they operate on the differences
|
||
|
|
between linking to trying to link to a directory or what the target is whether a directory or a
|
||
|
|
link and they're the rather to speak of them is is getting into a bit of a wordplay and might not
|
||
|
|
be able to convey the full understanding in the audio I recommend that you go to the website
|
||
|
|
and look at the examples for these commands with the dash and it depends on what what the target is
|
||
|
|
if the target of the ln command is a symbolic link to a directory instead of treating it
|
||
|
|
as a symbolic link it treats it as like a normal file all right and if you're using it it's kind
|
||
|
|
of a weaker version of the dash dash capital T or dash dash no dash target dash directory which
|
||
|
|
essentially is kind of like the same thing it would force the ln command to treat any
|
||
|
|
director or symbolic link to a directory as a regular file and again these are used in special
|
||
|
|
conditions it's generally you want to be careful about not creating hard links to
|
||
|
|
directories but you know creating symbolic links to directories works fine but if you're trying to
|
||
|
|
if you're trying to create a link to a directory you got to be aware of how these things behave
|
||
|
|
generally speaking if your target your link name is is a directory itself you create symbolic links
|
||
|
|
to that directory but if you can you can change how the behavior is with the dash and or the
|
||
|
|
dash capital T to look at that symbolic link to a directory as if it were a regular file
|
||
|
|
the dash T and the dash dash T direct dash directory equals takes a directory after it and it
|
||
|
|
tells the ln command to use directory that you specified as the specified directory option
|
||
|
|
generally you would use this in conjunction with another command but you were actually passing
|
||
|
|
information to like x-ards would be a great example if you are listing out or using fine
|
||
|
|
defined files of a specific type in the directory you can pass that to x-ards and then pass
|
||
|
|
the to the x-ards command the output of that fine command to x-ards to pass to ln to say okay using
|
||
|
|
the dash T the specified directory name pass the directory to use that as a directory and then
|
||
|
|
create all these links in that directory go to the website check that out it has links to
|
||
|
|
some further explanations particularly the man page and the info page and there's another page
|
||
|
|
that I referenced in there for with the dash T and the dash capital T mean but chances are you will
|
||
|
|
never use the dash and dash T dash capital T in your life so the very outlying cases right there
|
||
|
|
but I've covered all the basics of the ln command if you want to see it in action head on over to
|
||
|
|
the website linuxinachial.org look up this episode and watch the video which I'll be posting up there
|
||
|
|
also I encourage you to do that anyhow to read the full write-up of the ln command get a better
|
||
|
|
understanding my name is Dan is Dan waschko and I thank you for joining me on linuxinachial
|
||
|
|
episode 18 with the link command and thank hack and public radio you have a great day
|
||
|
|
you have been listening to hack or public radio at hack or public radio does our we are a community
|
||
|
|
podcast network the releases shows every weekday Monday through Friday today's show like all our
|
||
|
|
shows was contributed by a hbr listener like yourself if you ever considered recording a podcast
|
||
|
|
then visit our website to find out how easy it really is hack or public radio was founded by the
|
||
|
|
digital dot pound and the infonomicum computer club hbr is funded by the binary revolution
|
||
|
|
at binref.com all binref projects are crowd sponsored by luna pages from shared hosting to
|
||
|
|
custom private clouds go to luna pages.com for all your hosting needs unless otherwise stasis
|
||
|
|
today's show is released under a creative commons attribution share a line
|