5 文件与目录管理
- 5.1 处理目录的常用命令
- 5.2 Linux 文件内容查看
Linux的目录结构为树状结构,最顶级的目录为根目录
/
其他目录可以通过挂载将添加到树中,通过解除挂载可以移除
绝对路径:由根目录
/
写起,如/usr/share/doc
相对路径:不是由
/
写起,是相对于当前路径的写法,如由/usr/share/doc
要到/usr/share/man
底下时,可以写成cd ../man
5.1 处理目录的常用命令
- 可以使用
man 命令
来查看各个命令的使用文档,如man cp
命令 | 功能 |
---|---|
ls | 列出目录 |
cd | 切换目录 |
pwd | 显示目前的目录 |
mkdir | 创建一个新的目录 |
rmdir | 删除一个空的目录 |
cp | 复制文件或目录 |
rm | 移除文件或目录 |
mv | 移动文件与目录,或修改文件与目录的名称 |
5.1.1 ls 列出目录
- 语法
ls [-aAdfFhilnrRSt] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
- 选项与参数
选项 | 功能 |
---|---|
-a | 显示全部文件,包括隐藏文件(开头为 . 的文件),是最常用的选项之一 |
-A | 显示全部文件,连同隐藏文件,但不包括 . 与 .. |
-d | 仅列出目录本身,不列出目录内的文件数据 |
-f | ls 默认会以文件名排序,使用 -f 会直接列出结果,不进行排序 |
-F | 在文件或目录名后加上文件类型的指示符号,例如,* 代表可运行文件,/ 代表目录,= 代表 socket 文件, |
-h | 以易读的方式显示文件或目录大小,如 1KB、234MB、2GB 等 |
-i | 显示 inode 节点信息 |
-l | 使用长格式列出文件和目录信息,包含文件的属性与权限等数据 |
-n | 以 UID 和 GID 分别代替文件用户名和群组名显示 |
-r | 将排序结果反向输出,比如若原本文件名由小到大,反向则为由大到小 |
-R | 连同子目录内容一起列出来,等于将该目录下的所有文件都显示出来 |
-S | 以文件容量大小排序 |
-t | 以时间排序 |
–color=never | 不依据文件特性给予颜色显示 |
–color=always | 表示显示颜色,ls 默认采用这种方式 |
–color=auto | 表示让系统自行依据配置来判断是否给予颜色 |
–full-time | 以完整时间模式(包含年、月、日、时、分)输出 |
–time={atime,ctime} | 输出访问时间或改变权限属性时间(ctime),而不是内容变更时间 |
# 将主目录下的所有文件列出来(含属性与隐藏文件)
ls -al ~
5.1.2 cd 切换目录
- cd(Change Directory):用来变换工作目录
语法
cd [相对路径或绝对路径]
# 回到自己的主目录,对于 root 用户,其主目录为 /root [root@localhost vbird]# cd ~ # 没有加上任何路径,代表回到当前登录用户的主目录 [root@localhost ~]# cd # 切换到 vbird 这个用户的主目录,即 /home/vbird [root@localhost ~]# cd ~vbird # 切换到目前的上一级目录,即 /root 的上一级目录 # 需要注意,在 Linux 系统中,根目录存在 .(当前目录)以及 ..(当前目录的父目录)两个目录 # 但由于根目录是最顶级目录,因此根目录的 .. 和 . 属性和权限完全一致,即根目录的父目录是自身 [root@localhost ~]# cd .. # 回到上次所在目录 [root@localhost /]# cd -
5.1.3 pwd 显示当前目录
- pwd(Print Working Directory):显示当前所在目录(链接路径)
- 语法
pwd [-P]
选项与参数
-P :显示出实际路径,而非使用链接(link)路径
# 确定当前登陆的用户 [root@www ~]# whoami root # 显示出目录 [root@www ~]# pwd /root # /var/mail是一个链接文件 [root@www ~]# cd /var/mail # 列出目前的工作目录 [root@www mail]# pwd /var/mail [root@www mail]# pwd -P # /var/spool/mail [root@www mail]# ls -ld /var/mail lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail # /var/mail 链接到 /var/spool/mail # 加上 -P 选项后,会不以链接文件的数据显示,而是显示正确的完整路径
5.1.4 mkdir 创建新目录
- 语法
mkdir [-mp] 目录名称
选项与参数
- -m:配置文件的权限,直接配置,不需要看默认权限(umask)
-p:直接递归创建目录(包含上一级目录)
[root@www ~]# cd /tmp # 创建一名为 test 的新目录 [root@www tmp]# mkdir test # 没办法直接创建此目录 [root@www tmp]# mkdir test1/test2/test3/test4 # mkdir: cannot create directory `test1/test2/test3/test4': # No such file or directory # 加 -p 选项可以自行创建多层目录 [root@www tmp]# mkdir -p test1/test2/test3/test4 # 如果没有加上 -m 来强制配置属性,系统会使用默认属性。 [root@www tmp]# mkdir -m 711 test2 [root@www tmp]# ls -l drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2
5.1.5 rmdir 删除空的目录
- 语法
rmdir [-p] 目录名称
选项与参数
-p:递归删除空目录
#删除 runoob 目录 [root@www tmp]# rmdir runoob/ # 将 mkdir 实例中创建的目录(/tmp 底下)删除掉 [root@www tmp]# ls -l drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 [root@www tmp]# rmdir test # 因为尚有内容,所以无法删除 [root@www tmp]# rmdir test1 # rmdir: `test1': Directory not empty # 利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除 [root@www tmp]# rmdir -p test1/test2/test3/test4 [root@www tmp]# ls -l <==您看看,底下的输出中test与test1不见了! drwx--x--x 2 root root 4096 Jul 18 12:54 test2
要注意 rmdir 仅能删除空的目录,可以使用 rm 命令来删除非空目录
5.1.6 cp 复制文件或目录
- 语法
cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [options] source1 source2 source3 .... directory
选项与参数
- -a:等同于 -pdr
- -d:若源文件为链接文件(link file),则复制链接文件属性而非文件本身
- -f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次
- -i:若目标文件(destination)已经存在,在覆盖时会先询问动作
- -l:进行硬式连结(hard link)的链接文件创建,而非复制文件本身
- -p:连同文件的属性(所有者、所属组和时间等)一起复制,而非使用默认属性(备份常用)
- -r:递归复制,用于复制目录
- -s:复制成为符号链接文件(symbolic link)
-u:destination 比 source 旧才更新(update) destination
# 用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc [root@www ~]# cp ~/.bashrc /tmp/bashrc [root@www ~]# cp -i ~/.bashrc /tmp/bashrc # cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖
5.1.7 rm 移除文件或目录
- 语法
rm [-fir] 文件或目录
选项与参数
- -f:force,忽略不存在的文件,不会出现警告信息
- -i:互动模式,在删除前会询问使用者是否动作
-r:递归删除
# 删除创建的 bashrc [root@www tmp]# rm -i bashrc # rm: remove regular file `bashrc'? y # 如果加上 -i 就会主动询问
5.1.8 mv 移动文件与目录,或修改名称
- 语法
mv [-finuv] source destination
mv [options] source1 source2 source3 .... directory
选项与参数
- -f:force 强制,如果目标文件已经存在,不会询问而直接覆盖
- -i:若目标文件 (destination) 已经存在,就会询问是否覆盖,默认选项
- -n:若目标文件已经存在,则不会覆盖移动,且不会询问用户
- -u:若目标文件已经存在,且 source 比较新,才会更新(update)
-v:显示文件或目录的移动过程
# 复制一文件,创建一目录,将文件移动到目录中 [root@www ~]# cd /tmp [root@www tmp]# cp ~/.bashrc bashrc [root@www tmp]# mkdir mvtest [root@www tmp]# mv bashrc mvtest # 将刚刚的目录名称更名为 mvtest2 [root@www tmp]# mv mvtest mvtest2
5.1.9 touch 创建文件及修改文件时间戳
- 语法
touch [options] 文件名
- 选项与参数
- -a:只修改文件的访问时间
- -c:仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件
- -d:后面可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间
- -m:只修改文件的数据修改时间
- -t:命令后面可以跟欲修订的时间,而不用目前的时间,时间书写格式为
YYMMDDhhmm
touch 命令可以只修改文件的 atime,也可以只修改文件的数据 mtime,但是不能只修改文件的 ctime。因为,不论是修改访问时间,还是修改文件的数据时间,对文件来讲,状态都会发生改变,即 ctime 会随之改变(更新为操作当前文件的真正时间)
# 建立名为 bols 的空文件 [root@www ~]# touch bols # 查看文件的访问时间 [root@www ~]# ll --time=atime bols # 文件上次的访问时间为 9 月 25 号 21:23 -rw-r--r-- 1 root root 0 Sep 25 21:23 bols [root@localhost ~]# touch bols [root@localhost ~]# ll --time=atime bols -rw-r--r-- 1 root root 0 May 15 16:36 bols # 而如果文件已经存在,则也不会报错,只是会修改文件的访问时间 # 修改 bols 文件的 atime 和 mtime [root@localhost ~]# touch -d "2017-05-04 15:44" bols [root@localhost ~]# ll bols; ll --time=atime bols; ll --time=ctime bols -rw-r--r-- 1 root root 0 May 4 2017 bols -rw-r--r-- 1 root root 0 May 4 2017 bols -rw-r--r-- 1 root root 0 Sep 25 21:40 bols # ctime 不会变为设定时间,但更新为当前服务器的时间
5.1.10 ln 在文件之间建立链接(硬链接和软链接)
- Linux 系统中,每个文件主要拥有 3 个时间参数(通过 stat 命令进行查看),分别是文件的访问时间、数据修改时间以及状态修改时间
- 访问时间(Access Time, atime):只要文件的内容被读取,访问时间就会更新。例如,使用 cat 命令可以查看文件的内容,此时文件的访问时间就会发生改变
- 数据修改时间(Modify Time, mtime):当文件的内容数据发生改变,此文件的数据修改时间就会跟着相应改变
- 状态修改时间(Change Time, ctime):当文件的状态发生变化,就会相应改变这个时间。比如,如果文件的权限或者属性发生改变,此时间就会相应改变
- 语法
touch [options] 文件名
- 选项与参数
- -a:只修改文件的访问时间
- -c:仅修改文件的时间参数(3 个时间参数都改变),如果文件不存在,则不建立新文件
- -d:后面可以跟欲修订的日期,而不用当前的日期,即把文件的 atime 和 mtime 时间改为指定的时间
- -m:只修改文件的数据修改时间
- -t:命令后面可以跟欲修订的时间,而不用目前的时间,时间书写格式为
YYMMDDhhmm
touch 命令可以只修改文件的 atime,也可以只修改文件的数据 mtime,但是不能只修改文件的 ctime。因为,不论是修改访问时间,还是修改文件的数据时间,对文件来讲,状态都会发生改变,即 ctime 会随之改变(更新为操作当前文件的真正时间)
# 建立名为 bols 的空文件 [root@www ~]# touch bols # 查看文件的访问时间 [root@www ~]# ll --time=atime bols # 文件上次的访问时间为 9 月 25 号 21:23 -rw-r--r-- 1 root root 0 Sep 25 21:23 bols [root@localhost ~]# touch bols [root@localhost ~]# ll --time=atime bols -rw-r--r-- 1 root root 0 May 15 16:36 bols # 而如果文件已经存在,则也不会报错,只是会修改文件的访问时间 # 修改 bols 文件的 atime 和 mtime [root@localhost ~]# touch -d "2017-05-04 15:44" bols [root@localhost ~]# ll bols; ll --time=atime bols; ll --time=ctime bols -rw-r--r-- 1 root root 0 May 4 2017 bols -rw-r--r-- 1 root root 0 May 4 2017 bols -rw-r--r-- 1 root root 0 Sep 25 21:40 bols # ctime 不会变为设定时间,但更新为当前服务器的时间
5.2 Linux 文件内容查看
- 可以使用
man 命令
来查看各个命令的使用文档,如man cp
命令 | 功能 |
---|---|
cat | 由第一行开始显示文件内容 |
tac | 从最后一行开始显示,可以看出 tac 是倒著写 cat |
nl | 显示的时候,输出行号 |
more | 一页一页的显示文件内容 |
less | 与 more 类似,但是比 more 更好的是,可以往前翻页 |
head | 只看头几行 |
tail | 只看尾几行 |
5.2.1 cat 由第一行开始显示文件内容
- 语法
cat [-AbEnTv]
选项与参数
- -A:等同于 -vET,可列出一些特殊字符而不是空白
- -b:列出行号,仅针对非空白行做行号显示,空白行不标行号
- -E:将结尾的断行字节 $ 显示出来
- -n:列印出行号,连同空白行也会有行号,与 -b 的选项不同
- -T:将 [tab] 按键以 ^I 显示出来
-v:列出一些看不出来的特殊字符
# 查看 /etc/issue 文件内容 [root@www ~]# cat /etc/issue CentOS release 6.4 (Final) Kernel \r on an \m
5.2.2 tac
tac 与 cat 命令相反,文件内容从最后一行开始显示,可以看出 tac 是 cat 倒着写
[root@www ~]# tac /etc/issue Kernel \r on an \m CentOS release 6.4 (Final)
5.2.3 nl 显示行号
- 语法
nl [-bnw] 文件
选项与参数
- -b:指定行号显示的方式,主要有两种
- -b a:不论是否为空行,也同样列出行号(类似 cat -n)
- -b t:如果有空行,空的那一行不要列出行号(默认值)
- -n:列出行号表示的方法,主要有三种
- -n ln:行号在荧幕的最左方显示
- -n rn:行号在自己栏位的最右方显示,且不加 0
- -n rz :行号在自己栏位的最右方显示,且加 0
-w :行号栏位的占用的位数
# 用 nl 列出 /etc/issue 的内容 [root@www ~]# nl /etc/issue 1 CentOS release 6.4 (Final) 2 Kernel \r on an \m
5.2.4 more 一页一页翻动
[root@www ~]# more /etc/man_db.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
--More--(28%)
# 光标在这一行等待命令
- 在 more 程序的运行过程中,有几个按键可以按
- 空白键(space):代表向下翻一页
- Enter:代表向下翻一行
- /字串:代表在这个显示的内容当中,向下搜寻”字串”关键字
- :f:立刻显示出文件名以及目前显示的行数
- q:代表立刻离开 more,不再显示该文件内容
- b 或 [ctrl]-b:代表往回翻页,不过这动作只对文件有用,对管线无用
5.2.5 less 一页一页翻动
,以下实例输出/etc/man.config文件的内容:
[root@www ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
# : 这里可以等待输入命令
- less 运行时可以输入的命令
- 空白键:向下翻动一页
- [pagedown]:向下翻动一页
- [pageup]:向上翻动一页
- /字串:向下搜寻”字串”的功能
- ?字串:向上搜寻”字串”的功能
- n:重复前一个搜寻(与 / 或 ? 有关)
- N:反向的重复前一个搜寻(与 / 或 ? 有关)
- q:离开 less 程序
5.2.6 head 取出文件前面几行
- 语法
head [-n number] 文件
选项与参数
-n:后面接数字,代表显示几行
[root@www ~]# head /etc/man.config # 默认的情况中,显示前面 10 行 # 若要显示前 20 行,就得 [root@www ~]# head -n 20 /etc/man.config
5.2.7 tail 取出文件后面几行
- 语法
tail [-n number] 文件
选项与参数
- -n:后面接数字,代表显示几行
-f:表示持续侦测后面所接的文件名,要等到按下 [ctrl]-c 才会结束 tail
[root@www ~]# tail /etc/man.config # 默认的情况中,显示最后 10 行 # 若要显示最后的 20 行,就得 [root@www ~]# tail -n 20 /etc/man.config
5.3 Linux 链接
- Linux 链接分两种:硬链接(Hard Link)和符号链接(Symbolic Link)
- 默认情况下,ln 命令产生硬链接
5.3.1 硬链接
- 硬链接指通过索引节点进行链接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)
- 在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问
- 硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要文件,以防止“误删”的功能
- 其原因如上所述,因为对应该目录的索引节点有一个以上的链接。只删除一个链接并不影响索引节点本身和其它的链接,只有当最后一个链接被删除后,文件的数据块及目录链接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬链接文件均被删除
- 修改源文件和硬链接文件都会改变另一个文件的数据。硬链接不会建立新的 inode 信息,也不会更改 inode 的总数
5.3.2 软链接
- 符号链接(Symbolic Link),也叫软链接。软链接文件类似于 Windows 的快捷方式。它实际上是一个特殊的文件,用于指向另一个文件。此链接方式也适用于目录
- 在符号链接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接
5.3.3 inode 属性
- Linux 目前使用 ext4 文件系统:分区分为两大部分(不考虑超级块),小部分用于保存文件的 inode 信息;剩余大部分用于保存 block 信息
- iNode 默认大小是 128 Byte,用于记录文件的权限、所有者和属组、大小、ctime、atime、mtime、文件数据的 block 编号,每个文件一个 inode
- block 默认大小是 4KB。用于实际的数据存储,一个 block 只属于一个文件,可能未占满。一个文件占用的 block 也可以是不连续的
- 总之,每个文件一个 inode,文件内容由 inode 的记录指向。目录的 block 记录该目录下所有一级子文件和子目录的文件名及对应的 inode。需要根据文件名找到对应的 inode,再找到文件内容所在的 block 块
- Linux 操作系统的文件数据除了文件实际内容外,通常含有非常多的属性,如 Linux 操作系统的文件权限(rwx)与文件属性(拥有者、群组、时间参数等)
- 文件系统通常会将这两部分的数据分别存放在不同的区块,权限与属性存放在 inode 中,至于实际数据则放置到 data block 区块中
- inode:记录文件的属性,一个文件占用一个 inode,同时记录此文件的数据所在的 block
- 还有一个超级区块(superblock)会记录整个文件系统的整体信息,包括 inode 与 block 的总量、使用量、剩余量等
在 Linux 中,可以使用 stat 命令查看某个文件的 inode 信息,包括文件大小、占用的 block 数量、block 大小、文件类型(普通文件或其他)、inode 节点号、链接数、权限、所有者、所属组、访问时间、数据修改时间、状态修改时间
stat /etc/passwd linux-peanut:~/Desktop # stat /etc/passwd File: '/etc/passwd' Size: 2269 Blocks: 8 IO Block: 4096 regular file Device: 802h/2050d Inode: 1149740 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) Access: 2018-04-09 17:16:42.000000000 +0800 Modify: 2018-04-09 17:16:36.000000000 +0800 Change: 2018-04-09 17:16:36.000000000 +0800 Birth: -
5.3.4 ln 命令
- 语法
ln [选项] 源文件 目标文件
选项与参数
- -s:建立软链接文件。如果不加 “-s” 选项,则建立硬链接文件
- -f:强制。如果目标文件已经存在,则删除目标文件后再建立链接文件
- 目标文件可以只写路径没有写文件名,会和原名一致
软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错
No such file or directory
# 创建一个测试文件f1 [oracle@Linux]$ touch f1 # 创建f1的一个硬链接文件f2 [oracle@Linux]$ ln f1 f2 # 创建f1的一个符号链接文件f3 [oracle@Linux]$ ln -s f1 f3 # -i参数显示文件的inode节点信息 [oracle@Linux]$ ls -li total 0 9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f1 9797648 -rw-r--r-- 2 oracle oinstall 0 Apr 21 08:11 f2 9797649 lrwxrwxrwx 1 oracle oinstall 2 Apr 21 08:11 f3 -> f1 # 硬链接文件 f2 与原文件 f1 的 inode 节点相同,均为 9797648,符号链接文件的 inode 节点不同 [oracle@Linux]$ echo "I am f1 file" >>f1 [oracle@Linux]$ cat f1 I am f1 file [oracle@Linux]$ cat f2 I am f1 file [oracle@Linux]$ cat f3 I am f1 file [oracle@Linux]$ rm -f f1 [oracle@Linux]$ cat f2 I am f1 file [oracle@Linux]$ cat f3 cat: f3: No such file or directory # 当删除原始文件 f1 后,硬链接 f2 不受影响,但是符号链接 f1 文件无效
删除符号链接 f3,对 f1 f2 无影响
删除硬链接 f2,对 f1 f3 也无影响
删除原文件 f1,对硬链接 f2 没有影响,导致符号链接 f3 失效
同时删除原文件 f1 和 硬链接 f2,整个文件会真正的被删除