目录
在Linux中,存在着绝对路径和相对路径。
- 绝对路径:路径的写法一定是由根目录/写起的,例如 /usr/local/mysql。
- 相对路径:路径的写法不是由根目录/写起的。例如,首先用户进入到/home,然后再进入到test ,执行的命令为# cd /home、# cd test
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
pwd命令
pwd(print working directory)显示当前目录(返回绝对路径)。
- # pwd
- /root
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
mkdir命令
mkdir(make directory的简写)用于创建目录,在Linux中,如果它发现要创建的目录的上一级目录不存在,就会报错。为了解决这个问题,Linux设置了-p选项,这个选项可以帮我们创建一大串级联目录,不会报错。
- # mkdir /tmp/test/123
- mkdir: 无法创建目录 '/tmp/test/123': 没有那个文件或目录
- # mkdir -p /tmp/test/123
- # ls /tmp/test
- 123
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
- #
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
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:这是安全选项,如果遇到一个已存在的文件,会询问是否覆盖.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
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可以设置命令或文件的别名。
在上面的示例中,用
which查到rm命令的绝对路径为/usr/bin/rm。我们使用命令时,只是直接打出了命令,而没有使用这些命令的绝对路径,这是环境变量PATH在起作用。请输入如下命令:
- # echo $PATH
- /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
这里的
echo用来输出$PATH的值。PATH前面的$是变量的前缀符号。
因为/bin目录在
PATH的设定中,所以自然可以找到ls。
上面介绍的几个命令几乎都是与目录相关的,下面继续学习几个与文档相关的命令。
命令
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
上例中出现了符号>>,它跟前面介绍的符号>类似,其作用也是重定向,即把前面的内容输入到后面的文件中,但符号>>是“追加”的意思。
当使用符号>时,如果文件中有内容,则会删除文件中原有的内容,而使用符号>>则不会删除原有的内容。
tac和命令
cat一样,命令tac(正好是命令cat的反序写法 )也是把文件的内容显示在屏幕上,只不过是先显示最后一行,然后显示倒数第二行,最后才显示第一行。我们使用命令tac来查看刚才创建的文件dirb/filee,显示的结果和命令cat正好是反序,如下所示:
- # tac dirb/filee
- 222222222
- 111111111
more命令
more也用于查看一个文件的内容,后面直接跟文件名。当文件内容太多,一屏不能全部显示时,用命令cat肯定是看不了前面的内容,这时可以使用命令more。当看完一屏后,按空格键可以继续看下一屏,按回车可以看下一条,看完所有内容后就会退出,在centos7中,按B可以向上翻屏,但是不能看上一条。如果你想提前退出,按q键即可。
less命令
less的作用和命令more一样,后面直接跟文件名,但命令less比more功能要多一些。按空格键可以向下翻页,按B可以向上翻页。使用上下箭头查看上一条和下一条。
在使用
less查看某个文件时,可以很方便的搜索,使用/键向下搜索,使用?键向上搜索,如果是查找多个该字符串,可以按n键显示下一个。
- /DROP
- 或
- ?DROP
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
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也可以省略。
另外,命令
tail的-f选项也常用,它可以动态显示文件的最后10行。如果文件内容在不断增加,使用-f选项非常方便和直观。比如tail -f /var/log/messages可以动态、实时地查看文件/var/log/messages中的内容。
touch命令
touch用于创建文件(创建文件夹使用mkdir命令)。
在当前目录下创建文件
touch test.txt
在其它文件夹下创建文件
touch book/test.txt
在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的文件就是字符设备。
在Linux系统中,文件的后缀名没有具体意义,加或者不加都无所谓。但是为了便于区分,我们习惯在定义文件名时加一个后缀名。这样当用户看到这个文件名时,就会很快知道它到底是一个什么文件,例如1.sh、2.tar.gz、my.cnf、test.zip等。
文件是存储在硬盘上的,硬盘的最小存储单位叫做扇区sector,每个扇区存储512字节。操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个块block。这种由多个扇区组成的块,是文件存取的最小单位。块的大小,最常见的是4KB,即连续八个sector组成一个block。
文件数据存储在块中,那么还必须找到一个地方存储文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种存储文件元信息的区域就叫做inode,中文译名为索引节点,也叫i节点。因此,一个文件必须占用一个inode。
- 元信息 → inode
- 数据 → block
表面上,用户通过文件名打开文件,实际上,系统内部将这个过程分为三步:
- 系统找到这个文件名对应的inode号码;
- 通过inode号码,获取inode信息;
- 根据inode信息,找到文件数据所在的block,并读出数据。
其实系统还要根据inode信息,看用户是否具有访问的权限,有就指向对应的数据block,没有就返回权限拒绝。
可以使用ls -i 查看文件的inode号码。
[root@localhost ~]# ls -i 33574991 anaconda-ks.cfg 2086 test 33574994 test.txt
链接文件分为硬链接(hard link)和软链接(symbolic link)两种。两种链接的本质区别在inode。
通过文件系统的inode链接来产生的新的文件名,而不是产生新的文件,称为硬链接。
一般情况下,每个inode号码对应一个文件名,但是Linux允许多个文件名指向同一个inode号码。意味着可以使用不同的文件名访问相同的内容。
ln 源文件 目标
运行该命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中的链接数这时就会增加1。
当一个文件拥有多个硬链接时,对文件内容修改,会影响到所有文件名;但是删除一个文件名,不影响另一个文件名的访问。删除一个文件名,只会使得inode中的链接数减1。
需要注意的是不能对目录做硬链接。
类似于Windows的快捷方式功能的文件,可以快速连接到目标文件或目录,称为软链接。
ln -s 源文件或目录 目标文件或目录
软链接就是再创建一个独立的文件,而这个文件会让数据的读取指向它连接的那个文件的文件名。例如,文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。这时,文件A就称为文件B的软链接soft link或者符号链接symbolic link。
这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode链接数不会因此发生变化。
由于硬链接的限制太多了(包括无法做目录的链接),所以用途上比较受限,而软链接的使用方向较广。
在Windows下有一个搜索工具,可以让我们很快找到文件,这很有用。然而在Linux下,搜索功能更加强大。
which命令查找可执行文件的绝对路径前面已经用过
which命令,但需要注意的是,which只能用来查找PATH环境变量中出现的路径下的可执行文件。这个命令比较常用,有时我们不知道某个命令的绝对路径,用which查找就很容易知道了。例如,查找vi和cat的绝对路径,示例命令如下:
- # which vi
- /usr/bin/vi
- # which cat
- /usr/bin/cat
whereis命令查找文件
whereis 用来搜索二进制文件(参数-b)、man说明文件(参数-m) 和源代码文件(参数-s). 如果省略参数,则返回所有信息。
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”字符,就会列出来。
locate命令查找文件locate在mlocate包中,没有可以用yum install -y mlocate安装。
locate后面直接跟文件名。
locate所搜索到的文件列表,不管是目录名还是文件名,只要包含我们要搜索的关键词,都会列出来,所以locate不适合精准搜索。
locate依靠生成的db数据库查找,每天自动更新一次数据库,也可手动更新updatedb。
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 |