linux文件系统结构
- 显示linux根目录下所有文件,其中
/
为根目录
ls -l /
total 24
lrwxrwxrwx. 1 root root 7 Jun 30 23:11 bin -> usr/bin
dr-xr-xr-x. 5 root root 4096 Jul 11 13:03 boot
drwxr-xr-x. 21 root root 3360 Jul 11 13:23 dev
drwxr-xr-x. 143 root root 8192 Jul 11 13:23 etc
drwxr-xr-x. 3 root root 25 Jun 30 23:19 home
lrwxrwxrwx. 1 root root 7 Jun 30 23:11 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Jun 30 23:11 lib64 -> usr/lib64
drwxr-xr-x. 2 root root 6 Apr 11 2018 media
drwxr-xr-x. 2 root root 6 Apr 11 2018 mnt
drwxr-xr-x. 3 root root 16 Jun 30 23:14 opt
dr-xr-xr-x. 226 root root 0 Jul 11 13:23 proc
dr-xr-x---. 5 root root 184 Jun 30 23:21 root
drwxr-xr-x. 40 root root 1220 Jul 11 13:24 run
lrwxrwxrwx. 1 root root 8 Jun 30 23:11 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Apr 11 2018 srv
dr-xr-xr-x. 13 root root 0 Jul 11 13:23 sys
drwxrwxrwt. 25 root root 4096 Jul 11 13:25 tmp
drwxr-xr-x. 13 root root 155 Jun 30 23:11 usr
drwxr-xr-x. 21 root root 4096 Jun 30 23:21 var
路径表示
- 文件路径,例如在cat文件的完整目录名为
/home/cat
,有两个特殊的工作目录,一个是用户当前工作目录.
,另一个是当前目录的上一层目录..
cd ..
- 绝对路径是指从根目录开始一直写到所需文件为止,例如我要查找
panjianqiao
文件
cd /home/panjianqiao
- 相对路径是指在当前的工作目录下,直接查找所在目录及以下的文件,例如我现在在
panjianqiao
文件夹下,要寻找Desktop
文件
cd Desktop
假如我在Desktop
下要切换到Downloads
,可以有两种办法:
绝对路径
cd /home/panjianqiao/Downloads
相对路径
cd ../Downloads
cd(change directory缩写)命令
Linux 命令按照来源方式,可分为两种,分别是shell内置命令和外部命令。
Shell 内置命令,就是 Shell 自带的命令,这些命令是没有执行文件的。
外部命令就是由程序员单独开发的,是命令,所以会有命令的执行文件。
Linux中的绝大多数命令是外部命令,而 cd 命令是一个典型的 Shell 内置命令,所以 cd 命令没有执行文件所在路径。
cd ~ #回到自己的主目录
cd ~panjianqiao #返回指定用户的主目录(这里为panjianqiao)
cd - #返回上次所在目录
cd . #返回当前所在目录
cd .. #返回父目录
pwd(print working directory)命令
[panjianqiao@localhost ~]$ whoami #用于返回当前登陆用户
panjianqiao
[panjianqiao@localhost ~]$ pwd #显示当前工作路径
/home/panjianqiao
ls(list)命令
[panjianqiao@localhost ~]$ ls -a #返回全部文件,包括隐藏文件
. .bash_profile .dbus .esd_auth Music Templates
.. .bashrc Desktop .ICEauthority Pictures Videos
.bash_history .cache Documents .local .pki
.bash_logout .config Downloads .mozilla Public
[panjianqiao@localhost ~]$ ls -A #返回全部文件,不包括.和..文件
.bash_history .bashrc .dbus Downloads .local Pictures Templates
.bash_logout .cache Desktop .esd_auth .mozilla .pki Videos
.bash_profile .config Documents .ICEauthority Music Public
[panjianqiao@localhost ~]$ ls -l #使用长格式列出文件和目录信息
total 0
drwxr-xr-x. 2 panjianqiao panjianqiao 40 Jul 11 13:17 Desktop
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Documents
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Downloads
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Music
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Pictures
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Public
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Templates
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Videos
mkdir(make directory)命令
- -m 选项用于手动配置所创建目录的权限,而不再使用默认权限。
- -p 选项递归创建所有目录,以创建 /home/test/demo 为例,在默认情况下,你需要一层一层的创建各个目录,而使用 -p 选项,则系统会自动帮你创建 /home、/home/test 以及 /home/test/demo。
[panjianqiao@localhost ~]$ mkdir test
[panjianqiao@localhost ~]$ ls
Desktop Documents Downloads Music Pictures Public Templates test Videos
[panjianqiao@localhost ~]$ mkdir -p ./test2/demo
[panjianqiao@localhost ~]$ ls
Desktop Downloads Pictures Templates test2
Documents Music Public test Videos
[panjianqiao@localhost ~]$ mkdir -p test3/demo
[panjianqiao@localhost ~]$ ls
Desktop Downloads Pictures Templates test2 Videos
Documents Music Public test test3
[panjianqiao@localhost ~]$ mkdir -m 711 test4
[panjianqiao@localhost ~]$ ls
Desktop Downloads Pictures Templates test2 test4
Documents Music Public test test3 Videos
[panjianqiao@localhost ~]$ ls -l
total 0
drwxr-xr-x. 2 panjianqiao panjianqiao 40 Jul 11 13:17 Desktop
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Documents
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Downloads
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Music
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Pictures
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Public
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Templates
drwxrwxr-x. 2 panjianqiao panjianqiao 6 Jul 13 14:18 test
drwxrwxr-x. 3 panjianqiao panjianqiao 18 Jul 13 14:19 test2
drwxrwxr-x. 3 panjianqiao panjianqiao 18 Jul 13 14:20 test3
drwx--x--x. 2 panjianqiao panjianqiao 6 Jul 13 14:25 test4
drwxr-xr-x. 2 panjianqiao panjianqiao 6 Jun 30 23:22 Videos
rmdir(remove empty directory)命令
此命令只能删除空目录(此命令并不常用)
- -p 选项递归删除所有目录
[panjianqiao@localhost ~]$ rmdir test
[panjianqiao@localhost ~]$ ls
Desktop Downloads Pictures Templates test3 Videos
Documents Music Public test2 test4
[panjianqiao@localhost ~]$ rmdir ./test2 #只能删除空目录,这里的test2中还存在demo
rmdir: failed to remove ‘./test2’: Directory not empty
[panjianqiao@localhost ~]$ rmdir ./test2/demo #删除了test2中的demo目录,test2还存在
[panjianqiao@localhost ~]$ ls
Desktop Downloads Pictures Templates test3 Videos
Documents Music Public test2 test4
touch 命令
创建文件以及修改文件参数(当文件不存在会创建文件,文件存在时会修改文件参数)
Linux 系统中,每个文件主要拥有 3 个时间参数(通过 stat 命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间:
- 访问时间(Access Time,简称 atime):只要文件的内容被读取,访问时间就会更新。例如,使用 cat 命令可以查看文件的内容,此时文件的访问时间就会发生改变。
- 数据修改时间(Modify Time,简称 mtime):当文件的内容数据发生改变,此文件的数据修改时间就会跟着相应改变。
- 状态修改时间(Change Time,简称 ctime):当文件的状态发生变化,就会相应改变这个时间。比如说,如果文件的权限或者属性发生改变,此时间就会相应改变。
[panjianqiao@localhost ~]$ touch bols #创建bols文件
[panjianqiao@localhost ~]$ ls
bols Desktop Documents Downloads Music Pictures Public Templates Videos
[panjianqiao@localhost ~]$ ll --time=atime bols #查看文件的访问时间,ll相当于ls -l
-rw-rw-r--. 1 panjianqiao panjianqiao 0 Jul 13 15:03 bols
[panjianqiao@localhost ~]$ touch bols
[panjianqiao@localhost ~]$ ll --time=atime bols #即使bols文件存在,也不会报错,只会修改访问时间
-rw-rw-r--. 1 panjianqiao panjianqiao 0 Jul 13 15:42 bols
[panjianqiao@localhost ~]$ ll --time=ctime bols #查看bols文件的状态修改时间
-rw-rw-r--. 1 panjianqiao panjianqiao 0 Jul 13 15:42 bols
ln 命令
linux文件操作系统主要使用的是ext4文件系统,ext4文件系统会把分区分为两大部分,一部分为inode(节点),另一部分为block(数据块)。
inode默认大小为128Byte,用来记录文件的权限(r,w,x)、文件的所有者和大小、文件的atime、ctime和mtime以及其真正保存文件数据的block编号。每个文件都有一个inode,其中文件名是不包含在inode中的,文件名存在于文件所在目录中的block中。
block用于存放数据,大小可以是1KB、2KB、4KB,默认大小为4KB,如果单个block存放不下数据,则可以使用多个block,其中多个block数据可能是连续的也可能是分散的。
因此,想要读取一个文件首先应该在目录的block中找到该文件的inode,通过inode索引到实际存放数据的block上。
ln命令用于给文件创建链接,根据linux文件系统特点分为硬链接和软链接
- 硬链接:通过给文件的inode信息分配多个文件名
- 软链接:相当于给文件产生快捷方式(类比于windows)
- 无-s:建立硬链接
- -s :建立软链接
- -f:强制建立链接,如果文件存在,则删除文件后再建立链接文件
[panjianqiao@localhost ~]$ touch demo
[panjianqiao@localhost ~]$ ln /home/panjianqiao/demo /tmp #建立硬链接,其中tmp下的文件属于临时文件,若未标识文件名则与原文件名保持一致
[panjianqiao@localhost ~]$ touch demo2
[panjianqiao@localhost ~]$ ln -s /home/panjianqiao/demo2 /tmp #建立软链接。注意!软链接文件路径必须为绝对路径,硬链接文件路径无此要求
[panjianqiao@localhost ~]$ cd /tmp
[panjianqiao@localhost tmp]$ ls #由于篇幅限制,只显示相关信息,链接文件存在于tmp文件夹下
demo
demo2
硬链接
[panjianqiao@localhost tmp]$ ls -i /home/panjianqiao/demo /home/panjianqiao/demo2 #查看两个文件的inode编号
2982387 /home/panjianqiao/demo 2982388 /home/panjianqiao/demo2
[panjianqiao@localhost tmp]$ ls -i /tmp/demo /tmp/demo2 #查看两个链接文件的inode编号
2982387 /tmp/demo 17540877 /tmp/demo2
从上述分析可以看出,硬链接只是文件名字不同,其实两个文件名都可以映射到同一个inode编号上,因此硬链接的特点如下:
- 无论修改原文件demo还是修改硬链接文件demo,另一个文件数据都会改变。
- 无论删除原文件还是链接文件,只要还有一个文件存在就可以被访问。
- 硬链接不会建立新的inode信息,同时也不能垮文件系统建立。
- 硬链接不能链接目录,太过复杂。
软链接(符号链接)
[panjianqiao@localhost tmp]$ ls -il /home/panjianqiao/demo2 /tmp/demo2 #查看文件demo2和软链接文件demo2的长格式文件信息包括inode编号
2982388 -rw-rw-r--. 1 panjianqiao panjianqiao 0 Jul 14 13:28 /home/panjianqiao/demo2
17540877 lrwxrwxrwx. 1 panjianqiao panjianqiao 23 Jul 14 13:28 /tmp/demo2 -> /home/panjianqiao/demo2
软链接可以通过命令显示中的/tmp/demo2 -> /home/panjianqiao/demo2
识别出原文件的位置,软链接的原文件和链接文件的inode编号不一致,说明软链接文件存放的block为当前文件名索引到原文件inode编号信息。与硬链接相比,软链接没有了许多限制,应用的更为广泛。软链接的特点如下:
- 无论是修改原文件还是软链接文件,另一个文件的数据都发生改变
- 删除软链接文件,原文件不受影响,反之若删除原文件则会导致软链接文件找不到原文件。
- 软链接文件会新建inode和block信息,而在block中不存放真正的数据。
- 软链接可以跨文件系统
- 软链接可以链接目录
windows系统下产生快捷方式的原因在于原文件的位置太深,不好操作,新建一个快捷方式在桌面容易操作
cp 命令
此命令可以用于复制文件和目录,同时还可以用于对比两文件的新旧等。
选项:
- -a:相当于-d、-p、-r选项的集合
- -d:如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接
- -i:询问,如果目标文件已经存在,则会询问是否覆盖
- -l:把目标文件建立为源文件的硬链接文件,而不是复制源文件
- -s:把目标文件建立为源文件的软链接文件,而不是复制源文件
- -p:复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间)
- -r:递归复制,用于复制目录
- -u:若目标文件比源文件有差异,则使用该选项可以更新目标文件,此选项可用于对文件的升级和备用
复制文件
[panjianqiao@localhost ~]$ ls
bols demo2 Documents Music Public Videos
demo Desktop Downloads Pictures Templates
[panjianqiao@localhost ~]$ cp bols /tmp/ #复制文件
[panjianqiao@localhost ~]$ cp bols /tmp/clangs #改名复制文件
复制目录
[panjianqiao@localhost ~]$ mkdir test
[panjianqiao@localhost ~]$ cp -r test /tmp/ #复制目录
复制软链接文件
[panjianqiao@localhost ~]$ ls -l /tmp/demo2 #demo2文件为一个软链接文件
lrwxrwxrwx. 1 panjianqiao panjianqiao 23 Jul 14 13:28 /tmp/demo2 -> /home/panjianqiao/demo2
[panjianqiao@localhost ~]$ cp /tmp/demo2 /tmp/demo2_t1 #复制的文件为原文件
[panjianqiao@localhost ~]$ cp -d /tmp/demo2 /tmp/demo2_t2 #复制的文件为软链接文件
[panjianqiao@localhost ~]$ ls -l /tmp/demo2_t1 /tmp/demo2_t2
-rw-rw-r--. 1 panjianqiao panjianqiao 0 Jul 16 19:04 /tmp/demo2_t1
lrwxrwxrwx. 1 panjianqiao panjianqiao 23 Jul 16 19:04 /tmp/demo2_t2 -> /home/panjianqiao/demo2
在复制软链接文件时,需要对在cp
的选项添加-d
,对硬链接无效。
rm(remove)命令
此命令用于删除文件、目录
选项:
- -f:强制删除(force),和 -i 选项相反,使用 -f,系统将不再询问,而是直接删除目标文件或目录。
- -i:和 -f 正好相反,在删除文件或目录之前,系统会给出提示信息,使用 -i 可以有效防止不小心删除有用的文件或目录。
- -r:递归删除,主要用于删除目录,可删除指定目录及包含的所有内容,包括所有的子目录和文件。
[panjianqiao@localhost ~]$ ls
bols demo2 Documents Music Public test
demo Desktop Downloads Pictures Templates Videos
[panjianqiao@localhost ~]$ rm bols
[panjianqiao@localhost ~]$ rm -i demo
rm: remove regular empty file ‘demo’? y
[panjianqiao@localhost ~]$ rm -ir /tmp/test
rm: remove directory ‘/tmp/test’? y
mv(move)命令
此命令可以在不同的目录下移动文件或目录,也可以对文件和目录进行重命名
选项:
- -f:强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖
- -i:交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项)
- -n:如果目标文件已经存在,则不会覆盖移动,而且不询问用户
- -v:显示文件或目录的移动过程
- -u:若目标文件已经存在,但两者相比,源文件更新,则会对目标文件进行升级
移动文件
[panjianqiao@localhost ~]$ touch demo
[panjianqiao@localhost ~]$ mv demo /tmp
[panjianqiao@localhost ~]$ ls /tmp #由于篇幅限制,只显示相关信息
demo
...
移动目录
[panjianqiao@localhost ~]$ mkdir -p ./test/demo
[panjianqiao@localhost ~]$ ls
Desktop Documents Downloads Music Pictures Public Templates test Videos
[panjianqiao@localhost ~]$ mv test /tmp
[panjianqiao@localhost ~]$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
[panjianqiao@localhost ~]$ ls /tmp/test
demo
文件重命名
[panjianqiao@localhost ~]$ mv /tmp/demo /tmp/demo1 #在同一目录下移动文件相当于重命名
[panjianqiao@localhost ~]$ ls tmp
[panjianqiao@localhost ~]$ ls /tmp #由于篇幅限制,只显示相关信息
demo1
...
目录重命名
[panjianqiao@localhost ~]$ mv /tmp/test /tmp/test_change
[panjianqiao@localhost ~]$ ls /tmp #由于篇幅限制,只显示相关信息
...
test_change
...