Linux的目录介绍和常用命令详解
1、Linux 系统目录结构
在我们平时生活中,操作系统用的最多的是Windows系统,如果你是土豪从小到大都是iPhone、Mac之类的电子产品,那你应该对Linux命令是非常熟悉的。在Windows系统下,系统的整个磁盘会被拆分为不同的磁盘分区,而且每个磁盘会分配一个不同的盘符,比如 C:\、D:\ 等等,每个磁盘分区都单独存放自己的文件,它们有自己的根目录,每个磁盘分区的起点就是它们的根目录,比如 C:\、D:\ 就相当于 C 盘和 D 盘的根目录了,如果想要找到一个文件,我们只要依次进入该文件所在的磁盘分区即可(这里假设是D盘),然后在进入该分区下的目录,最终找到这个文件。而Linux 操作系统也有目录的概念,只是Linux 和Windows 的磁盘管理有一点区别,Linux 是将整个磁盘进行统一的管理,不存在C:\、D:\ 等盘符,Linux整个系统只有一个根目录 "/",所有的文件和目录都是在这个根目录下,它表示 Linux 文件系统的起点,因为在Linux系统中一切都是文件,其中的目录、字符设备、光盘、打印机等都被抽象成了文件,所以平时和我们打交道的都是文件。
另外要注意一点,在Linux 中目录之间的间隔使用的是正斜线 (forward slash)"/",而 Windows中用的是反斜线 (back slash)"\"。
Linux系统在安装的时候系统会建立一些默认的目录,每个目录都有其特殊的功能,所以下面我们对 Linux 系统中的目录结构以及经常使用到的概念进行一个完整介绍。
下面来简单介绍一下这些目录的含义(红色标注为重点):
- /:根目录,文件的最顶端,是整个 Linux 文件系统的起点。
- /bin:bin是Binary的缩写, 用于存放系统中常用的命令,任何用户都有权限执行,例如:ls、mkdir、mv等等。
- /boot: 用于存放Linux启动时的一些核心文件,包括一些连接文件以及镜像文件,其中Linux 的内核就存放在这个目录中。
- /dev : dev是Device(设备)的缩写, 存放的是Linux的外部设备,例如:硬盘、光驱、鼠标等设备文件,在Linux中访问设备的方式和访问文件的方式是相同的。
- /etc: 这个目录非常重要,用于存放系统和程序所需的配置文件,作用类似于 Windows 的注册表。
- /home:普通用户的主目录,在Linux中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,比如 user1 的home目录是 /home/user1。
- /lib lib64:这个目录里存放着系统最基本的动态连接共享库,其作用类似于Windows里的DLL文件。它们自己不能被执行,需要被其他的程序调用,几乎所有的应用程序都需要用到共享库。
- /media:用于挂在设备,linux系统会自动识别一些设备,例如U盘、光驱等等,当识别后,linux会把识别的设备挂载到这个目录下。
- /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在/mnt/上,然后进入该目录就可以查看光驱里的内容了,例如增加一块硬盘,需要手动挂载。
- /opt:用于安装额外软件所用的目录,默认是空的。比如你安装一个Mysql数据库则就可以放到这个目录下。
- /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
- /root:该目录为系统管理员,也就是超级权限者root用户的home目录。
- /run:用于存放进程产生的临时文件。当系统重启时,这个目录下的文件应该被删掉或清除。
- /sbin:s就是Super User的意思,存放的是系统管理员使用的系统管理程序。
- /srv:存放一些服务启动之后需要提取的数据。
- /sys:该目录下安装了内核中新出现的一个文件系统 sysfs,该文件系统是内核设备树的一个直观反映。
- /tmp:用来存放一些临时文件的,所有用户都可执行写操作。
- /usr:这是一个非常重要的目录,很多的应用程序和文件都默认放在这个目录下,类似于Windows下的Program Files目录。
- /usr/bin: 系统用户使用的应用程序。
- /usr/sbin: 超级用户使用的比较高级的管理程序和系统守护程序。
- /usr/src: 内核源代码默认的放置目录。
- /usr/local :该目录下一般是你安装软件的目录,也相当于在Windows下的Program Files这个目录。
- /var:这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志log文件。
- /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
2、Linux的绝对路径与相对路径
文件的路径是用来帮助我们定位到某个文件的,一般文件的路径分为绝对路径和相对路径。
- 绝对路径:指的是从根目录(/)开始写起的文件或目录路径,也就是将目录用完整的路径表示出来。
- 相对路径:指的是相对于当前工作目录为起点来表示的文件路径。(注意:使用相对路径进入文件时最前面不加/)
简单举例:
①、绝对路径
例如我们进入:/usr/local/bin 目录下。
②、相对路径
我们首先回退到/usr/local目录,然后相对于这个目录进入/bin 目录。
或者
又或者直接使用绝对路径
两个特殊的目录:
- . :一个点代表当前的目录,也可以用 . / 来表示。
- . . :两个点代表上一层目录,也可以用 . . / 来表示。
注意:绝对路径和相对路径二者的使用完全看自己怎么选择,两者各有利弊,绝对路径可以在任何目录下进入其它任何目录中,可以保证他的路径是绝对正确的,但是如果目录文件很多则需敲一段很长的路径。而相对路径在有同名的目录下非常的方便,但是如果要在不同命的目录下进入到其它目录就很麻烦(不使用绝对路径的情况),首先得退到根目录,然后才能进入其它目录。
①、相对路径的用途:例如现在有三个目录分别为:
- /usr/local/packages/etc
- /usr/local/packages/bin
像这样的目录我们使用相对路径是非常方便的,如果我想从/usr/local/packages/etc目录进入到/usr/local/packages/bin目录,可以直接使用 cd ../bin ,这样非常的方便。
②、绝对路径的用途:绝对路径由于将路径全部完整的写出来了,所以是非常准确的。所以路径是写在 shell scripts 中的路径,那么最好使用绝对路径,虽然可能路径非常长,但是这种写法是绝对不会出错的。
3、Linux中的基本命令介绍
这里注意一点:系统bin目录下和sbin目录下是存放“指令”对应的可“执行程序文件”目录,其中bin目录是所有用户都可以使用里面的命令,而sbin目录文件对应指令都是"root"用户可以执行的指令,普通用户不能使用该目录里的命令,所以普通用户和和root用户的开头是有区别的:
- root用户:用#开头
- 普通用户:用$开头
下面来介绍Linux中的基本命令。
4、用户与用户组管理
用户、用户组和其他人的基本概念:
概念 | 描述 |
---|---|
用户 | 表示能够使用系统的用户。root也是用户的一种,只是它有着最高的权限 |
用户组 | 表示用户的一个集合,不同组的用户对文件的权限是不一样的 |
其他人 | 顾名思义,它是能够使用系统的用户,但是没有加入任何用户组 |
下面是关于它们的一些基本命令和如何使用:
①、useradd
:用于创建新的用户,默认的用户家目录会被存放在/home目录中,默认的Shell解释器为/bin/bash,而且默认会创建一个与该用户同名的基本用户组。。
语法格式为:useradd [选项] 用户名
常用选项:
- -d 指定用户的家目录(默认为/home/username)
- -e 账户的到期时间,格式为YYYY-MM-DD.
- -u 指定该用户的默认UID
- -g 指定一个初始的用户基本组(必须已存在),格式为:useradd –g 用户组 用户名
- -G 指定一个或多个扩展用户组
- -N 不创建与用户同名的基本用户组
- -s 指定该用户的默认Shell解释器
简单举例:
在上面的命令中,表示创建一个普通用户并指定家目录的路径、用户的UID以及Shell解释器。这里注意/sbin/nologin,它是终端解释器中的一员,与Bash解释器有着天壤之别。一旦用户的解释器被设置为nologin,则代表该用户不能登录到系统中。
然后用id username
命令来查看用户的信息:
②、passwd
:用于修改用户密码、过期时间、认证信息等(root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便)。
语法格式为:passwd [选项] [用户名]
常用选项:
- -l 锁定用户,禁止其登录
- -u 解除锁定,允许用户登录
- -d 使该用户可用空密码登录系统
- -e 强制用户在下次登录时修改密码
- -S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
简单举例:
③、groupadd
:命令用于创建用户组。
语法格式为:groupadd [选项] 群组名
常用选项:
- -g 指定新用户组的组标识号(GID)。格式:groupadd -g 101 group
- -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
创建用户组的步骤非常简单,例如使用如下命令创建一个用户组linuxgroup,简单举例:
④、groupdel
:用于删除创建的用户组。格式:groupdel 用户组名
⑤、groupmod
:用于修改用户组。
语法格式为:groupadd [选项] 用户组名
常用选项:
- -g GID 为用户组指定新的组标识号。
- -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
- -n 新用户组 将用户组的名字改为新名字
简单实例(就不实际运行了):groupmod –g 10000 –n group3 group2
⑥、usermod
:命令用于修改用户的属性。
语法格式为:usermod [选项] 用户名
常用选项:
- -c 填写用户账户的备注信息
- -d –m 参数-m与参数-d连用,可重新指定用户的家目录并自动把旧的数据转移过去
- -e 账户的到期时间,格式为YYYY-MM-DD
- -g 修改用户所属的用户组id,即gid
- -G 修改用户所属的用户组,即把用户追加到某些组中
- -L 锁定用户禁止其登录系统
- -U 解锁用户,允许其登录系统
- -s 变更默认终端
- -u 修改用户的UID
简单举例:
--将用户zhangsan加入到root用户组中,这样扩展组列表中则会出现root用户组的字样,而基本组不会受到影响:
--修改用户zhangsan的用户UID值:
⑦、userdel
:用于删除用户。
语法格式为:userdel [选项] 用户名
常用选项:
- -f 强制删除用户
- -r 同时删除用户及用户家目录
注意:一般在实际的删除用户时,都不会删除用户的home目录。
5、文件的基本属性和权限
在Linux系统中一切都是文件,但是每个文件的类型不尽相同,而且每个文件的访问权限也不相同,因此Linux系统使用了不同的字符来加以区分文件的类型访问权限,如下所示。
我们查看跟目录下的所有文件:
这里就以home目录为例,下面来简单分析一下。
其中最前面的一大块表示这个文件的类型与权限,第一个字符代表这个文件的类型(目录、文件或链接文件等):
类型 | 描述 |
---|---|
- | 普通文件,如hello.txt |
d | 目录文件 |
l | 链接文件 |
b | 块设备文件 |
c | 字符设备文件 |
p | 管道文件 |
后面的字符都为3个一组,第一组为"文件所有者的权限",即文件的所有者才能进行读写执行的操作。第二组为"用户组的权限",只要是在这个组的用户都权限。第三组为"其它非本用户组的权限"。
以下是更改文件属性的一些命令:
①、chgrp
:更改文件所属用户组
语法格式为:chgrp [-R] 属组名 文件名
参数选项
- -R:递归更改文件所属用户组,就是在更改某个目录文件的所属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
②、chown
:更改文件所有者,也可以同时更改文件属组
语法格式为:chown [–R] 属主名 文件名 或者 chown [-R] 属主名:属组名 文件名
参数选项:
- -R:递归更改文件所属用户组,就是在更改某个目录文件的所属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
③、chmod
:更改文件的权限
语法格式为:chmod [选项] 文件名
文件权限的设置方法有两种,分别是使用数字和符号来进行权限更改,推荐使用数字,现在我们来学习:
(1)、数字类型改变文件权限
Linux 文件的基本权限有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。先复习一下刚刚上面提到的数据:文件的权限字符为:[-rwxrwxrwx] , 这九个权限是三个三个一组的!其中,我们可以使用数字来代表各个权限,各权限的分数对照表如下:
权限 | 数字 |
---|---|
r | 4 |
w | 2 |
x | 1 |
- | 0 |
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加来计算的,例如当权限为:[-rwxrwx---] 分数则是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= --- = 0+0+0 = 0
所以等一下我们设定权限的变更时,该文件的权限数字就是 770。变更权限的指令 chmod 的语法是这样的:
chmod [-R] xyz 文件或目录
选项与参数:
- xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
- -R : 进行递归(recursive)的持续变更,亦即连同次目录下的所有文件都会变更
简单举例:
假如将文件权限改为:[-rwxr-x---],可以发现有些权限没有,那么权限的分数计算则为:[4+2+1][4+0+1][0+0+0]=750,所以执行:chmod 750 filename
。
(2)、字母类型改变文件权限
另外还有另一种改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:user:用户 ;group:组 ;others:其他。那么我们就可以使用 u, g, o 来代表三种身份的权限(为它们的首字母简写)。此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:
来实践一下:
- 如果我们需要将文件权限设置为 [-rwxr-xr--] ,可以使用
chmod u=rwx,g=rx,o=r filename
来设定。 - 如果我们需要将文件权限均设置为可写,可以使用
chmod a+w filename
来设定。 - 如果我们需要将文件权限去掉而不更改其它的属性,可以使用
chmod a-x filename
来设定。
6、文件与目录管理(重要,常用)
①、cd
:[change directory] 切换工作目录。语法格式为:cd [目录名]
cd .. #进入上一层目录
cd ../.. #返回上两级目录
cd /home #进入home目录
cd /tmp #进入tmp目录
cd #进入个人的主目录
cd ~ #进入当前用户的home目录
cd ~username #进入到其它用户的home目录
②、pwd
:[print working directory] 打印当前工作目录。语法格式为:pwd
只要输入pwd命令就可以打印当前目录,例如:
③、ls
:[list] 打印当前所有目录和文件。语法格式为:ls [选项] [目录或文件名]
注意:如果ls 命令后边是目录,会显示目录下包含的文件信息,如果是文件名则会显示该文件的信息,如果没有跟任何参数则显示当前工作目录下包含的文件信息。
常用选项:
- -a 显示所有文件,包括隐藏文件
- -l 以长格式显示目录或文件的信息
- -d 只显示目录本身的信息,不显示目录下包含的文件
简单举例:
④、mkdir
:[make directory] 创建目录。语法格式为:mkdir [选项] 目录名
常用选项:
- -p 可以用于创建嵌套的多级目录(重要!)
⑤、cp
:[copy] 复制文件或目录。语法格式为:cp [选项] 源文件或目录 目标文件或目录
常用选项:
- -a 相当于-pdr 连在一起使用
- -p 连同文件的属性一起复制过去,而非使用默认的属性(备份常用)
- -d 如果源文件为连接文件的属性,则复制连接文件属性而非文件本身
- -r 递归复制,用于目录的复制
- -i 如果目标文件已经存在,在覆盖是会先询问操作的进行。
⑥、mv
:[move] 移动文件或目录。语法格式为:mv [选项] 源文件或目录 目标文件或目录
常用选项:
- -f force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i 如果目标文件已经存在是,就会询问是否覆盖
⑦、rm
:[remove] 删除文件或目录。语法格式为:rm [选项] 文件或目录
常用选项:
- -r 如果删除的是一个目录,则必须使用这个选项
- -f 强制删除,无须用户确认
- 一般删除目录时,两个选项会同时使用 -rf,但是建议删除前先用 mv 命令将待删除的目录移动到一个指定的回收目录中去,等过一段时间确认不再需要这些文件和目录,再使用 rm 命令将其删除。
- -i 在生成前会询问用户是否操作
⑧、touch
:用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
语法格式为:touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
- -a 改变档案的读取时间记录。
- -m 改变档案的修改时间记录。
- -c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
- -f 不使用,是为了与其他 unix 系统的相容性而保留。
- -r 使用参考档的时间记录,与 --file 的效果一样。
- -d 设定时间与日期,可以使用各种不同的格式。
- -t 设定档案的时间记录,格式与 date 指令相同。
7、查看文件的内容
①、cat
:从第一行开始显示文本内容(适用于内容较少的文件,因为cat命令会将文件的内容从头读到尾,直到读完为止,当内容很多时,等内容读完则又要翻到上面去看前面的内容)。
②、tac
:从最后一行开始显示,是 cat 的逆顺序。
#格式为:cat [参数选项] [文件]
cat filename #从第一个字节开始正向查看文件的内容
cat -n filename #标示文件的行数
tac filename #从最后一行开始反向查看一个文件的内容
③、more
:一页一页的显示文本内容(适用于内容较多的),可以使用空格键
或者回车键
往下翻页查看后面的内容。
#格式为:more [参数选项] [文件]
more filename #查看一个长文件的内容
④、less
:也适用于查看内容较多的文件,与 more 类似,但是比 less 比more更为灵活,less可以往上、往下翻页!按下键盘上空格
键读一行,按下PgUp
键可以往上翻页,按下PgDn
可以往下翻页。但是less命令不会实时显示当前阅读的百分比。
#格式为:less [参数选项] [文件]
less filename #查看一个长文件的内容
⑤、head
:用于只查看文件的前n行。
head -n 2 filename #查看一个文件的前两行
head -n 20 /etc/profile
⑥、tail
:tail命令与head命令相反,tail命令用于查看文件后n行内容。
tail -n 2 filename #查看一个文件的最后两行
tail -n +1000 filename #从1000行开始显示,显示1000行以后的
⑦、nl
:nl命令可以显示内容的同时显示行号,与 cat -n
命令的作用差不多。
简单综合使用(没有任何实际意义):
#注:| 表示管道,表示上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
cat filename | head -n 3000 | tail -n +1000 #显示1000行到3000行
cat filename | tail -n +3000 | head -n 1000 #从第3000行开始,显示1000(即显示3000~3999行)
⑧、wc
:用来查看查看文件的内容有多少个字符,多少行,多少个字节。
#语法格式:wc [选项] [文件]
参数:
-l:显示行数
-w:只显示单词数
-c:只显示字节数
8、文件的查找命令
Linux中的查找命令有5个,分别如下:
which
:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果,主要用来搜索命令所在的目录及别名信息,也可以验证命令是否存在。whereis
:搜索命令所在的目录及帮助文档路径,只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s);locate
:locate命令用于查找符合条件的文档,他会去保存文档和目录名称的数据库内查找合乎范本样式条件的文档或目录,所以速度比较快。(注意:CentOS7默认没有安装该命令)type
:用于区分某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的。如果一个命令是外部命令,那么使用-p参数,会显示该命令的路径,相当于which
命令。type
命令其实不能算查找命令;find
:最强大的查找命令,可以用它找到任何想找的文件,因为是在硬盘中查询,所以相对来说会慢一点。
注意:通常先不会使用 find 命令进行查找,因为速度慢!而都是先使用 whereis 或者 locate 来检查,当真的找不到了,才用 find 查找。是因为 whereis 与 locate是利用数据库来查找数据,所以相当快速,而且没有实际查询硬盘,比较节省时间。
whereis 和 locate 寻找的数据是由已创建的数据 /var/lib/ 中查找。但是数据库的更新默认是每天更新一次(不同系统可能会有差异),所以当新建文件或删除文件后去查找该文件, whereis 和 locate 会告诉你文件“not found”,因为必须更新数据库了。要手动更新数据库的方法也很简单,直接输入 updatedb 即可。 updatedb 命令会去读取/etc/updatedb.conf中的配置,然后去硬盘里面进行查找文件名操作,最后更新整个数据库文件。
①、which
:在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果,主要用来搜索命令所在的目录及别名信息,也可以验证命令是否存在。
#语法格式:which [-a] command # -a:将所有由PATH目录中可以找到的命令均列出来,而不是只列出第一个被找到的命令。
which pwd #搜索pwd命令所在的目录
which cd #搜索cd命令所在的目录
which ls #搜索ls命令所在的目录
which which #搜索which命令所在的目录
②、whereis
:用于搜索命令所在的目录及帮助文档路径,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。
whereis命令的参数如下:
- -b 只查找二进制格式的文件
- -m 只查找在说明文件man路径下的文件
- -s 只查source源文件
- -u 查找不在上述三个选项当中的其他特殊文件
#whereis [命令]
whereis ls #显示一个二进制文件、源码或man的位置
whereis grep
③、locate
:在文件资料数据库中查找文件,所以速度非常快。
注意:CentOS7默认没有安装该命令,下面先来安装该命令:
yum install mlocate
#提示:Is this ok [y/d/N],这里执行y,再次出现是否继续也是执行y
#mlocate安装完成。接下来需更新后台数据库,输入命令:
updatedb
locate inittab
注意:大家经常拿locate和find命令进行比较,它两的区别是:find是从磁盘全盘检索,而locate 是在文件资料库中进行搜索。所以locate命令的执行要比find命令执行速度快很多。但是文件资料库是需要不断更新的。如果我们新创建的文件不更新文件资料库,那么使用 locate 命令是查找不到的。我们可以使用 updatedb 手动更新资料库(默认明天更新一次),但是对于/tmp目录下的新建文件,是更新不到文件资料库的,因为/tmp目录不属于文件资料库的收录范围。
locate的用法,简单举例:
#语法格式:locate[文件名]
locate命令的参数如下:
#-i:忽略大小写差异;
#-r:后面可接正则表达式的实现方式。
locate passwd #搜索包含passwd的文件路径
locate /etc/sh #搜索etc目录下所有以sh开头的文件。
locate ~/m #搜索用户主目录下,所有以m开头的文件。
locate -i ~/m #搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
④、type
:它是用来判断某个命令到底是由shell自带的,还是由shell外部的独立二进制文件提供的,type命令其实不能算查找命令。
type命令的参数有:
- -t:判断给定的指令为"外部指令","命令别名"或者"内部指令";
- -p:如果给出的指令为外部指令,则显示其绝对路径,相当于which命令。;
- -a:在环境变量"PATH"指定的路径中,显示给定指令的信息,包括命令别名。
命令的类型可能有如下几种:
- alias: 别名;
- keyword: 关键字,Shell保留字;
- function: 函数,Shell函数;
- builtin: 内建命令,Shell内建命令;
- file: 文件,磁盘文件,外部命令;
- unfound: 没有找到。
#命令格式:type [option] [commond]
type cd #系统输出:cd 是 shell 内嵌(builtin)
type if #系统输出:if 是 shell 关键字(keyword)
type mysql #系统输出:未找到
type -t ls #系统输出:alias
type -t if #系统输出:keyword
type -p locate #系统输出:/usr/bin/locate
⑤、find
:最强大的查找命令,可以用它找到任何想找的文件,因为是在硬盘中查询,所以相对来说会慢一点。
find命令的格式:find path -option [-print] [-exec -ok |xargs |grep] [command {} \; ]
1)path:要查找的目录路径。
- ~ 表示$HOME目录
- . 表示当前目录
- / 表示根目录
2)print:表示将结果输出到标准输出。
3)exec:对匹配的文件执行该参数所给出的shell命令。 形式为command {} ;,注意{}与;之间有空格
4)ok:与exec作用相同,区别在于,在执行命令之前,都会给出提示,让用户确认是否执行
5)| xargs 与exec作用相同 ,起承接作用,区别在于 |xargs 主要用于承接删除操作 ,而 -exec 都可用 如复制、移动、重命名等
6)options :表示查找方式,下面来介绍option中的一下选项。
(1) find参数:基于文件名的搜索:
与文件名有关的参数如下:
- -name filename:查找文件名为filename的文件。filename可使用正则表达式表示。
- -iname filename:会忽略大小写。
简单举例:
find / -name filename #从根目录('/')开始根据filename的名字搜索相对应的文件和目录
find / -name passwd
find /usr/lib -name passwd
find /etc -name *init #模糊搜索,以 init 结尾的文件或目录名
find /etc -name init??? #模糊搜索,?表示单个字符,即搜索到init_
(2) find参数:基于文件类型的搜索
与文件类型有关的参数如下:
- -type TYPE:查找文件的类型为TYPE的文件。
上面TYPE的参数列表有:
f:普通文件;l:符号连接;d:目录;c:字符设备;b:块设备;s:(socket)套接字;p:FIFO。
简单举例:
find /home -type d #查找/home目录下文件类型是目录的
find /var -type s #查找/var目录下所有类型为socket的文件。
(3) find参数:基于文件大小的搜索:
与文件大小有关的参数如下:
- -size SIZE:查找文件大小刚好等于SIZE的文件;
- -size -SIZE:查找文件大小大于SIZE的文件;
- -size +SIZE:查找文件大小小于SIZE的文件。
其中,SIZE的单位有:
- c —— byte,字节;
- w —— 字(2字节);
- b —— bit,块(512字节);
- k —— 千字节;
- M —— 兆字节;
- G —— 吉字节。
简单举例:
find . -size 6c -print #查找等于6字节的文件
find . -size -32k #查找小于32k的文件
find / -size 10M -type f #查询超过10M的文件
(4) find参数:基于时间属性进行搜索
与时间有关的参数共有这几种:-amin、-cmin、-mmin;-atime、-ctime、-mtime;
注意:a前缀表示文件最后一次被读取的时间,c前缀表示文件状态的最后一次改变的时间(写入文件、更改所有者、权限等),m前缀表示文件内容最后一次改变的时间,min后缀表示分钟,time后缀表示天数。
- -atime n : 在过去的n天被读取过的文件
- -ctime n : 在过去的n天属性被修改过的文件
- -mtime n : 在过去的n天内容被修改过的文件
下面以 -mtime 说明时间:(+n,-n,n分别表示超过n天,n天以内和n天)
- -mtime n: n为数字,列出n天之前的“一天之内”被更改过内容的文件;
- -mtime +n:列出在n天之前(不含第n天本身)被更改过的文件名;
- -mtime -n:列出在n天之内(不含第n天本身)被更改过的文件名;
由这个时光轴我们可以知道,最右边为当前时,+5 代表大于等于 6 天前的档案名, -5 代表小于等于 5 天内的档案名,5 则是代表 5-6 那一天的档案名。
下面简单举例:
find /etc -mmin -5 #在/etc目录下查找5分钟内内容被修改过的文件和目录
find /etc -mtime +5 #在/etc目录下查找5天之前内容被修改过的文件和目录
(5) find参数:基于用户或用户组名进行搜索
与用户或用户组名有关的参数如下:
- -user name:name为用户账号名称;
- -group name:name为用户组名;
简单举例:
find /home -user root #在home目录下查询所有者为root的文件
find /home -group root #在home目录下查询所属组为root的文件
(6) find参数:基于文件权限进行搜索
与文件权限有关的参数如下:
- -perm mode:查找文件权限刚好等于mode的文件;
- -perm +mode:查找文件权限“包含任一mode的权限”的文件;
- -perm -mode:查找文件权限“必须要全部包括mode的权限”的文件。
下面简单举例:
#在当前目录及子目录中,查找属主具有读写执行,其他具有读执行权限的文件
find . -perm 755
#查找用户有写权限或者组用户有写权限的文件或目录
find ./ -perm /220
find ./ -perm /u+w,g+w
find ./ -perm /u=w,g=w
(7) find后面执行命令
#1、查找 del.txt 并删除,删除前提示确认
find . -name 'del.txt' -ok rm {} \;
#2、查找 aa.txt 并备份为aa.txt.bak
find . -name 'aa.txt' -exec cp {} {}.bak \;
#3、查当前目录下的所有普通文件
find . -type f -exec ls -l {} \;
#4、在 /logs 目录中查找更改时间在5日以前的文件并删除它们
find logs -type f -mtime +5 -exec -ok rm {} \;
#5、查询当天修改过的文件
find ./ -mtime -1 -type f -exec ls -l {} \;
(8) 组合条件搜索
这里有两个参数:
- -a:表示两个条件同时满足(and)
- -o:表示两个条件满足任意一个即可(or)
#查找/etc目录下大于8MB同时小于20MB的文件
find /etc -size +8M -a -size -20M
9、字符串匹配(grep)(常用)
grep:用来在文件中搜寻字符串匹配的行并输出,或者对目标文件逐行进行匹配检查,打印匹配到的行。
#查找 /etc/profile文件中包含 JAVA 字符串的行,并输出
grep JAVA /etc/profile
上面的输出结果:
#查找线程中包含 mysql的字符串的行,并且输出
ps aux | grep mysql
注:grep还可以使用正则表达式进行匹配
更详细的使用可以参考:linux中grep命令的用法
9、进程相关的命令(常用)
①、jps
:显示当前系统的Java进程情况,及其id号。jps(Java Virtual Machine Process Status Tool)是JDK 1.5提供的一个显示当前所有java进程pid的命令,简单实用,非常适合在linux/unix平台上简单察看当前java进程的一些简单情况。
②、ps
:(process status之意) 用于将当前时间点的进程运行情况选取下来并输出。格式为:ps [选项]
下面对命令选项进行说明:
- -A :所有的进程均显示出来。
- -e:显示所有进程,此参数的效果和指定"A"参数相同。
- -f:显示详细信息,全格式。
- -h 不显示标题。
- -l :较长,较详细地将PID的信息列出。
- a :显示终端上的所有进程,包括其他用户的进程。
- u :列出有效用户的相关进程。
- x :显示所有程序,不以终端机来区分,一般与a参数一起使用。
- r:只显示正在运行的进程。
常用的组合命令:
ps aux #(推荐)查看系统所有的进程数据
ps -ef #查看系统所有的进程数据
ps aux | grep mysql #查看mysql的进程
ps -ef | grep mysql #查看mysql的进程
在Linux下显示系统进程的命令是ps,最常用的组合是ps -ef
和ps aux
,二者的区别:ps -ef
与ps aux
的查询目的是一样的, 就是显示所有在运行的进程, 只是二者的输出格式不同,ps -ef
是用System V的格式输出,ps aux
是用BSD格式输出;如果COMMADN列过长,aux会截断显示,而ef不会。
- System V格式: UID , PID , PPID , C , STIME , TTY , TIME , CMD
- BSD格式: USER , PID , %CPU , %MEM , VSZ , RSS , TTY , STAT , START , TIME , COMMAND
ps -ef
是用System V的格式来显示,其输示出的结果如下:
每个列的含义:
- UID:用户ID
- PID:进程ID
- PPID:父进程ID
- C:CPU占用率
- STIME:开始时间
- TTY:开始此进程的TTY----终端设备
- TIME:此进程运行的总时间
- CMD:命令名
ps aux
是用BSD的格式来显示,其输出格式如下:
ps aux 与 ps -ef 不同的有列有:
- USER:用户名
- %CPU:进程占用的CPU百分比
- %MEM:占用内存的百分比
- VSZ:该进程使用的虚拟內存量(KB)
- RSS:该进程占用的固定內存量(KB)(驻留中页的数量)
- STAT:进程的状态
- START:该进程被触发启动时间
- TIME:该进程实际使用CPU运行的时间
其中STAT状态位常见的状态字符有
D //无法中断的休眠状态(通常 IO 的进程);
R //正在运行可中在队列中可过行的;
S //处于休眠状态;
T //停止或被追踪;
W //进入内存交换 (从内核2.6开始无效);
X //死掉的进程 (基本很少见);
Z //僵尸进程;
< //优先级高的进程
N //优先级较低的进程
L //有些页被锁进内存;
s //进程的领导者(在它之下有子进程);
l //多线程,克隆线程(使用 CLONE_THREAD, 类似 NPTL pthreads);
+ //位于后台的进程组;
综上所述,如果想查看进程的CPU占用率和内存占用率,可以使用aux ,如果想查看进程的父进程ID和完整的COMMAND命令,可以使用ef。
③、kill / killall
:kill命令用于根据进程id删除执行中的程序或工作,一般配合ps -ef或者ps aux使用。killall 用于杀死一个进程,与 kill 不同的是它会杀死指定名字的所有进程。
最常用的信号是:
- 1 (HUP):重新加载进程。
- 9 (KILL):杀死一个进程。
- 15 (TERM):正常停止一个进程。
如何杀死进程:
图形化界面的方式
kill pid(进程id)
kill -9 pid #(-9表示强制关闭)
killall -9 程序的名字
pkill 程序的名字
④、top
是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
10、打包与压缩文件
①、tar
:对文件进行打包,压缩和解压缩,如果指定了相应的参数,它还会调用相应的压缩程序(如gzip和bzip等)进行压缩和解压。
- -z:通过gzip的支持进行压缩/解压缩
- -j:通过bzip2的支持进行压缩/解压缩
- -J (大写):通过xz的支持进行压缩/解压缩
- -c :新建打包文件,也就是压缩文件
- -t :查看打包文件的内容含有哪些文件名
- -x :解压缩的功能,可以搭配-C(大写)指定解压的目录,注意-c,-t,-x不能同时出现在同一条命令中
- -C dir :指定压缩/解压缩的目录dir
- -v :在压缩/解压缩过程中,将正在处理的文件名显示出来
- -f filename :filename为压缩后的文件名字 (只要用到tar命令,-f选项是必须要用的)
命令格式:tar [参数] [压缩后的文件名] [被压缩的文件(可以为多个文件,空格隔开)]
下面重点介绍一下-z -j -J
这三个参数:
参数 | 作用 | 建议后缀命名 |
---|---|---|
-z | 用于gzip压缩/解压方式 | 文件名.tar.gz |
-j | 用于bzip2压缩/解压方式 | 文件名.tar.bz2 |
-J (大写) | 用于xz压缩/解压方式 | 文件名.tar.xz |
- gzip:是公认的压缩这速度最快,压缩大文件的时候与其他的压缩方式相比更加明显,历史最久,应用最广泛的压缩方式
- bzip2:压缩形成的文件小,但是可用性不如gzip
- xz:是最新的压缩方式,可以自动提供最佳的压缩率
压缩速度:gzip > bzip2 > xz;压缩率:xz > bzip2 > gzip
(1) tar的简单压缩和解压
#压缩文件
tar -cvf test.tar test.txt #将test.txt压缩为test.tar
#查看压缩文件的内容
tar -tvf test.tar
#解压文件
tar -xvf test.tar #解压至当前路径
tar -xvf test.tar -C /home/ #解压到指定路径
(2) tar使用gzip进行压缩和解压缩(最常用)。
#压缩文件
tar -zcvf filename.tar.gz file #将file压缩为filename.tar.gz格式(如果file是路径,则表示将该路径下的所有文件压缩)
tar -zcvf filename.tar.gz file1 file2 file3 ... #将多个file压缩为filename.tar.gz格式
#查看压缩文件的内容
tar -ztvf filename.tar.gz
#解压
tar -zxvf filename.tar.gz
tar -zxvf filename.tar.gz -C path
(3) tar使用bzip2进行压缩和解压缩。
#压缩文件
tar -jcvf filename.tar.bz2 file
#查看压缩文件的内容
tar -jtvf filename.tar.bz2
#解压
tar -jxvf filename.tar.bz2
tar -jxvf filename.tar.bz2 -C path
(4) tar使用xz进行压缩和解压缩。
#压缩文件
tar -Jcvf filename.tar.xz file
#查看压缩文件的内容
tar -Jtvf filename.tar.xz
#解压
tar -Jxvf filename.tar.xz
tar -Jxvf filename.tar.xz -C path
②、其它压缩/解压缩命令:
注意:下面的解压命令不是系统自带的,所以需要自行下载
bzip2 file1 #压缩一个叫做 'file1' 的文件
bunzip2 file1.bz2 #解压一个叫做 'file1.bz2'的文件
gzip file1 #压缩一个叫做 'file1'的文件
gzip -9 file1 #最大程度压缩
gunzip file1.gz #解压一个叫做 'file1.gz'的文件
rar a file1.rar test_file #创建一个叫做 'file1.rar' 的包
rar a file1.rar file1 file2 dir1 #同时压缩 'file1', 'file2' 以及目录 'dir1'
rar x file1.rar #解压rar包
#zip与unzip
zip file1.zip file1 #创建一个zip格式的压缩包
zip -r file1.zip file1 file2 dir1 #将几个文件和目录同时压缩成一个zip格式的压缩包
unzip file1.zip #解压一个zip格式压缩包
11、关机、重启与sync
关机、重启的命令有:shutdown、reboot、halt、poweroff。其中关机命令用的最多的是shutdown,重启用reboot,所以我们通常只用记住shutdown和reboot这两个目录即可。因为Linux系统的关机、重启是比较重要的操作,所以只有root权限才能操作shutdown、reboot等命令。
①、shutdown
:将系统关机或者重启。语法格式为:shutdown [选项] 时间 警告
常用选项:
- -h 将系统的服务停掉后,立即关机。
- -r 将系统的服务停掉后就重启。
- -t sec sec表示秒,即系统过多少秒后关机。
- -c 取消已经在进行的shutdown命令内容。
常用命令的简单举例:
shutdown -t 30 #表示30秒之后自动关机。
shutdown -h now #(常用)表示立刻关机。
shutdown -h 20:15 #表示在具体的20:15分会关机,如果在21:15才设置该命令,则隔天才关机。
shutdown -h +10 #表示10分钟后自动关机。
shutdown -r now #表示立刻重启。
shutdown -r +30 'The system wil reboot after 30 minute' #表示30分钟后系统会重启,并且后面的警告信息会给所有在线的用户。
②、reboot
:将系统重启,等同于 shutdown –r now
③、halt
:将系统关机,等同于shutdown –h now 和 poweroff
④、sync
:将数据由内存同步到硬盘中。目前shutdown、reboot、halt等命令在关机是都会调用sync这个工具,但是你如果不放心也可以自己多次执行这个目录。
⑤、logout
:注销
12、Linux补充知识点(必须会使用)
①、echo:用于输出字符串内容(echo后面默认定义的类型为字符串)。
#格式:echo [选项] [字符串]
echo hello echo #输出字符串
echo "\"hello echo\"" #输出转义字符
#输出变量
x=10
echo The value of variable x = $x
#输出显示换行
echo -e "OK! \n" #-e表示开启转义
②、&和&&
- & 表示任务在后台执行,如要在后台运行redis-server,则有 redis-server &
- && 表示前一条命令执行成功时,才执行后一条命令 ,如 echo '1' && echo '2'
③、| 和 ||
- | 表示管道,上一条命令的输出,作为下一条命令参数,如 echo 'yes' | wc -l
- || 表示上一条命令执行失败后,才执行下一条命令,如 cat nofile || echo "fail"
④、重定向 (>) 与追加(>>)
linux中经常会用到将内容输出到某文件当中,只需要在执行命令后面加上>或者>>号即可进入操作。
- >:表示将一条命令执行的结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向到其它输出设备(文件,打开文件操作符,或打印机等等),重定向文件时,覆盖文件原有内容(文件的日期也会自动更新)
- >> :将一条命令执行的结果追加到其它输出设备(会另起一行,文件的日期也会自动更新)。
注意:这两个语法在Shell编程中非常有用,所有必须要理解。下面简单举例:
更多的Linux命令学习可以参考:https://www.runoob.com/linux/linux-command-manual.html