forked from andonome/lk
		
	embiggen links
This commit is contained in:
		
							
								
								
									
										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" | ||||
| tags: [ "Documentation", "Basics" ] | ||||
| tags: [ "basics", "links" ] | ||||
| --- | ||||
| Link from X to Y. | ||||
|  | ||||
| ```bash | ||||
| 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`). | ||||
| There are two types: | ||||
|  | ||||
| - [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 | ||||
| ``` | ||||
|  | ||||
		Reference in New Issue
	
	Block a user