embiggen links
This commit is contained in:
parent
47961779d5
commit
d4c4463f70
38
basics/hard_links.md
Normal file
38
basics/hard_links.md
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
---
|
||||||
|
title: "hard links"
|
||||||
|
tags: [ "basics", "links" ]
|
||||||
|
---
|
||||||
|
|
||||||
|
A hard link is one file which exists in multiple locations.
|
||||||
|
|
||||||
|
Each file has an ID, which is kept on the hard disk's partition.
|
||||||
|
Each hard link has the same ID, because they are the same file.
|
||||||
|
This ID is called the 'inode'.
|
||||||
|
|
||||||
|
Create a file, and a hard link:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
fortune > $file_1
|
||||||
|
mkdir -p x/y/z/
|
||||||
|
ln $file_1 x/y/z/$file_2
|
||||||
|
```
|
||||||
|
Have a long look at the file with the `-l` flag, and check the inode with `-i`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -li $file_1 x/y/z/$file_2
|
||||||
|
```
|
||||||
|
|
||||||
|
Since they are the same file, you can make a change to one, and it changes both:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
fortune | tee x/y/z/$file_2
|
||||||
|
cat $file_1
|
||||||
|
cat x/y/z/$file_2
|
||||||
|
```
|
||||||
|
|
||||||
|
# Danger Zone
|
||||||
|
|
||||||
|
- hard links will not work on directories, only standard files and fifos.
|
||||||
|
- `git` will destroy and remake files, so it will not respect hard links.
|
||||||
|
- Files cannot have a hard link on another disk partition, because the inode is stored on each partition.
|
||||||
|
|
@ -1,19 +1,9 @@
|
|||||||
---
|
---
|
||||||
title: "links"
|
title: "links"
|
||||||
tags: [ "Documentation", "Basics" ]
|
tags: [ "basics", "links" ]
|
||||||
---
|
---
|
||||||
Link from X to Y.
|
|
||||||
|
|
||||||
```bash
|
There are two types:
|
||||||
ln -s X ../otherdir/Y
|
|
||||||
```
|
|
||||||
|
|
||||||
If you want a hard link, this will make a single file exist in two locations.
|
|
||||||
If it is deleted in one location, it continues to exist in the other.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ln *X* *Y*
|
|
||||||
```
|
|
||||||
|
|
||||||
Both files must be on the same hard drive, as they have the same inode (check this with `ls -i file`).
|
|
||||||
|
|
||||||
|
- [Soft links](soft_links.md)
|
||||||
|
- [Hard links](hard_links.md)
|
||||||
|
72
basics/soft_links.md
Normal file
72
basics/soft_links.md
Normal file
@ -0,0 +1,72 @@
|
|||||||
|
---
|
||||||
|
title: "soft links"
|
||||||
|
tags: [ "basics", "links" ]
|
||||||
|
---
|
||||||
|
A soft link is a file which says how to go to another file.
|
||||||
|
When a program encounters a soft link, it will make a guess at whether it should ignore it, or try to get to that file.
|
||||||
|
|
||||||
|
To make a soft link to a file in the current directory, linking is easy:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
fortune > $file_1
|
||||||
|
ln -s $file_1 $link_1
|
||||||
|
```
|
||||||
|
|
||||||
|
Now imagine your directory looks like this:
|
||||||
|
|
||||||
|
```
|
||||||
|
dir_0/
|
||||||
|
├── dir_1
|
||||||
|
│ └── file_1
|
||||||
|
├── dir_2
|
||||||
|
│ └── file_1
|
||||||
|
├── file_1
|
||||||
|
└── link_1
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Inside `dir_1`, making a soft link to `dir_0/file_1` would mean putting the directions to that file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd dir_1
|
||||||
|
ln -s ../file_1 link_1
|
||||||
|
```
|
||||||
|
|
||||||
|
The real content of the file is just '`../file_1`, so making it from another directory would mean writing exactly the same address to that file:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ln -s ../file_1 dir_2/link_2
|
||||||
|
```
|
||||||
|
|
||||||
|
Both symlinks are identical, except for the name.
|
||||||
|
|
||||||
|
```
|
||||||
|
dir_0/
|
||||||
|
├── dir_1
|
||||||
|
│ ├── file_1
|
||||||
|
│ └── link_1 <-- This one points to ../file_1
|
||||||
|
├── dir_2
|
||||||
|
│ ├── file_1
|
||||||
|
│ └── link_2 <-- This one points to ../file_1 as well.
|
||||||
|
└── file_2
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
Since it's just an address, you can delete the original file, then make another.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
rm file_1
|
||||||
|
ls -l dir_1/
|
||||||
|
fortune > file_1
|
||||||
|
cat dir_2/link_2
|
||||||
|
fortune | tee -a file_1
|
||||||
|
cat dir_1/link_1
|
||||||
|
```
|
||||||
|
|
||||||
|
Last, let's make a link from `dir_2/link_2` to `dir_1/file_1` (this will delete the old link):
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ln -s -f ../dir_1/file_1 dir_2/link_2
|
||||||
|
cat dir_2/link_2
|
||||||
|
```
|
||||||
|
|
Loading…
Reference in New Issue
Block a user