Linux-如何成为一个优秀的管家(文件篇①)

知识前提:

根据FHS(《文件系统层次化标准》)规定,Linux有一个树形目录,其中最重要的是根目录,所有的目录都位于根目录下。FHS规定了Linux根目录下该有哪些目录,这些特定的目录下应该放置什么数据。

根目录下至少应该包括如下12个目录
⑴ /bin 放置可执行的命令文件
⑵ /boot 放置系统核心和开机所需文件
⑶ /dev 放置系统设备相关文件
⑷ /etc 放置系统主要的配置文件
⑸ /home 放置除跟用户外其他用户的家目录,默认情况下,每个用户都在该目录下有一个自己的私人目录
⑹ /lib 放置系统和程序运行所要调用的库函数文件
⑺ /root 是root用户的家目录
⑻ /sbin 放置根用户才能够执行的命令文件
⑼ /srv 目录放置服务启动之后需要访问的数据,如web服务所需要访问的网页数据,就默认存放在/srv/xxx目录下
⑽ /tmp 程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下
⑾ /opt 第三方软件建议安装目录,也即非本发行版本所提供的软件,建议放置在此目录下
⑿ /media 放置移动设备相关的文件,如光驱,U盘相关数据都放在该目录下


当使用Linux的时候,我们总是位于某个目录中,这个所处的目录就被称为“工作目录”。登录系统时,初始的默认“工作目录”总是登录用户的“家目录”,也即登录用户的私人目录。
我们可以观察提示符,得知自己当前所处在哪个目录下,也可以用“pwd”命令来显示当前完整的“工作目录”,可以用“cd”命令来切换工作目录。

一、目录

① 切换目录:cd(Change Directory)
切换工作目录到tmp目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ cd /tmp
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ pwd
/tmp

Linux外壳程序bash提供了一些特殊字符用于代表特定目录
“.”表示当前工作目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ cd ./dir01
[kelly@iZbp18hjhpsqpbmjdflxkcZ dir01]$ pwd
/tmp/dir01

“..”表示工作目录上层目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ dir01]$ cd ../dir02
[kelly@iZbp18hjhpsqpbmjdflxkcZ dir02]$ pwd
/tmp/dir02

"-"表示前一个工作目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ dir02]$ cd -
/tmp/dir01

“~”表示用户家目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ dir01]$ cd ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ pwd
/home/kelly

切换到kelly用户的家目录中
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ cd ~kelly
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ pwd
/home/kelly
② 创建目录:mkdir(Make Directory)
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ mkdir /tmp/sampledir
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ cd /tmp/sampledir
[kelly@iZbp18hjhpsqpbmjdflxkcZ sampledir]$ pwd
/tmp/sampledir

使用“-p”创建嵌套目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ sampledir]$ mkdir -p /tmp/dirlevel01/dirlevel02
[kelly@iZbp18hjhpsqpbmjdflxkcZ sampledir]$ cd /tmp/dirlevel01/dirlevel02/
[kelly@iZbp18hjhpsqpbmjdflxkcZ dirlevel02]$ pwd
/tmp/dirlevel01/dirlevel02
③ 删除目录:rmdir(Remove Directory)
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ rmdir sampledir
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ cd sample
-bash: cd: sample: No such file or directory

注意:rmdir只能删除空目录
01目录下还有一个02目录,因此无法删除
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ rmdir dirlevel01
rmdir: failed to remove dirlevel01: Directory not empty

注意
使用 rm –rf *(删除当前目录下的所有文件,包括隐藏文件)前,请使用 pwd 命令确定当前目录,以免发生误删除,避免使用 sudo rm -rf /*(删除根目录下的所有文件,包括隐藏文件)。

二、文件权限

① 显示文件目录列表:ls(List Files)
ls [文件名|目录名|none]
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls /etc/passwd
/etc/passwd
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls /
access_token.conf  bin  boot  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls
dir01  dir02  dirlevel01  

ls -a :表示列出隐藏文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -a
.   dir01  dirlevel01  .ICE-unix.Test-unix  .XIM-unix
..  dir02  .font-unix  .X11-unix

ls -l :以长格式列出文件(除了列出文件名,还要列出文件的详细属性信息)
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -l
total 16
drwxrwxr-x 2 kelly kelly 4096 Jan  8 16:26 dir01
drwxrwxr-x 2 kelly kelly 4096 Jan  8 16:26 dir02
drwxrwxr-x 3 kelly kelly 4096 Jan  8 17:02 dirlevel01

ls -al:表示以长格式列出指定目录下的所有文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -al
total 44
drwxrwxrwt. 11 root  root  4096 Jan  8 17:05 .
dr-xr-xr-x. 19 root  root  4096 Jun 18  2020 ..
drwxrwxr-x   2 kelly kelly 4096 Jan  8 16:26 dir01
drwxrwxr-x   2 kelly kelly 4096 Jan  8 16:26 dir02
drwxrwxr-x   3 kelly kelly 4096 Jan  8 17:02 dirlevel01
drwxrwxrwt.  2 root  root  4096 Mar 29  2020 .font-unix
drwxrwxrwt.  2 root  root  4096 Mar 29  2020 .ICE-unix
drwxrwxrwt.  2 root  root  4096 Mar 29  2020 .Test-unix
drwxrwxrwt.  2 root  root  4096 Mar 29  2020 .X11-unix
drwxrwxrwt.  2 root  root  4096 Mar 29  2020 .XIM-unix

我们可以观察到,每个文件的详细属性都占据ls命令的一行输出,以其中一个目录drwxrwxr-x 2 kelly kelly 4096 Jan 8 16:26 dir01为例。

文件的详细属性包括了七个字段
① 文件的类型和权限
② 文件的硬链接数目
③ 文件的拥有者
④ 文件从属的用户组
⑤ 文件的大小,单位是字节
⑥ 文件的时间戳,即文件最近修改的日期和时间
⑦ 文件名

第① ③ ④字段联合在一起决定了一个文件完整的访问权限属性(File Access Permission)。

在Linux中,与文件有关系的用户被分成三类,首先就是文件拥有者(Owner),也就是第③个字段规定的用户,文件拥有者只可能有一个;然后是文件所从属的用户组(Group)里面的用户,也就是第④个字段所规定的的一组用户里的用户,这些用户可以有多个;最后是除了前面两类用户外的其他用户(Others)。

第①字段补充说明
-:普通文件
d:目录文件
c:字符设备文件
b:块设备文件
l:符号链接文件

文件拥有者和文件从属的用户组又与Linux的文件访问权限有什么关系呢?
我们可以看到,第①个字段由十个字符构成,其中后面九个字符构成三组,每组3个字符.分别规定了文件拥有者,文件所从属用户组里的用户,和其他用户对于这个文件的访问权限。如果对于文件有相应权限,在特定位上就会有相应字符显示。特定位上如果显示的是“-”字符,就表示没有相应权限。


访问权限可以分为四类
r:读权限,表示可以查看这个文件的内容,数字代号为“4”;
w:写权限,表示可以修改这个文件的内容,或者删除这个文件,数字代号为“2”;
x:执行权限,表示可以运行这个文件,数字代号为“1”;
- :不具有任何权限,数字代号为“0”。

当前,我们在kelly用户下,以-rwxrw-r-- 1 kelly kelly 35 Jan 12 11:32 hello.sh文件为例子,操作三个权限:

读权限
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ vim ./hello.sh 

#!/bin/bash
echo hello world

写权限
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ vim ./hello.sh 

#!/bin/bash
echo hello world kelly

"./hello.sh" 2L, 35C written 

执行权限
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ./hello.sh     
hello world kelly
② 修改文件访问属性:chmod(Change Mode)
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ chmod 700 hello.sh 
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -l ./hello.sh 
-rwx------ 1 kelly kelly 35 Jan 12 11:32 ./hello.sh
③ 修改文件拥有者和从属用户组的属性:chown(Change Owner)
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ sudo chown apps:apps hello.sh     
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -l hello.sh 
-rwx------ 1 apps apps 35 Jan 12 11:32 hello.sh

如果只想修改文件拥有者,那么冒号和其后部分可以省略
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ sudo chown test hello.sh 
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -l hello.sh 
-rwx------ 1 test apps 35 Jan 12 11:32 hello.sh

如果想单修改从属用户组,冒号前面部分可以省略
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ sudo chown :test hello.sh    
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ls -l hello.sh 
-rwx------ 1 test test 35 Jan 12 11:32 hello.sh

三、修改文件

① 拷贝:cp(copy)
cp [要拷贝的文件|文件列表] [目的文件名|目的目录]
复制文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo cp /tmp/hello.sh ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ll
total 0
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
hello.sh

复制文件的同时重命名文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo cp /tmp/hello.sh ~/hello_bak.sh 
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
hello_bak.sh  hello.sh

同时拷贝多个文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo cp /tmp/file01 /tmp/file02 /tmp/file03 ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
file01  file02  file03  hello_bak.sh  hello.sh

拷贝整个目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo cp -r /tmp/dir01 ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  file01  file02  file03  hello_bak.sh  hello.sh

强制覆盖所有同名文件
kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo \cp -f /tmp/file01 /tmp/file02 ~ 
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  file01  file02  file03  hello_bak.sh  hello.sh
注意事项:

cp命令拷贝文件时,文件的属性包括文件拥有者,文件从属组和访问权限位都有可能发生变化,如以root用户的身份拷贝hello.sh文件到apps用户的家目录下,我们可以看到文件拥有者,文件从属组属性都由tests变成了root,这将导致apps用户无法修改或者执行文件。
我们如果需要原原本本地将文件拷贝过来,要在命令后面跟上一个 -p 选项。这样文件属性就和原来一模一样,但是使用 -p 选项的前提是,登录用户对于这个文件有写权限才行。

[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l /tmp/hello.sh 
-rwx------ 1 test test 35 Jan 12 11:32 /tmp/hello.sh
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo cp /tmp/hello.sh ~apps
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo ls -l ~apps/hello.sh
-rwx------ 1 root root 35 Jan 14 22:30 /home/apps/hello.sh

[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo cp -p /tmp/hello.sh ~apps
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo ls -l ~apps/hello.sh
-rwx------ 1 test test 35 Jan 12 11:32 /home/apps/hello.sh
② 移动文件:mv(move)
mv [要移动的文件|文件列表|目录] [目的文件名|目的目录]
移动单个文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo mv /tmp/file04 ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  file01  file02  file03  file04  hello_bak.sh  hello.sh

移动多个文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo mv /tmp/file05 /tmp/file06 /tmp/file07 ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  file01  file02  file03  file04  file05  file06  file07  hello_bak.sh  hello.sh

移动目录
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo mv /tmp/dir02 ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  dir02  file01  file02  file03  file04  file05  file06  file07  hello_bak.sh  hello.sh

强制覆盖所有同名文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  dir02  file01  file02  file03  file04  file05  file06  file07  hello_bak.sh  hello.sh
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo mv -f /tmp/file02 ~
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  dir02  file01  file02  file03  file04  file05  file06  file07  hello_bak.sh  hello.sh

重命名文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo mv ./file07 ./file07_rename
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  dir02  file01  file02  file03  file04  file05  file06  file07_rename  hello_bak.sh  hello.sh
③ 删除文件:rm(remove)
rm [要删除的文件|文件列表|目录]
删除单个文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo rm ./file01
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  dir02  file02  file03  file04  file05  file06  file07_rename  hello_bak.sh  hello.sh

删除多个文件
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo rm ./file02 ./file03 ./file04
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir01  dir02  file05  file06  file07_rename  hello_bak.sh  hello.sh

删除整个目录
方法1:
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo rm -R ./dir01
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
dir02  file05  file06  file07_rename  hello_bak.sh  hello.sh
方法2:
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo rm -fR ./dir02
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls
file05  file06  file07_rename  hello_bak.sh  hello.sh
④ 创建文件:touch
touch [要创建的文件]
touch命令创建的文件是一个没有任何内容的空文件,文件大小为0字节
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ touch /tmp/empty
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l /tmp/
total 24
drwxrwxr-x 2 kelly kelly     4096 Jan  8 16:26 dir01
drwxrwxr-x 3 kelly kelly     4096 Jan  8 17:02 dirlevel01
-rw-rw-r-- 1 kelly kelly        0 Jan 15 17:13 empty
-rwx------ 1 test  test        35 Jan 12 11:32 hello.sh

创建已经存在的文件,则会改变文件的时间戳属性,即文件的最后修改时间属性
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l /tmp/hello.sh 
-rwx------ 1 test  test        35 Jan 12 11:32 hello.sh
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo touch /tmp/hello.sh   
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l /tmp/hello.sh 
-rwx------ 1 test  test        35 Jan 15 17:19 /tmp/hello.sh
⑤ 创建符号链接文件:ln(link)
ln -s [链接指向的文件] [链接名]
符号链接比较灵活,可以为任意文件创建链接
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l /tmp/hello.sh 
-rwx------ 1 test test 35 Jan 15 17:19 /tmp/hello.sh
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ln -s /tmp/hello.sh ./hello_slink
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l ./hello_slink 
lrwxrwxrwx 1 kelly kelly 13 Jan 15 17:59 ./hello_slink -> /tmp/hello.sh

若删除符号链接文件的源文件,这个符号链接文件就会失效,无法读取或者执行该文件,这种情况我们称为符号链接“断裂”
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ sudo rm /tmp/hello.sh 
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -l ./hello_slink
lrwxrwxrwx 1 kelly kelly 13 Jan 15 17:59 ./hello_slink -> /tmp/hello.sh
⑥删除符号链接:unlink
unlink [链接名]
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ll
total 1032
-rw-rw-r-- 1 kelly kelly 1048576 Jan 29 14:10 1m.txt
drwxrwxr-x 2 kelly kelly    4096 Jan 18 17:54 dirlevel01
lrwxrwxrwx 1 kelly kelly      13 Jan 26 15:50 hello.sh_slink -> /tmp/hello.sh
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ unlink hello.sh_slink 
[kelly@iZbp18hjhpsqpbmjdflxkcZ tmp]$ ll
total 1032
-rw-rw-r-- 1 kelly kelly 1048576 Jan 29 14:10 1m.txt
drwxrwxr-x 2 kelly kelly    4096 Jan 18 17:54 dirlevel01
注意:

当我们使用unlink命令删除符号连接时,符号链接指向的文件并不会被删除。使用unlink删除指定的文件,我们需要对包含该文件的目录具有写权限。 否则,将出现“不允许操作”错误。

⑦ 硬链接
基本概念:Linux文件是如何存储?

在Linux中划分磁盘分区并格式化时,会划分出两个区,分别是inode区和data block区。Linux中的每个文件都会分成两部分存放,一部分是文件的唯一标识,inode-number以及属性信息放在inode区的一个inode中,inode-number和inode是一一对应的;另一部分是文件实际数据,放在data block区中。在Linux中,我们需要通过文件的inode来找到存放文件数据的data block。
如果我们把硬盘分区中所有的文件比作一本书的话,inode区就是目录,data block区就是其内容,我们必须通过目录才能够找到具体的内容。

使用命令 ls -il 来观察文件的inode-number,第一个字段就是文件的inode-number
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -il
total 12
1189494 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file05
1189496 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file06
1189497 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file07_rename
 792896 -rwx------ 1 root  root    35 Jan 14 22:20 hello_bak.sh
 792465 -rwx------ 1 kelly kelly   35 Jan 14 22:46 hello.sh
Linux中的目录到底是怎么样的文件?

Linux中目录是一张表,每个表项都代表了一个文件,目录中有多少文件,这张表中就有多少表项。每个表项中都包括了两样数据,一是文件名,再就是该文件的inode-number。因此Linux中存取文件的过程就是通过文件名找到对应inode-number,然后找到文件的inode,最后找到文件的数据。

ln [链接指向的文件] [链接名]
创建一个硬链接:文件属性的第二个字段数字的增加,表示文件的硬链接数目增加了 1
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -il /tmp/sample.txt 
1179983 -rw-rw-r-- 1 kelly kelly 0 Jan 26 17:40 /tmp/sample.txt
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ln /tmp/sample.txt  ./sample_hl01
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -il /tmp/sample.txt ./sample_hl01 
1179983 -rw-rw-r-- 2 kelly kelly 0 Jan 26 17:40 ./sample_hl01
1179983 -rw-rw-r-- 2 kelly kelly 0 Jan 26 17:40 /tmp/sample.txt

再创建一个硬链接,文件属性的第二个数字继续增加 1
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ln /tmp/sample.txt ./sample_hl02
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -il /tmp/sample.txt ./sample_hl01 ./sample_hl02
1179983 -rw-rw-r-- 3 kelly kelly 16 Jan 26 17:46 ./sample_hl01
1179983 -rw-rw-r-- 3 kelly kelly 16 Jan 26 17:46 ./sample_hl02
1179983 -rw-rw-r-- 3 kelly kelly 16 Jan 26 17:46 /tmp/sample.txt
注意:

sample.txt、sample_hl01、sample_hl02的inode-number都是1179983,充分说明这三个硬链接本质上都是同一文件,只不过这个文件有多个名字罢了。我们可以通过任意一个硬链接来读,写,执行源文件。

执行其中任意一个硬链接
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ cat ./sample_hl01
hello hardlink!

删除硬链接源文件
可以看到:除了文件属性中的硬链接数目变成了2,仍然能够照常打开,文件属性和文件内容并无异常
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ rm /tmp/sample.txt
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -il
total 10
1189494 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file05
1189496 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file06
1179983 -rw-rw-r-- 2 kelly kelly   16 Jan 26 17:46 sample_hl01
1179983 -rw-rw-r-- 2 kelly kelly   16 Jan 26 17:46 sample_hl02
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ cat ./sample_hl01
hello hardlink!
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ cat ./sample_hl02
hello hardlink!

删除其中一个硬链接
可以看到:除了文件属性中的硬链接数目变成了1,其他一切仍然正常
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ rm ./sample_hl01
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ ls -il
total 7
1189494 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file05
1189496 -rw-rw-r-- 1 kelly kelly    0 Jan 15 15:55 file06
1179983 -rw-rw-r-- 1 kelly kelly   16 Jan 26 17:46 sample_hl02
[kelly@iZbp18hjhpsqpbmjdflxkcZ ~]$ cat ./sample_hl02
hello hardlink!
总结:

我们为sample.txt创建了两个硬链接:sample_hl01和sample_hl02,那么就相当于这个文件在文件系统中有三个文件名。
这三个文件名都指向同一份文件内容,删除了一个文件,只是将某个文件名从系统中移除了,我们仍然可以通过余下的文件名来访问这个文件的数据。
只要文件还存在一个文件名,这个文件就一切正常,仍然可以访问,除非将这三个文件都删除,我们才无法通过文件名找到文件inode,进而访问文件数据,文件这才算正常被删除掉。

硬链接由于文件系统的限制,灵活性不如符号链接,这里提醒大家有两个点:① 强烈不推荐为目录创建硬链接,容易造成目录遍历死循环;② 不能跨硬盘分区创建硬链接,因为在不同的分区中文件的inode-number不再是唯一的了。


文件篇上半部分出完啦~下半部分争取年前出,春节期间的计划(flag)是把Linux的用户篇也出了,希望能做到吧哈哈哈哈。。。

你可能感兴趣的:(Linux-如何成为一个优秀的管家(文件篇①))