目录
Linux操作系统中的文件存储结构
Linux系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。

Linux中 磁盘上文件存储的结构是一个多叉树。多叉树中任意一个结点都是一个目录或者普通文件。目录中可以存储其他目录或者其他普通文件。而多叉树中的任意一个叶子节点一定是一个普通文件或者空目录。(其实这个和windows是一样的,只是windows实现了图形化界面)
我们一般通过路径来定位寻找一个文件或者目录,而这样可行的原因是:一个目录结点可以有多个子结点,而任意一个目录或者普通文件结点都只有一个父亲节点。这也是通过路径定位一个文件可行的原因。
路径分为绝对路径和相对路径:
绝对路径:
绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径。
完整的描述文件位置的路径就是绝对路径,以web站点根目录为参考基础的目录路径。绝对路径名的指定是从树型目录结构顶部的根目录开始到某个目录或文件的路径,由一系列连续的目录组成,中间用斜线分隔,直到要指定的目录或文件,路径中的最后一个名称即为要指向的目录或文件。之所以称为绝对,意指当所有网页引用同一个文件时,所使用的路径都是一样的。
相对路径:相对路径是指以当前文件资源所在的目录为参照基础,链接到目标文件资源(或文件夹)的路径。
如上图中 lib的绝对路径是 /usr/lib 而相对路径是需要另一个目录为参照基准的,假设当前所处路径是test.c 那么lib的相对路径就是 ./../../../usr/lib 如果当前路径是bin 则lib相对路径是 ./../lib 相对路径不唯一。
/ 是linux下的路径分隔符,而windows是\(反斜杠). 表示当前路径 .. 表示上级路径 是每个文件中都会存在的隐藏目录。 可以通过ls -a 显示出来。cd .. 就是退回上级路径 cd . 则什么都不发生 .就代表着当前这个路径。
ls指令
List的缩写,意为列表
语法: ls [选项] [目录或文件]
功能: 对于目录,该命令列出该目录下的所有子目录与文件。
常用选项:
-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-i 输出文件的 i 节点的索引信息。 如 ls –ai 指定文件
-l 列出文件的详细信息。
其实常用的也就这几个,剩余的不知道什么时候会用到
其实,ls的功能是显示出后面所跟目录名存储了哪些文件 而如果只输入ls 则默认是对当前的目录执行ls操作。所以会打印出当前路径下的文件。其实就类似于在我的电脑中打开一个文件,然后显示屏上就会显示出包含哪些文件,只是Linux下需要指令才能显示出。当然也可以打印出其他路径下的目录内容
使用举例:

[yzl@VM-4-5-centos ~]$ ll ./../yzl/pack
total 180
-rw-rw-r-- 1 yzl yzl 158907 Jul 14 20:52 file.txt
drwxrwxr-x 3 yzl yzl 4096 Jul 14 09:46 rr
drwxrwxr-x 3 yzl yzl 4096 Jul 14 09:39 t1
-rw-rw-r-- 1 yzl yzl 75 Jul 14 20:55 tmp2.txt
-rw-rw-r-- 1 yzl yzl 9955 Jul 14 20:53 tmp.txt
[yzl@VM-4-5-centos ~]$ ls -l
total 188
-rw-rw-r-- 1 yzl yzl 158906 Jul 15 16:03 file.txt
drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
-rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz
-rw-rw-r-- 1 yzl yzl 0 Jul 15 16:31 text.txt
[yzl@VM-4-5-centos ~]$ ls -la
total 224
drwx------ 5 yzl yzl 4096 Jul 15 16:33 .
drwxr-xr-x. 4 root root 4096 Jul 13 09:30 ..
-rw------- 1 yzl yzl 8115 Jul 15 20:54 .bash_history
-rw-r--r-- 1 yzl yzl 18 Apr 1 2020 .bash_logout
-rw-r--r-- 1 yzl yzl 193 Apr 1 2020 .bash_profile
-rw-r--r-- 1 yzl yzl 231 Apr 1 2020 .bashrc
drwxrwxr-x 3 yzl yzl 4096 Jul 13 09:29 .cache
drwxrwxr-x 3 yzl yzl 4096 Jul 13 09:29 .config
-rw-rw-r-- 1 yzl yzl 158906 Jul 15 16:03 file.txt
drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
-rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz
-rw-rw-r-- 1 yzl yzl 0 Jul 15 16:31 text.txt
[yzl@VM-4-5-centos ~]$ ls -lai
total 224
655773 drwx------ 5 yzl yzl 4096 Jul 15 16:33 .
393721 drwxr-xr-x. 4 root root 4096 Jul 13 09:30 ..
655782 -rw------- 1 yzl yzl 8134 Jul 15 20:54 .bash_history
655775 -rw-r--r-- 1 yzl yzl 18 Apr 1 2020 .bash_logout
655776 -rw-r--r-- 1 yzl yzl 193 Apr 1 2020 .bash_profile
655774 -rw-r--r-- 1 yzl yzl 231 Apr 1 2020 .bashrc
655777 drwxrwxr-x 3 yzl yzl 4096 Jul 13 09:29 .cache
655780 drwxrwxr-x 3 yzl yzl 4096 Jul 13 09:29 .config
658633 -rw-rw-r-- 1 yzl yzl 158906 Jul 15 16:03 file.txt
655779 drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
658632 -rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz
658631 -rw-rw-r-- 1 yzl yzl 0 Jul 15 16:31 text.txt

pwd指令
Print Working Directory 的缩写 显示当前所在工作目录的全路径
语法: pwd
功能:显示用户当前所在的目录
常用选项: 无
![]()
cd指令
Change directory 的缩写 ,改变工作目录
语法: cd 目录名 (要转到哪个路径下)
功能:改变工作目录。将当前工作目录改变到指定的目录下。
其实就是,类似于Windows下的 改变当前所在目录,只是Windows是鼠标点,而Linux需要指令。
举例:
cd .. : 返回上级目录
cd /home/litao/linux/ : 绝对路径
cd ../day02/ : 相对路径
cd ~ :进入用户家目录
cd - :返回最近访问目录,上一个目录。
cd / : 进入根目录

touch指令
语法: touch [选项]... 文件...
功能:touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
如果 文件存在,则修改时间,不存在则创建文件。(创建文件比较常用)
其他的都没用过,touch目前只用来创建一个文件(非目录)
[yzl@VM-4-5-centos ~]$ touch file.txt
[yzl@VM-4-5-centos ~]$ ll
total 32
-rw-rw-r-- 1 yzl yzl 0 Jul 15 21:19 file.txt
drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
-rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz

mkdir指令
make directory 创建目录
语法:mkdir [选项] dirname...
功能:在当前目录下创建一个名为 “dirname”的目录
常用选项: -p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;
[yzl@VM-4-5-centos ~]$ mkdir -p dir/t1/t2/t3 dir2/a1/a2 dir3
[yzl@VM-4-5-centos ~]$ ll
total 44
drwxrwxr-x 3 yzl yzl 4096 Jul 15 21:24 dir
drwxrwxr-x 3 yzl yzl 4096 Jul 15 21:24 dir2
drwxrwxr-x 2 yzl yzl 4096 Jul 15 21:24 dir3
-rw-rw-r-- 1 yzl yzl 0 Jul 15 21:19 file.txt
drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
-rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz

一次可以创建多个目录,每个目录下都可以加子目录,前提是加上-p。也可以往其他相对路径下创建目录。 mkdir ./../sb/newdir
rm指令
Remove 移除,删除
rm命令可以同时删除指定路径下的文件或目录 可以一条指令删除多个
语法:rm [-f-i-r-v][dirName/dir]
适用对象:所有使用者
功能:删除文件或目录
常用选项:
-f 即使文件属性为只读(即写保护),亦直接删除 force
-i 删除前逐一询问确认
-r 删除目录及其下所有文件 recursive
[yzl@VM-4-5-centos ~]$ ll
total 44
drwxrwxr-x 3 yzl yzl 4096 Jul 15 21:24 dir
drwxrwxr-x 3 yzl yzl 4096 Jul 15 21:24 dir2
drwxrwxr-x 2 yzl yzl 4096 Jul 15 21:24 dir3
-rw-rw-r-- 1 yzl yzl 0 Jul 15 21:19 file.txt
drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
-rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz
[yzl@VM-4-5-centos ~]$ rm -rf dir dir2 file.txt
[yzl@VM-4-5-centos ~]$ ll
total 36
drwxrwxr-x 2 yzl yzl 4096 Jul 15 21:24 dir3
drwxrwxr-x 4 yzl yzl 4096 Jul 15 10:20 pack
-rw-rw-r-- 1 yzl yzl 26648 Jul 15 10:39 pack.tgz

注意:rm -r *和rm ./*是删除当前目录下的所有文件。*是通配符。
不要进行 rm -rf / 这样的操作,相当于把所有Linux操作系统中能删除的文件全都删除了。
man指令
Manual(手册,指南)
Linux有很多命令有很多参数,我们不可能全记住,我们可以通过查看联机手册获取帮助。访问Linux手册页的命令是 man
语法: man [选项] 命令
如 man cd
cp指令
语法:cp [选项] 源文件或目录(可多个) 目标文件或目录(一个)
功能: 复制文件或目录
常用选项:
-f 或 --force 强行复制文件或目录, 不论目的文件或目录是否已经存在
-i 或 --interactive 覆盖文件之前先询问用户
-r 递归处理,将指定目录下的文件与子目录一并处理。
-R 或 --recursive递归处理,将指定目录下的文件及子目录一并处理
说明: cp指令用于复制文件或目录,如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录, 则它会把前面指定的所有文件或目录复制到此目录中。若同时指定多个文件或目录,而最后的目的地并非一个已存 在的目录,则会出现错误信息。
而如果只拷贝一个文件,且目的地是一个不存在的目录,则会创建这个目录,并把文件拷贝进去。并且 如果拷贝一个目录,则需要-r 指令,并且如果目的目录不存在,则只会把被拷贝的目录的内容拷贝进去,并不会拷贝最外层目录。而如果目的目录存在,则会把被拷贝目录全部拷贝进去。
(反正就是拷贝的可能性比较多,自己试吧)总之就是用来进行文件/目录(文件夹)拷贝的。
[yzl@VM-4-5-centos pack]$ ll
total 180
-rw-rw-r-- 1 yzl yzl 158907 Jul 14 20:52 file.txt
drwxrwxr-x 2 yzl yzl 4096 Jul 15 23:28 newwww
drwxrwxr-x 3 yzl yzl 4096 Jul 14 09:39 t1
-rw-rw-r-- 1 yzl yzl 75 Jul 14 20:55 tmp2.txt
-rw-rw-r-- 1 yzl yzl 9955 Jul 14 20:53 tmp.txt
[yzl@VM-4-5-centos pack]$ cp file.txt tmp2.txt noexist
cp: target ‘noexist’ is not a directory
[yzl@VM-4-5-centos pack]$ cp file.txt tmp2.txt t1

mv指令
mv命令是move file的缩写,可以用来移动文件或者将文件改名(move (rename) files),是Linux系统下常用的命 令,经常用来备份文件或者目录。
语法: mv [选项] 源文件或目录 目标文件或目录
常用选项:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
介绍:可以一次移动多个文件及目录(文件夹)到目录中,而如果最后一个参数不是目录,则只能用来修改一个文件或者目录的名字(重命名)
cat
concatenate (链接,使连锁)(连锁 cat file1 file2>>file3把文件1和文件2的内容联合起来放到file3中)
语法:cat [选项][文件]
功能: 查看目标文件的内容 (后面学习时配合上管道等会有更高级的用法)
常用选项: -b 对非空输出行编号 -n 对输出的所有行编号 -s 不输出多行空行
介绍: 用来快速打印查看一个存储数据较少的文件(非目录)的数据。(目前)
tac
与cat相反,反向打印文件数据
more指令
快速查阅大型文档,空格向下翻,b向上翻, -n 可以指定一次输出多少行
语法:more [选项][文件]
功能:more命令,功能类似 cat,可以一页一页的查看文件数据
常用选项: -n 指定一次输出多少行 q 退出more
不建议使用more
less指令
同样用于粗略查阅多页文档,数据量比较大的文档。综合来说,less比more更方便,并且可以通过选项在文档中查找某个字符串
linux正统查看文件内容的工具,功能极 其强大。 less 的用法比起 more 更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看 但若使用了 less 时,就可以使用 [pageup][pagedown] 等(space b)按键的功能来往前往后翻看文件,更容易用 来查看一个文件的内容! 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
语法: less [参数] 文件
功能: less与more类似,但使用less可以随意浏览文件,而more仅能向前移动,却不能向后移动,而且less在查看之前 不会加载整个文件。(不太对,其实只是针对pg up pg dn的按键来说,more不可以上下翻,而less可以上下翻)
选项: -i 忽略搜索时的大小写 -N 显示每行的行号 /字符串:向下搜索“字符串”的功能 ?字符串:向上搜索“字符串”的功能 n:重复前一个搜索(与 / 或 ? 有关) N:反向重复前一个搜索(与 / 或 ? 有关) q:quit
head指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的 开头至标准输出中,而 tail 想当然就是看档案的结尾。
语法: head [参数]... [文件]...
功能: head 用来显示档案的开头至标准输出中,(也可以通过重定向,将输出输出到其他文件中)默认head命令打印其相应文件的开头10行。
选项: -n 显示的行数 (打印多少行至标准输出(显示器)中)
tail指令
tail 命令从指定点开始到文档结尾将文件写到标准输出.
使用tail命令的-f选项可以方便的查阅正在改变的日志文件,tail - f filename会把filename里最尾部的内容显示在屏幕上,并且不但刷新,使你看到最新的文件内容. (没用过后面这个功能)
语法: tail[必要参数][选择参数][文件]
功能: 用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项:-f 循环读取 -n 显示行数 (没用过循环读取)
[root@VM-4-5-centos yzl]# ls
h newfile.c no pack pack.tgz ss vector
[root@VM-4-5-centos yzl]# head -5 h
hello bit 0
hello bit 1
hello bit 2
hello bit 3
hello bit 4
[root@VM-4-5-centos yzl]# tail -3 h
hello bit 9998
hello bit 9999
hello bit 10000

输出重定向 / 输入重定向
标准输入:键盘 标准输出:显示器。 也就是当输出一份数据时,默认是输出到标准输出也就是显示器上,或者当有输入需求时,不指定其他输入的话(可以从文件输入),默认是从标准输入:键盘输入。
cat命令:

从中可以看出,输入cat命令后,从标准输入(键盘)输入信息,然后输出到标准输出(显示器)上。
echo命令:
[yzl@VM-4-5-centos ~]$ echo "aaaaaaaa"
aaaaaaaa
[yzl@VM-4-5-centos ~]$ echo "bbbbbb" > noexist.txt
[yzl@VM-4-5-centos ~]$ ls
h newfile.c no noexist.txt pack pack.tgz ss vector
[yzl@VM-4-5-centos ~]$ cat noexist.txt
bbbbbb
[yzl@VM-4-5-centos ~]$ echo "ccccccc" > noexist.txt
[yzl@VM-4-5-centos ~]$ cat noexist.txt
ccccccc
[yzl@VM-4-5-centos ~]$ echo "ddddddd" >> noexist.txt
[yzl@VM-4-5-centos ~]$ cat noexist.txt
ccccccc
ddddddd

可以看出,默认echo命令将文本输出到标准输出:显示器中,而用>执行输出重定向后,顾名思义,也就是改变输出的方向,不再是输出到标准输出,也就是不再是往标准输出中写入数据,而是输出到后方指定文件中,写入到后方文件中。 即输出重定向。
1. 如果目标文件不存在,创建此文件,然后直接访问此文件
2. 访问:
a. > 输出重定向(覆盖式地写入文件)
b. >> 追加重定向(从文件结尾开始,追加式的写入) (如上图
ab 本质上都是往文件中写入数据
此时,反观cat file.txt 指令,效果是打印文件数据到显示屏上。我之前认为这里隐式的使用了输入重定向,但是并没有,其实这就类似于C语言的fopen,然后读取文件,也只是cat的一个基本功能而已。然后输出到标准输出中。也就有了其效果。
输入重定向: 本来是从键盘读取的数据,变成从文件中读取。
cat < noexist.txt > tmp.txt 就是输入重定向和输出重定向的运用,从文件中输入,然后输出到文件中。(Linux下,一切皆文件,键盘,显示器,普通文件在底层都实现为了文件模型,只是他们的读写方式不一样,后期再深入学习) (上方指令也可以省略掉输入重定向,相当于直接在noexist.txt中读取数据而已。少了一步)
管道
管道的概念可以用head tail指令来辅助理解。
比如我们要提取出某文件中的第300到310行的内容。

head -310 src 表示取出src前310行的内容 | 表示管道 表示前方用head处理过的数据,用管道传输,再用tail -11指令处理,表示取出其中的末尾11行。
| 管道,用来传输资源(数据),事实上他是一个管道文件,也就是是一个文件,并不存储在磁盘上,而是内存级的文件。
简单运用


[yzl@VM-4-5-centos test]$ cat src | head -5 | tail -3 > new1.txt
[yzl@VM-4-5-centos test]$ cat new1.txt
hello bit 3
hello bit 4
hello bit 5
[yzl@VM-4-5-centos test]$ cat src | head -5 | tail -3 >> new1.txt
[yzl@VM-4-5-centos test]$ cat -n new1.txt
1 hello bit 3
2 hello bit 4
3 hello bit 5
4 hello bit 3
5 hello bit 4
6 hello bit 5
find
find的功能非常强大,具有多种查询功能,初次学习,我们只需了解功能其中之一即可

find ~ -name xxx 表示在家目录下查找名为xxx的文件
find / -name xxx 表示在系统目录下查找名为xxx的文件
Linux下的指令 和 可执行程序的关系
Windows下的软件其实就是一个可执行程序。而我们在桌面上创建的快捷方式其实就是为了方便在磁盘中查找到对应的可执行程序。
Linux中的各个指令其实也是一个个可执行程序。我们在ls pwd时,都是在Linux下运行了对应的可执行程序。
运行一个可执行程序在操作系统中一般分两步:1. 找到它 2. 运行它
which
which: 在系统路径中,去查找特定的指令所在的路径。
[yzl@VM-4-5-centos ~]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
[yzl@VM-4-5-centos ~]$ which pwd
/usr/bin/pwd
[yzl@VM-4-5-centos ~]$ which cd
/usr/bin/cd

如上可以看到,ls等命令所对应的可执行程序所在的系统路径。

像这样 /usr/bin/ls 就是通过路径的方式运行ls可执行程序
[yzl@VM-4-5-centos ~]$ gcc hello.c
[yzl@VM-4-5-centos ~]$ ls
a.out h hello.c newfile.c no noexist.txt pack pack.tgz ss test tmp.txt vector
[yzl@VM-4-5-centos ~]$ ./a.out
hello Linux
[yzl@VM-4-5-centos ~]$ a.out
-bash: a.out: command not found

如图,编译hello.c后,出现了a.out可执行程序,我们通过指定路径,表示执行此可执行程序。但是如果直接输入a.out命令是不可以的,那为什么我们直接输入ls就可以呢?这里的原因需要后续的学习。
[yzl@VM-4-5-centos ~]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
其中的alias ls='ls --color=auto' 表示ls是ls -color=auto的别名。 alias也是可以给命令起别名的。
如 alias lxq='pwd' 表示给命令pwd起别名lzy 之后输入lzy即表示pwd命令
grep
grep(过滤)是一个用来在文档中搜索包含特定内容的文本行的工具,grep和find一样,都是选项很多的命令。并且grep是一个很强大的通过文本内容按行搜索的工具,这也是为什么不用more less进行文本搜索。
grep有三个常用选项,-n -v -i (ignore)
如: grep -n 'printf' hello.c 表示在hello.c 文件中查找包含printf的行
注意-n的位置必须在grep之后(好像)

-n 表示打印的行搜索结果附带上文本所在文件中的行号。
-v 表示反向过滤 不包含'xxx' 的行
-i 表示忽略搜索时的大小写(默认是大小写敏感的)
grep和管道,输出重定向等的结合
[yzl@VM-4-5-centos ~]$ grep 'hello' hello.txt | head -5 > head5.txt
[yzl@VM-4-5-centos ~]$ cat head5.txt
hello bit 0
hello bit 1
hello bit 2
hello bit 3
hello bit 4
[yzl@VM-4-5-centos ~]$ grep '666' hello.txt | cat | tail -3 | tac > 666.txt
[yzl@VM-4-5-centos ~]$ cat 666.txt
hello bit 9666
hello bit 8666
hello bit 7666
(里面的cat意义不大)
我们可以用行文本过滤工具grep 和管道 重定向 批量组合 达到我们对文件的内容进行过滤并加保存的目的。
xargs

ls本身不会读取,是直接无视输入的。xargs可以把通过管道传输的数据转化为命令行参数交给ls
ls -l -a ls后面的参数 实际上是以main函数参数形式传给main的。
总结:
拷贝cp 移动或者修改文件名mv 删除rm (-rf ) find/which 查找文件/指令
手册查阅指令man
ls mkdir cd touch pwd 都是常规操作。
粗看代码/文本:长文本less(不推荐more) 短文本/代码查阅:cat tac 细看文档/代码:代码编辑器 搜索文本指定行:grep 取出文本首部若干行 / 尾部若干行 head tail 结合管道可以取出数据并加保存(使用重定向)
本文详细介绍了Linux操作系统中的文件存储结构,包括绝对路径和相对路径的概念。讲解了常用的文件管理指令,如ls、pwd、cd、touch、mkdir、rm、man、cp、mv,以及查看文件内容的指令cat、tac、more、less、head和tail。还提到了输出重定向、输入重定向和管道操作,并简单讨论了Linux指令与可执行程序的关系。此外,还介绍了grep命令用于文本搜索以及xargs工具。内容涵盖了文件操作、目录管理和文本处理等多个方面。
3674

被折叠的 条评论
为什么被折叠?



