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

知识前提:

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

根目录下至少应该包括如下12个目录:

⑴ /bin 放置可执行的命令文件

⑵ /boot 放置系统核心和开机所需文件

⑶ /dev 放置系统设备相关文件

⑷ /etc 放置系统主要的配置文件

⑸ /home 放置除跟用户外其他用户的家目录,默认情况下,每个用户都在该目录下有一个自己的私人目录

⑹ /lib 放置系统和程序运行所要调用的库函数文件

⑺ /root 是root用户的家目录

⑻ /sbin 放置根用户才能够执行的命令文件

⑼ /srv 目录放置服务启动之后需要访问的数据,如web服务所需要访问的网页数据,就默认存放在/srv/xxx目录下

⑽ /tmp 程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下

⑾ /opt 第三方软件建议安装目录,也即非本发行版本所提供的软件,建议放置在此目录下

⑿ /media 放置移动设备相关的文件,如光驱,U盘相关数据都放在该目录下

9e05d80e8a78

当使用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 /*(删除根目录下的所有文件,包括隐藏文件)。

math?formula=%5Ccolor%7Bred%7D%7B%E6%96%87%E4%BB%B6%E4%B8%80%E6%97%A6%E5%88%A0%E9%99%A4%EF%BC%8C%E5%88%99%E6%97%A0%E6%B3%95%E6%81%A2%E5%A4%8D%EF%BC%81%7D

二、文件权限

① 显示文件目录列表: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为例。

9e05d80e8a78

文件的详细属性包括了七个字段:

① 文件的类型和权限

② 文件的硬链接数目

③ 文件的拥有者

④ 文件从属的用户组

⑤ 文件的大小,单位是字节

⑥ 文件的时间戳,即文件最近修改的日期和时间

⑦ 文件名

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

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

第①字段补充说明:

-:普通文件

d:目录文件

c:字符设备文件

b:块设备文件

l:符号链接文件

文件拥有者和文件从属的用户组又与Linux的文件访问权限有什么关系呢?

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

9e05d80e8a78

访问权限可以分为四类:

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

9e05d80e8a78

⑥删除符号链接: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的用户篇也出了,希望能做到吧哈哈哈哈。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值