Linux 笔记 - 第四章 Linux 文件和目录管理

博客地址:http://www.moonxy.com

1. 绝对路径和相对路径

绝对路径:由根目录 "/" 写起的。如:/usr/local/mysql

相对路径:不是由根目录 "/" 写起的。

几个与文档、目录相关的命令

2. 命令 cd

# cd dir

cd - change directory,命令 cd 是用来变更用户所在工作目录的,其后只能跟目录名,当目录名为空时,会进入到当前用户的家目录下。

# cd /tmp/ 可以不加后面的斜杠,"." 表示当前目录,".." 表示当前目录的上一级目录,"-" 表示上一次的工作目录,cd - 即可返回上一次的工作目录。

# echo $HOME 或 echo ~,可以打印出当前用户的家目录。

3. 命令 alias

可使用 # alias,查看系统所有的别名,可以起别名,后面跟自定义的新名称,例如:# alias sc = 'service sshd restart',可使用分号分隔多个命令,取消别名使用 # unalias sr。

4. 命令 pwd

pwd - print name of current/working directory,用于打印当前所在目录。

5. 命令 mkdir

mkdir - make directories,用户创建目录,如果需要级联创建目录,需要使用 - p 参数。

[root@ryan ~]# mkdir -p linux/test

6. 命令 rmdir

rmdir - remove empty directories,用于删除空目录,需要删除级联的空目录时,添加 - p 参数。

[root@ryan ~]# vi linux/test/aa.txt
[root@ryan ~]# rmdir -p linux/test
rmdir: failed to remove `linux/test': Directory not empty

7. 命令 rm

rm - remove files or directories,删除文件和目录,其中参数 -r 能删除非空目录,-f 表示强制删除,所以一般 -rf 连用。

[root@ryan ~]# rm -rf linux/test/aa.txt

8. 命令 which

which - shows the full path of (shell) commands,用来查找 PATH 环境变量中出现的路径下的可执行文件。

[root@ryan ~]# which ls
alias ls='ls --color=auto'
/bin/ls

# echo $PATH,可以输出 PATH 环境变量中的值。

[root@ryan ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

9. 命令 cp

cp - copy files and directories,复制文件和目录,参数 -r 表示要复制一个目录,-i 会询问是否覆盖已存在的文件,格式为:cp [选项] [来源文件] [目的文件],如将 test 复制成 test1。-p 选项可以保持权限不变,same as --preserve=mode,ownership,timestamps。

[root@ryan linux]# cp -r test test1
[root@ryan linux]# ll
total 8
drwxr-xr-x. 2 root root 4096 Nov 26 02:38 test
drwxr-xr-x. 2 root root 4096 Nov 26 03:16 test1

[root@ryan test]# cp cp1.txt cp2.txt
cp: overwrite `cp2.txt'? y

[root@ryan test]# cp -i cp1.txt cp2.txt
cp: overwrite `cp2.txt'? y

10. 命令 mv

mv - move (rename) files,移动或重命名文件、目录,不用添加相关参数。

几个与文档内容相关的命令

11. 命令 cat

cat - concatenate files and print on the standard output,用于查看一个文件的内容并显示在屏幕上,常用参数有 -n,将行号显示在屏幕上,参数 -A 显示所有的内容,包括特殊字符。

[root@ryan test]# cat -n cp1.txt
1 111
2 222
3 333

目前 RedHat 和 CentOS 发行版中默认安装了多种 Shell,可以使用如下命令来确认系统中可用的 Shell 是什么版本:

[root@ryan test]$ cat /etc/shells

# Bourne again shell

/bin/bash

# C Shell

/bin/csh

# Korn Shell

/bin/ksh

# Bourne Shell

/bin/sh

# tC Shell

/bin/tcsh

# 非登录 Shell

/sbin/nologin

用户可以根据自己的偏好和擅长选择使用 Shell。目前众多的 Linux 系统默认采用 Bash Shell。

12. 命令 tac

tac - concatenate and print files in reverse,将文件内容倒序打印在屏幕上面,但没有参数 -n 和 -A。

[root@ryan test]# tac cp1.txt
333
222
111

13. 命令 more

more - file perusal filter for crt viewing,向下翻页查看,空格或 Ctrl + F 翻页,回车翻行。

14. 命令 less

less - opposite of more,可以上翻,也可以下翻,j(剪下来,向下翻行),k(看上去,向上翻行),空格或 Ctrl + F 向下翻页,回车向下翻行,Ctrl + B 向上翻页,Ctrl + F 向下翻页,Shift + G 翻页到最下,g 翻页到最上。

15. 命令 head

head - output the first part of files,用于默认显示文件的前10行,后面直接跟文件名。-n 选项则可以显示文件的前 n 行,-n 后面有无空格均可以,字母 n 也可以省略,- 后面直接跟数字,即要显示的行数。

[root@ryan test]# head -n 2 cp1.txt
111
222

[root@ryan test]# head -n2 cp1.txt
111
222

[root@ryan test]# head -2 cp1.txt
111
222

16. 命令 tail

tail - output the last part of files,用于默认显示文件的后10行,后面直接跟文件名。-n 选项则可以显示文件的前 n 行,-n 后面有无空格均可以,字母 n 也可以省略,- 后面直接跟数字,即要显示的行数,-f 选项可以动态显示文件的最后10行。

[root@ryan test]# tail -n 2 cp1.txt
222
333

[root@ryan test]# tail -n2 cp1.txt
222
333

[root@ryan test]# tail -2 cp1.txt
222
333

[root@ryan test]# tail -f /var/log/messages

文件的所属主和所属组

一个Linux目录或者文件,都会有一个所属主和所属组,其中所属主(user,简写为 u),所属组(group,简写为 g)以及其他用户(others,简写为 o),在 Linux 中,一个目录的默认权限为 755,而一个文件的默认权限为 644。

[root@ryan test]# ll
total 8
-rw-r--r--. 1 root root 12 Nov 26 02:38 cp1.txt
-rw-r--r--. 1 root root 12 Nov 26 03:26 cp2.txt

第1列第一个属性用来描述文件类型,d 表示该文件为目录,- 表示该文件为普通文件,l 表示该文件为软链接,b 表示该文件为块设备,如磁盘等,c 表示该文件为串行端口设备文件,如键盘、鼠标等,s 表示该文件为套接字文件(socket)。

后面9位,如 rw-r--r-- 每3个为一组,r 代表可读,w 代表可写,x 代表可执行。前3位为所属主(user)的权限,中间3位为所属组(group)的权限,最后3位为其他非本群组用户(others)的权限。

第2列表示 inode 链接数量。即为文件硬链接数或目录子目录数。

如果一个文件不是目录那么这一字段表示,这个文件所具有的硬链接数,即这个文件总共有多少个文件名。

如果是一个目录,则第2字段表示该目录所含子目录的个数。当新建一个空目录后,这个目录的第二字段就是2,表示该目录下有两个子目录。为什么新建的目录下面会有两个子目录呢?

因为每一个目录都有一个指向它本身的子目录"." 和指向它上级目录的子目录"..",这两个默认子目录是隐藏的,用ls -a可以看到。

每次在目录下新建一个子目录,该目录第2字段的值就增1,但是新建一个普通文件该字段值不增加。

total 的意思为 "所列出内容的磁盘占用空间总和值。单位为kbytes"。

第3列表示该文件的所属主。

第4列表示该文件的所属组。

第5列表示该文件的大小,字节为Byte。

第6列、第7列和第8列表示该文件最后一次被修改的时间(mtime),依次为月份,日期以及时间。

第9列表示文件名。

更改文件的权限

17. 命令 chgrp

chgrp - change group ownership,用于更改文件与目录的所属组,-R 级联更改子目录与子文件,格式为 chgrp [-R] [组名] [文件名]。

# chgrp -R testgroup dirb 将 dirb 目录及其下子目录和文件的所属组更改为 testgroup。

18. 命令 chown

chown - change file owner and group,用于更改所属主和所属组,-R 级联更改子目录与子文件,格式为 chown [-R] [账户名] [文件名] 或 chown [-R] [账户名:组名] [文件名]。

# chown user1 test 只更改所属主

# chown :testgroup test 只更改所属组

# chown user1:testgroup test 同时更改所属主和所属组,或者# chown user1.testgroup test

注意:

Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限改变别人的档案拥有者,也没有权限将自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。 只有 root 用户可以更改文件的所有者。只在您是 root 用户或拥有该文件的情况下才可以更改文件的组。如果拥有文件但不是 root 用户,则只可以将组更改为您是其成员的组。

19. 命令 chmod

chmod - change file mode bits,更改文件读写执行权限,Linux 中,r 等于4,w 等于1,x 等于1,- 等于0,-R 级联更改子目录与子文件,-v 显示权限变更的详细信息,格式为 chmod [-R] 文件权限数字 [文件名]

# chmod -R 700 test

# chmod u=rwx,og=rx test/test1,ugo 分别代表 user,group,others,a 代表 all,同时包括三种权限。

# chmod u-x test/test2 表示所属主减去 x 权限。

# chmod u+x test/test2 表示所属主增加 x 权限。

# chmod a+x test/test2 表示给全部用户增加 x 权限,此处的 a 也可以省略,直接写做:chmod +x test/test2,两者等效。

20. 命令 umask

umask 命令用于改变文件的缺省权限,默认值为 0022,目录的预设权限为 777,文件的预设权限为 666,所以减去 umask的值后得到目录的权限为 755,普通文件的权限值为 644。

Linux下搜索文件

21. 命令 which

which - shows the full path of (shell) commands,只能用来查找 PATH 环境变量中出现的路径下的可执行文件。

[root@ryan linux]# which ls
alias ls='ls --color=auto'
/bin/ls

21. 命令 whereis

whereis - locate the binary, source, and manual page files for a command,通过预先生成的一个文件列表库去查找与给出的文件名相关的文件,此命令不常用。

[root@ryan linux]# whereis ls
ls: /bin/ls /usr/share/man/man1/ls.1.gz

22. 命令 locate

locate - find files by name,可使用 # updatedb 命令更新mlocate.db 数据库文件,从而通过此文件列表库来查找到文件的路径,此命令不常用。

23. 命令 find

find - search for files in a directory hierarchy,查找文件或目录,格式为:find [path] [param],其中 -name filename 表示通过名称查找文件,-type filetype 表示通过文件类型查找文件,filetype 包括 f(普通文件)、b(块设备)、c(字符设备)、d(目录)、l(软链接)、s(套接字文件) 等类型。例如: 查找当前目录下文件名为 cp1.txt 的普通文件。

[root@ryan test]# find . -type f -name cp1.txt
./cp1.txt

-atime +n/-n:表示访问或执行时间大于或小于 n 天的文件。atime 全称 Access time,是在读取文件或执行文件时候更改的,假如是 10,不含正负号时,表示 10 天整。

-ctime +n/-n:表示写入、更改 inode 属性时间大于或小于 n 天的文件。ctime 全称 Change time,在写入文件、更改所有者、权限或链接设备时随 inode 的内容更改而更改的。

-mtime +n/-n:表示写入时间大于或小于 n 天的文件,该参数用的最多。mtime 全称 Modified time,是在写入文件时随文件内容的更改而更改的。

当 mtime 更改时,ctime 也会随之更改;但当 ctime 更改时,mtime 却不一定更改,使用 touch 或者 vi 命令之后,这三个时间都会改变。使用 stat 命令可列出一个文件或目录的三个时间。

[root@ryan test]# stat tt.txt
File: 'tt.txt'
Size: 15 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 1046678 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2017-12-02 22:33:16.206991055 +0800
Modify: 2017-12-02 22:33:16.206991055 +0800
Change: 2017-12-02 22:33:16.206991055 +0800

24. 命令 type

type 命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。常见的命令类型有:

alias:别名;

keyword:关键字,Shell保留字;

function:函数,Shell函数;

builtin:内建命令,Shell内建命令;

file:文件,磁盘文件,外部命令;

unfound:没有找到;

如下所示:

[root@ryan shelltest]# type ls
ls is aliased to `ls --color=auto'

[root@ryan shelltest]# type cd
cd is a shell builtin

25. 命令 file

file 命令用来探测给定文件的类型。file命令对文件的检查分为文件系统、魔法幻数检查和语言检查3个过程。

如下所示:

[root@ryan shelltest]# file /etc/passwd
/etc/passwd: ASCII text

[root@ryan shelltest]# file iftest.sh
iftest.sh: Bourne-Again shell script text executable

Linux 系统中,链接文件分为硬链接(Hard Links)和软链接(Symbolic Links)两种,两种链接的本质区别在于 inode,创建格式为 ln [-s] [来源文件] [目的文件],不加 -s 选项时建立的是硬链接,加上 -s 选项创建的是软连接,ln - make links between files。

硬链接(Hard Links):由于硬链接是有着相同 inode 号仅文件名不同的文件,因此硬链接存在以下几点特性:

文件有相同的 inode 及 data block;

只能对已存在的文件进行创建;

不能交叉文件系统进行硬链接的创建;

不能对目录进行创建,只可对文件创建;

删除一个硬链接文件并不影响其他有相同 inode 号的文件,只有当该文件的所有硬链接全部删除之后,其对应的数据块才可被其他数据写入。

[root@ryan test]# ln ttcp.txt ttcpHard
[root@ryan test]# ll -i
total 20
1046633 -rw-r--r--. 1 root root 16 Dec 3 00:29 cp1.txt
1046650 -rw-r--r--. 1 root root 12 Nov 26 03:26 cp2.txt
1046549 -rw-r--r--. 2 root root 15 Dec 3 13:18 ttcpHard
1046549 -rw-r--r--. 2 root root 15 Dec 3 13:18 ttcp.txt
1046678 -rw-r--r--. 1 root root 15 Dec 2 22:33 ttmv.txt

软链接(Symbolic Links):软链接与硬链接不同,若文件用户数据块中存放的内容是另一文件的路径名的指向,则该文件就是软连接,相当于 Windows 系统中的快捷方式。软链接就是一个普通文件,只是数据块内容有点特殊。软链接有着自己的 inode 号以及用户数据块。因此软链接的创建与使用没有类似硬链接的诸多限制:

软链接有自己的文件属性及权限等;

可对不存在的文件或目录创建软链接;

软链接可交叉文件系统;

软链接可对文件或目录创建;

创建软链接时,链接计数 i_nlink 不会增加;

删除软链接并不影响被指向的文件,但若被指向的原文件被删除,则相关软连接被称为死链接(即 dangling link,若被指向路径文件被重新创建,死链接可恢复为正常的软链接)。

[root@ryan test]# ln -s ttmv.txt ttmvSoft
[root@ryan test]# ll -i
total 20
1046633 -rw-r--r--. 1 root root 16 Dec 3 00:29 cp1.txt
1046650 -rw-r--r--. 1 root root 12 Nov 26 03:26 cp2.txt
1046549 -rw-r--r--. 2 root root 15 Dec 3 13:18 ttcpHard
1046549 -rw-r--r--. 2 root root 15 Dec 3 13:18 ttcp.txt
1046679 lrwxrwxrwx. 1 root root 8 Dec 3 13:35 ttmvSoft -> ttmv.txt
1046678 -rw-r--r--. 1 root root 15 Dec 2 22:33 ttmv.txt

综上,软连接比较常用,当遇到深层目录或者大文件时,可以通过创建软链接来重新指向,建议创建链接时来源文件与目的文件都使用绝对路径。

26. 文件和目录权限的区别

对于一个文件而言,某个账户如果有了读权限,则意味着该账户可以查看它;有了写权限,则意味着该账户可以修改它,不使用 -f 选项就可以覆盖或者删除它;有了执行权限意味着该账户可以运行它。

目录的权限含义与文件的稍有不同,一个账户有了目录的读权限时,该账户可以浏览它(如用 ls 命令查看目录中的文件列表);有了写权限时,该账户可以在该目录中增加新文件,可以删除原有的文件(如果文件自身的权限也允许被删除),只有用户对文件所属的目录有 wx 权限,才能进入目录,删掉该文件(无论该文件是什么权限,即使所属主为root);有了执行权限时,该账户可以进入该目录(如用 cd 命令进入目录)。

27. inode 详解

关于 inode

硬盘的最小存储单位叫做 "扇区"(Sector)。每个扇区储存 512 字节(相当于 0.5KB)。操作系统读取磁盘的时候,不会一个个扇区 "挨个读取",而是一次读取多个扇区,即一次读取一个 "块"(block),这种由多个扇区组成的 "块",是文件存取的最小单位。"块" 的大小,最常见的是4KB,即连续八个 sector 组成一个 block。data block 当中存放了文件的真实内容,而文件的元数据信息,被存放到了 inode 当中。data block 和 inode 被文件系统有效地组织到了一起。

当文件系统被创建之后,inode 的数量以及 data block 的数量也被固定下来。我们不能够修改 inode 的数量,也不能够修改 data block 的数量。

当我们创建一个文件的时候,inode 编号将作为该文件的唯一 id,即一个文件在同一时刻仅拥有一个 inode 编号。当我们向一个文件写入内容的时候,数据被存放到了 data block 当中。而该文件的文件名,被存放到了该文件所在的目录文件当中。

对于目录这种 "特殊的文件",可以简单地理解为是一张表,这张表里面存放了隶属于该目录的文件的文件名,以及所匹配的 inode 编号。目录的大小与目录里面文件大小无关,和数量有关。

因此,在linux里面,文件被 "拆分" 到了3个地方,索引存于 inode,文件名存于目录,数据存于 data block。

了解一下文件系统如何存取文件的:

1)根据文件名,通过 Directory 里的对应关系,找到文件对应的 Inode number;

2)再根据 Inode number 读取到文件的 Inode table;

3)再根据 Inode table 中的 Pointer 读取到相应的 Blocks。

这里有一个重要的内容,就是 Directory,他不是我们通常说的目录,而是一个列表,记录了一个文件或目录名称对应的 Inode number。如下图:

inode 包含文件的元信息,具体来说有以下内容:
  * 文件的字节数
  * 文件拥有者的 User ID
  * 文件的 Group ID
  * 文件的读、写、执行权限
  * 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。
  * 链接数,即有多少文件名指向这个inode
  * 文件数据 block 的位置

关于硬链接以及复制

基于上述内容对于目录的描述,可以比较容易解释 Linux里面的另外一个重要的概念:hard link(硬链接)。

对于文件而言,真正的 ID 是 inode 编号,而并非文件名。回忆一下目录文件: 一张含有文件名和 inode 编号的表。在这张表里面,我们暂定用一个如下结构表示一个文件: [directory : (filename, inode_number)],这里以 /etc/passwd 文件举例,假设其 inode 编号为123456,则可以写为:[/etc/ : (passwd, 123456)],假设我们在终端上面键入了如下命令:

[root@CentOS7-front1 ~]# ln /etc/passwd /root/hard_link_passwd 则会在 /root 目录下面出现一个新的文件名,叫做 hard_link_passwd。如果用上述结构表示这个文件,则为[/root/ : (hard_link_passwd, 123456)],因此,这种目录或文件名不同,但是 inode 编号相同的文件,称为硬链接。由于硬链接 inode 编号相同,而且对于同一个 inode 结构体,便会拥有相同的地址映射以及相同的块设备链表。因此,对于用户空间而言,修改 /etc/passwd,就相当于修改了 /root/hard_link_passwd,反之亦然。

同样基于上述内容对于目录的描述,针对 i_device 相同的 mv 操作,仅仅是删除了原目录里面对应的[directory : (filename, inode_number)],并且在目标目录新建了另一个[directory : (filename, inode_number)],由于并没有对于 data block 的任何操作,因此速度很快。

为什么软链接可以指向目录而硬链接不行呢?

根本原因在于软链接实质上是一个文件,而硬链接实质上是一个目录项(dentry)。在 Linux 系统中,每个文件(目录也是文件,软链接也是文件)都对应着一个 inode 结构,其中 inode 数据结构中包含了文件类型(目录,普通文件,符号连接文件等等)的信息,也就是说操作系统在遍历目录时可以判断出符号连接。既然可以判断出符号连接当然就可以采取一些措施来防范进入死循环了,系统在连续遇到8个符号连接后就停止遍历,这就是为什么对目录符号连接不会进入死循环的原因了。而 "硬链接" 本质上是 "目录项" 的同义词。当一个目标第一次被创建,就会为它创建一个目录项,这其实就是硬链接。大多数人常常把 "硬链接" 联想成为一个已有的对象创建一个额外的目录项,但其实是原来的目录项没有任何特殊,所有的硬链接都是平等的,所以 Linux内核没有方法能识别出哪个是 "原文件" 哪个是 "硬链接"。这样对于由于目录硬链接而形成的环就无法进行合适的处理。

其实在 UNIX 操作系统的历史上,对目录创建硬链接曾经是允许的。但人们发现,这样做会出现很多问题,尤其是一些对目录树进行遍历操作的如 fsck、find 等命令无法正确执行。在《Unix高级环境编程》中提到作者 Steven 在自己的系统上做过实验,结果是:创建目录硬链接后,文件系统变得错误百出。因为这样做会破坏文件系统的树形结构,可能会使目录之间出现环。

链接的访问

28. 命令 enable

enable 既可以查看内部命令,同时也可以判断是否为内部命令。

linux的命令可以分为内部命令外部命令

内部命令在系统启动时就调入内存,是常驻内存的,所以执行效率高。

外部命令是系统的软件功能,用户需要时才从硬盘中读入内存。

[root@ryan ~]# enable ls
-bash: enable: ls: not a shell builtin
[root@ryan ~]# enable pwd

附录

可参考:

ls -l 运行结果的各个字段的意义

inode:

https://www.cnblogs.com/adforce/p/3522433.html

https://www.linuxidc.com/Linux/2017-05/143786.htm

http://www.ruanyifeng.com/blog/2011/12/inode.html

posted on 2017-12-07 20:53  沐小悠  阅读(632)  评论(0编辑  收藏  举报