4.1 与文件和目录相关的命令

在Linux中,存在着绝对路径和相对路径。

  • 绝对路径:路径的写法一定是由根目录/写起的,例如 /usr/local/mysql。
  • 相对路径:路径的写法不是由根目录/写起的。例如,首先用户进入到/home,然后再进入到test ,执行的命令为
    1. # cd /home
    2. # cd test

4.1.1 命令ls

命令ls(list的简写)是列出目录内容。我们做实验用的是root账户,所以运行命令ls后,会列出root账户的根目录/root下的内容。

# ls
anaconda-ks.cfg  mi.sql

# ls /
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# ls /root
anaconda-ks.cfg  mi.sql

ls命令还设置了其它一些选项:

  • -l选项,表示显示更加详细的列表;
  • -h选项,展示友好信息(比如:文件大小带单位);
  • -a选项,查询所有文件与文件夹,包括隐藏文件(所用带 . 的文件都是隐藏文件); ```

    ls -l

    总用量 16 -rw———-. 1 root root 1257 9月 6 18:21 anaconda-ks.cfg -rw-r—r—. 1 root root 11492 8月 25 08:23 mi.sql

ls -lh

总用量 16K -rw———-. 1 root root 1.3K 9月 6 18:21 anaconda-ks.cfg -rw-r—r—. 1 root root 12K 8月 25 08:23 mi.sql

ls -lha

总用量 44K dr-xr-x—-. 2 root root 165 9月 8 15:35 . dr-xr-xr-x. 17 root root 224 9月 8 09:48 .. -rw———-. 1 root root 1.3K 9月 6 18:21 anaconda-ks.cfg -rw———-. 1 root root 161 9月 6 11:44 .bash_history -rw-r—r—. 1 root root 18 12月 29 2013 .bash_logout -rw-r—r—. 1 root root 176 12月 29 2013 .bash_profile -rw-r—r—. 1 root root 176 12月 29 2013 .bashrc -rw-r—r—. 1 root root 100 12月 29 2013 .cshrc -rw———-. 1 root root 35 9月 8 15:35 .lesshst -rw-r—r—. 1 root root 12K 8月 25 08:23 mi.sql -rw-r—r—. 1 root root 129 12月 29 2013 .tcshrc

> 上面显示内容中:
> - d 开头的表示这是一个文件夹。
> - -开头的表示这是一个文件。
> -  l 开头的表示这是一个链接。

`ls`命令可以简写:ls -l 简写为 ll;   ls -h -l 简写为 ll –h

ll

总用量 16 -rw———-. 1 root root 1257 9月 6 18:21 anaconda-ks.cfg -rw-r—r—. 1 root root 11492 8月 25 08:23 mi.sql

ll -h

总用量 16K -rw———-. 1 root root 1.3K 9月 6 18:21 anaconda-ks.cfg -rw-r—r—. 1 root root 12K 8月 25 08:23 mi.sql


<a name="LSZKo"></a>
### 4.1.2 命令`pwd`
命令`pwd`(print working directory)显示当前目录(返回绝对路径)。

pwd

/root


<a name="cus6g"></a>
### 4.1.3 命令`cd`
命令`cd`(change directory的简写)是用来变更用户所在目录的,如果后面什么都不跟,就会直接进入当前用户的根目录下。我们做实验用的是root账户,所以运行命令`cd`后,会进入root账户的根目录/root下。如果后面跟目录名,则会直接切换到指定目录下。示例命令如下:

cd /tmp

pwd

/tmp

cd

pwd

/root


在Linux文件系统中,有两个特殊的符号也可以表示目录。“.”表示当前目录,“..”表示当前目录的上一级目录,示例命令如下:

cd /usr/local/lib/

pwd

/usr/local/lib

cd .

pwd

/usr/local/lib

cd ..

pwd

/usr/local


<a name="6GJMr"></a>
### 4.1.4 命令`mkdir`
命令`mkdir`(make directory的简写)用于创建目录,在Linux中,如果它发现要创建的目录的上一级目录不存在,就会报错。为了解决这个问题,Linux设置了`-p`选项,这个选项可以帮我们创建一大串级联目录,不会报错。

mkdir /tmp/test/123

mkdir: 无法创建目录 ‘/tmp/test/123’: 没有那个文件或目录

mkdir -p /tmp/test/123

ls /tmp/test

123


<a name="ZvYLE"></a>
### 4.1.5 命令`rmdir`
命令`rmdir`(remove directory的简写)用于删除空目录,后面可以是一个目录,也可以是多个目录(用空格分隔)。该命令只能删除目录,不能删除文件,所以一般不用它,而改用命令`rm`(remove的简写),这个命令既可以删除目录,又可以删除文件,将在下一节中介绍。`rmdir`有和`mkdir`具有相同的选项`-p`,它同样可以级联删除一大串目录,但在级联的目录中,如果某一个目录里还有目录或者文件时,这个命令就不好用了。

ls /tmp/test

123

rmdir /tmp/test/

rmdir: 删除 ‘/tmp/test/‘ 失败: 目录非空

rmdir /tmp/test/123

ls /tmp/test

#


<a name="CBwOM"></a>
### 4.1.6 命令`rm`
命令`rm`是最常用的,用于删除文件或目录。它也有很多选项。你可以通过命令`man rm`来获得它的详细帮助信息。这里学习最常用的两个选项。

- `**-r**`:删除目录用的选项,类似于`rmdir`,但可以删除非空目录。下面先创建一连串的目录,然后尝试删除它们。示例命令如下:

mkdir -p /tmp/test/123

rm -r /tmp/test/123

rm:是否删除目录 ‘/tmp/test/123’? y

和rmdir不同的是,使用rm –r命令删除目录时,会询问是否删除,如果输入“y”则会删除,如果输入“n”则不删除。另外,`rm –r`命令能删除非空目录。

- `**-f**`:表示强制删除。它不再询问是否删除,而是直接删除。如果后面跟一个不存在的文件或者目录,则不会报错。下面来尝试删除一个不存在的目录,示例命令如下:

rm /tmp/test/123/123

rm: 无法删除 ‘/tmp/test/123/123’: 没有那个文件或目录

rm -f /tmp/test/123/123

但如果要删除一个存在的目录时,即使加上`-f`选项也会报错。所以,使用命令`rm`删除目录时,一定要加`-r`选项。

rm -f /tmp/test/123

rm: 无法删除 ‘/tmp/test/123’: 是一个目录

rm -rf /tmp/test/123


<a name="360Ga"></a>
### 4.1.7 命令`cp`
`cp`是copy(即复制)的简写,该命令的格式为:`cp [选项] [ 来源文件 ] [目的文件]`。例如,我想把test1复制成test2,可以写为`cp test1 test2`。下面介绍命令`cp`的几个常用选项。

- `**-r**`:如果要复制一个目录,必须加`-r`选项,否则不能复制,这类似于`rm`命令。示例命令如下:

mkdir 123

cp 123 456

cp: 略过目录”123”

cp -r 123 456

ls –ld 123 456

drwxr-xr-x 2 root root 6 2月 18 09:49 123 drwxr-xr-x 2 root root 6 2月 18 09:51 456


- `**-i**`:这是安全选项,如果遇到一个已存在的文件,会询问是否覆盖.

<a name="uOgma"></a>
### 4.1.8 命令`mv`
`mv`是move的简写,该命令的格式为:`mv [ 选项 ] [源文件或目录] [目标文件或目录]`。该命令有如下2种情况。

- 目标文件是目录
- 目标文件是文件

(1)当目标文件是目录时,其存在与否,执行后的结果是不一样的。如果如果该目录不存在,则会把源目录重命名为给定的目标文件名。如果该目录存在,则会把源文件或目录移动到该目录中。

下例中,目标文件是目录dirc,且dirc不存在,相当于把目录dira重命名为dirc。

mkdir /tmp/test_mv

cd /tmp/test_mv

mkdir dira dirb

ls

dira dirb

mv dira dirc

ls

dirb dirc


下例中,目标文件是目录dirb,且dirb存在,则会把目录dirc移动到目录dirb里:

mv dirc dirb

ls

dirb

ls dirb

dirc



(2)当目标文件是文件时,其存在与否,执行后的结果也是不一样的。如果该文件不存在,则会把源文件重命名为给定的目标文件名。如果该文件存在,则会询问是否覆盖。

下例中,`mv filed filee`的目标文件是文件filee且这个文件不存在,相当于把文件filed重命名为filee。

touch filed

ls

dirb filed

mv filed filee

ls

dirb filee


下例中,`mv filed filee`的目标文件是文件field2且这个文件存在,相当于覆盖field2。

touch filed1 field2

ls

filed1 filed2

mv filed1 filed2

ls

filed2


<a name="DNUxU"></a>
### 4.1.9 环境变量`PATH`
在讲环境变量之前,需要先介绍一下命令`which`,它用于查找某个命令的绝对路径。示例命令如下:

which rmdir

/usr/bin/rmdir

which rm

alias rm=’rm -i’ /usr/bin/rm

which ls

alias ls=’ls —color=auto’ /usr/bin/ls

其中`rm`和`ls`是两个特殊的命令,在上例中我们使用`alias`命令做了别名。我们用的`rm`实际上是`rm -i`,加上`-i`选项后,删除文件或者命令时都会询问是否确定要删除,这样做比较安全。命令`alias`可以设置命令或文件的别名。<br />在上面的示例中,用`which`查到`rm`命令的绝对路径为/usr/bin/rm。我们使用命令时,只是直接打出了命令,而没有使用这些命令的绝对路径,这是环境变量`PATH`在起作用。请输入如下命令:

echo $PATH

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

这里的`echo`用来输出`$PATH`的值。`PATH`前面的`$`是变量的前缀符号。<br />因为/bin目录在`PATH`的设定中,所以自然可以找到`ls`。
<a name="JZ0Bn"></a>
## 4.2 与文档相关的命令
上面介绍的几个命令几乎都是与目录相关的,下面继续学习几个与文档相关的命令。
<a name="XTD0S"></a>
### 4.2.1 命令cat
命令`cat`(它并不是某个单词的简写,大家可以通过`man cat`命令查看它的解释)是比较常用的一个命令,用于查看一个文件的内容并将其显示在屏幕上。`cat`后面可以不加任何选项,直接跟文件名。

- `**-n**` :查看文件时,把行号也显示到屏幕上。示例命令如下(当前目录依然在/tmp/test_mv):

echo ‘111111111’ > dirb/filee

echo ‘222222222’ >> dirb/filee

cat dirb/filee

111111111 222222222

cat -n dirb/filee

 1  111111111
 2  222222222
上例中出现了符号>>,它跟前面介绍的符号>类似,其作用也是重定向,即把前面的内容输入到后面的文件中,但符号>>是“追加”的意思。<br />当使用符号>时,如果文件中有内容,则会删除文件中原有的内容,而使用符号>>则不会删除原有的内容。

<a name="Pq7WN"></a>
### 4.2.2 命令`tac`
和命令`cat`一样,命令 `tac`(正好是命令`cat`的反序写法 )也是把文件的内容显示在屏幕上,只不过是先显示最后一行,然后显示倒数第二行,最后才显示第一行。我们使用命令`tac`来查看刚才创建的文件dirb/filee,显示的结果和命令`cat`正好是反序,如下所示:

tac dirb/filee

222222222 111111111

<a name="MLpmI"></a>
### 
<a name="NPP3t"></a>
### 4.2.3 命令`more`
命令`more`也用于查看一个文件的内容,后面直接跟文件名。当文件内容太多,一屏不能全部显示时,用命令`cat`肯定是看不了前面的内容,这时可以使用命令`more`。当看完一屏后,按空格键可以继续看下一屏,按回车可以看下一条,看完所有内容后就会退出,在centos7中,按B可以向上翻屏,但是不能看上一条。如果你想提前退出,按q键即可。
<a name="gYoDL"></a>
### 
<a name="AbCPo"></a>
### 4.2.4 命令`less`
命令`less`的作用和命令`more`一样,后面直接跟文件名,但命令`less`比`more`功能要多一些。按空格键可以向下翻页,按B可以向上翻页。使用上下箭头查看上一条和下一条。<br />在使用```less`查看某个文件时,可以很方便的搜索,使用/键向下搜索,使用?键向上搜索,如果是查找多个该字符串,可以按n键显示下一个。

/DROP 或 ?DROP

<a name="XirPp"></a>
### 
<a name="yOkSO"></a>
### 4.2.5 命令`head`
命令`head`用于显示文件的前10行,后面直接跟文件名。如果加`-n`选项,则显示文件的前几行,示例命令如下:

head /etc/passwd

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin operator:x:11:0:operator:/root:/sbin/nologin

head -n1 /etc/passwd

root:x:0:0:root:/root:/bin/bash

head -n2 /etc/passwd

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin


大家请注意,选项`-n`后有无空格均可。另外,也可以省略字母`n`,`-`后面直接跟数字, 如下:

head -2 /etc/passwd

root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin

<a name="Rx1zc"></a>
### 4.2.6 命令`tail`
和命令`head`类似,命令`tail`用于显示文件的最后10行,后面直接跟文件名。如果加`-n`选项,则显示文件的最后几行,示例命令如下:

tail /etc/passwd

colord:x:991:986:User for colord:/var/lib/colord:/sbin/nologin qemu:x:107:107:qemu user:/:/sbin/nologin gdm:x:42:42::/var/lib/gdm:/sbin/nologin rpcuser:x:29:29:RPC Service User:/var/lib/nfs:/sbin/nologin nfsnobody:x:65534:65534:Anonymous NFS User:/var/lib/nfs:/sbin/nologin sssd:x:990:985:User for sssd:/:/sbin/nologin gnome-initial-setup:x:989:984::/run/gnome-initial-setup/:/sbin/nologin avahi:x:70:70:Avahi mDNS/DNS-SD Stack:/var/run/avahi-daemon:/sbin/nologin tcpdump:x:72:72::/:/sbin/nologin xiaoxiao:x:1000:1000:xiaoxiao:/home/xiaoxiao:/bin/bash

tail -n2 /etc/passwd

tcpdump:x:72:72::/:/sbin/nologin xiaoxiao:x:1000:1000:xiaoxiao:/home/xiaoxiao:/bin/bash

tail -2 /etc/passwd

tcpdump:x:72:72::/:/sbin/nologin xiaoxiao:x:1000:1000:xiaoxiao:/home/xiaoxiao:/bin/bash

同样,`-n`后面有无空格均可,且字母n也可以省略。<br />另外,命令`tail`的`-f`选项也常用,它可以动态显示文件的最后10行。如果文件内容在不断增加,使用`-f`选项非常方便和直观。比如`tail -f /var/log/messages`可以动态、实时地查看文件/var/log/messages中的内容。

<a name="RkJqg"></a>
### 4.2.4 命令`touch`
命令`touch`用于创建文件(创建文件夹使用mkdir命令)。<br />在当前目录下创建文件

touch test.txt

在其它文件夹下创建文件

touch book/test.txt

<a name="IosHz"></a>
## 4.3 Linux文件类型
<a name="rbiMl"></a>
### 4.3.1 常见文件类型
在Linux文件系统中,主要有以下几种类型的文件。

- **普通文件(regular file)**:即一般类型的文件,当用命令`ls -l`查看某个目录时,第一个属性为“-”的文件就是普通文件。它又可分成纯文本文件(ASCII)和二进制文件(binary)。纯文本文件可以通过`cat`、`more`、`less`等工具直接查看内容,而二进制文件不能。例如,我们用的命令/usr/bin/ls就是一个二进制文件。
- **目录(directory)**:它与Windows下的文件夹类似。用命令`ls -l`查看的第一个属性值为d的文件就是目录。
- **链接文件(link file)**:用命令`ls -l`查看的第一个属性为l的文件就是链接文件,它类似于Windows下的快捷方式。
- **设备(device)**:即与系统周边相关的一些文件,通常都集中在/dev目录下。 这种文件一般分为两种:
- **块设备(block)**:块(block)设备,就是一些存储数据,简称硬盘。例如,第一块硬盘是/dev/sda1,用命令`ls-l`查看的第一个属性值为b的文件就是块设备。
- **字符设备(character):**字符(character)设备,是一些串行端口的接口设备,例如键盘、鼠标等,用命令`ls-l`查看的第一个属性为c的文件就是字符设备。
<a name="vZoXW"></a>
### 4.3.2 Linux文件后缀名
在Linux系统中,文件的后缀名没有具体意义,加或者不加都无所谓。但是为了便于区分,我们习惯在定义文件名时加一个后缀名。这样当用户看到这个文件名时,就会很快知道它到底是一个什么文件,例如1.sh、2.tar.gz、my.cnf、test.zip等。

<a name="hAGUb"></a>
### 4.3.3 Linux的链接文件
**inode  概述**<br />文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。<br />文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode。

- 元信息 → inode
- 数据 → block

**inode 号码**<br />表面上,用户通过文件名打开文件,实际上,系统内部将这个过程分为三步:<br />1.系统找到这个文件名对应的inode号码;<br />2.通过inode号码,获取inode信息;<br />3.根据inode信息,找到文件数据所在的block,并读出数据。<br />其实系统还要根据inode信息,看用户是否具有访问的权限,有就指向对应的数据block,没有就返回权限拒绝。

可以使用ls -i 查看文件的inode号码。

[root@localhost ~]# ls -i 33574991 anaconda-ks.cfg 2086 test 33574994 test.txt


链接文件分为硬链接(hard link)和软链接(symbolic link)两种。两种链接的本质区别在inode。<br />**硬链接**<br />通过文件系统的inode链接来产生的新的文件名,而不是产生新的文件,称为硬链接。<br />一般情况下,每个inode号码对应一个文件名,但是Linux允许多个文件名指向同一个inode号码。意味着可以使用不同的文件名访问相同的内容。

ln 源文件 目标

运行该命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中的链接数这时就会增加1。<br />当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名;但是删除一个文件名,不影响另一个文件名的访问。删除一个文件名,只会使得inode中的链接数减1。<br />需要注意的是不能对目录做硬链接。

**软链接**<br />类似于Windows的快捷方式功能的文件,可以快速连接到目标文件或目录,称为软链接。

ln -s 源文件或目录 目标文件或目录

软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。例如,文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。这时,文件A就称为文件B的软链接soft link或者符号链接symbolic link。<br />这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode链接数不会因此发生变化。

由于硬链接的限制太多了(包括无法做目录的链接),所以用途上比较受限,而软链接的使用方向较广。
<a name="bECg5"></a>
## 4.4 在Linux下搜索文件
在Windows下有一个搜索工具,可以让我们很快找到文件,这很有用。然而在Linux下,搜索功能更加强大。
<a name="gB7af"></a>
### 4.4.1 用`which`命令查找可执行文件的绝对路径
前面已经用过`which`命令,但需要注意的是,`which`只能用来查找`PATH`环境变量中出现的路径下的可执行文件。这个命令比较常用,有时我们不知道某个命令的绝对路径,用`which`查找就很容易知道了。例如,查找`vi`和`cat`的绝对路径,示例命令如下:

which vi

/usr/bin/vi

which cat

/usr/bin/cat

<a name="MpBpv"></a>
### 4.4.2 用`whereis`命令查找文件
`whereis 用来搜索二进制文件(参数-b)、man说明文件(参数-m) 和源代码文件(参数-s). 如果省略参数,则返回所有信息。`<br />whereis 查找范围:标准Linux位置,以及$PATH, $MANPATH指定的位置。

- `**-b**`:只查找二进制文件。
- `**-m**`:只查找帮助文件(在man目录下的文件)。
- `**-s**`:只查找源代码文件。

例如,用`whereis`查看`ls`的示例命令如下:

whereis ls

ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz

可以看到,这里找到了3个文件。这个命令类似于模糊查找,只要文件名包含“ls”字符,就会列出来。
<a name="Ardzn"></a>
### [<br />](https://blog.csdn.net/u010625000/article/details/44455023)4.4.3 用`locate`命令查找文件

locate在mlocate包中,没有可以用yum install -y mlocate安装。`locate`后面直接跟文件名。

`locate`所搜索到的文件列表,不管是目录名还是文件名,只要包含我们要搜索的关键词,都会列出来,所以`locate`不适合精准搜索。

locate依靠生成的db数据库查找,每天自动更新一次数据库,也可手动更新updatedb。
<a name="GEbig"></a>
### 
<a name="H72Rf"></a>
### 4.4.4 使用`find`搜索文件
`find`这个搜索工具是使用频率非常高的一个,请务必熟记,其格式为:`find [路径] [参数]` 。下面介绍其常用的几个参数。

- `**-name filename**`:表示直接查找该文件名的文件,这个选项比较常用,示例命令如下:

find . -name test2 //.表示当前目录,当前目录在/tmp/4_6下面

./dir2/test2

find . -name “test“ //支持用通配,且匹配表达式要放在引号中

./test1 ./dir2/test2 ./dir2/test5 ./dir2/test6 ./dir2/test7 ./dir3/test3 ./test4 ./test5


- `**-type filetype**`:表示通过文件类型查找文件。文件类型在前面已经简单介绍过,相信你已经基本了解了。`filetype`包含了`f`、`b`、`c`、`d`、`l`等类型(普通文件、块设备、字符设备、目录、链接文件等),示例命令如下:

find . -type d

. ./dir2 ./dir3 ./dir4 ```

四种查找命令的对比:

which whereis locate find
文件支持 可执行文件 二进制,源文件,帮助文档 所有文件类型 所有文件类型
查找路径 环境变量PATH 标准Linux位置,以及$PATH, $MANPATH指定的位置。 文件列表库 可指定,默认遍历当前路径及其子路径
查找原理 遍历环境变量PATH所指定的目录,寻找完全匹配filename的可执行文件。 文件列表库,对去除.之后的所有字符后的filename进行完全匹配。 文件列表库,部分匹配 遍历磁盘
查找效率/速度
适用场合 可执行文件的查找 二进制文件,源文件,帮助文档的查找 模糊查找(由于默认是部分匹配,会列出很多无关文件) which, whereis, locate都不适用的情况下,使用find