1、Linux 系统目录结构
在我们平时生活中,操作系统用的最多的是Windows系统,如果你是土豪从小到大都是iPhone、Mac之类的电子产品,那你应该不会来做程序员吧(所以你就看不到这篇文章),在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的绝对路径与相对路径
文件的路径是用来帮助我们定位到某个文件的,一般文件的路径分为绝对路径和相对路径。
- 绝对路径:指的是从根目录(/)开始写起的文件或目录路径,也就是将目录用完整的路径表示出来。
- 相对路径:指的是相对于当前工作目录为起点来表示的文件路径。(注意:使用相对路径进入文件时最前面不加/)
简单举例:
1)、绝对路径
例如我们进入:/usr/local/bin 目录下。
2)、相对路径
我们首先回退到/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也是用户的一种,只是它有着最高的权限。
- 用户组:表示用户的一个集合,不同组的用户对文件的权限是不一样的。
- 其他人:顾名思义,它是能够使用系统的用户,但是没有加入任何用户组。
========================
关于他们的一些基本命令:
1)、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 命令来查看用户的信息:
2)、password:用于修改用户密码、过期时间、认证信息等(root管理员在Linux系统中修改自己或他人的密码时不需要验证旧密码,这一点特别方便)。
语法格式为:passwd [选项] [用户名]
常用选项:
- -l 锁定用户,禁止其登录
- -u 解除锁定,允许用户登录
- -d 使该用户可用空密码登录系统
- -e 强制用户在下次登录时修改密码
- -S 显示用户的密码是否被锁定,以及密码所采用的加密算法名称
简单举例:
3)、groupadd:命令用于创建用户组。
语法格式为:groupadd [选项] 群组名
常用选项:
- -g 指定新用户组的组标识号(GID)。格式:groupadd -g 101 group
- -o 一般与-g选项同时使用,表示新用户组的GID可以与系统已有用户组的GID相同。
创建用户组的步骤非常简单,例如使用如下命令创建一个用户组linuxgroup,简单举例:
4)、groupdel:用于删除创建的用户组。格式:groupdel 用户组名
5)、groupmod:用于修改用户组。
语法格式为:groupadd [选项] 用户组名
常用选项:
- -g GID 为用户组指定新的组标识号。
- -o 与-g选项同时使用,用户组的新GID可以与系统已有用户组的GID相同。
- -n 新用户组 将用户组的名字改为新名字
简单实例(就不实际运行了):groupmod –g 10000 –n group3 group2
6)、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值:
7)、userdel:用于删除用户。
语法格式为:userdel [选项] 用户名
常用选项:
- -f 强制删除用户
- -r 同时删除用户及用户家目录
注意:一般在实际的删除用户时,都不会删除用户的home目录。
5、文件的基本属性和权限
在Linux系统中一切都是文件,但是每个文件的类型不尽相同,而且每个文件的访问权限也不相同,因此Linux系统使用了不同的字符来加以区分文件的类型访问权限,如下所示。
我们查看跟目录下的所有文件:
这里就以home目录为例,下面来简单分析一下。
其中第一列代表这个文件的类型与权限,第一个字符代表这个文件的类型(目录、文件或链接文件等):
- -:普通文件,如hello.txt。
- d:目录文件。
- l:链接文件。
- b:块设备文件。
- c:字符设备文件。
- p:管道文件。
后面的字符为3个一组,第一组为“文件所有者的权限”,即文件的所有者才能进行读写执行的操作。第二组为“用户组的权限”,只要是在这个组的用户都权限。第三组为“其它非本用户组的权限”。
----更改文件属性命令:
1)、chgrp:更改文件所属用户组
语法格式为:chgrp [-R] 属组名 文件名
参数选项
- -R:递归更改文件所属用户组,就是在更改某个目录文件的所属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
2)、chown:更改文件所有者,也可以同时更改文件属组
语法格式为:chown [–R] 属主名 文件名 或者 chown [-R] 属主名:属组名 文件名
参数选项:
- -R:递归更改文件所属用户组,就是在更改某个目录文件的所属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
3)、chmod:更改文件的权限
语法格式为:chmod [选项] 文件名
文件权限的设置方法有两种,分别是使用数字和符号来进行权限更改,推荐使用数字,现在我们来学习:
①、数字类型改变文件权限
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-xr],可以发现有些权限没有,那么权限的分数则为:[4+2+1][4+0+1][0+0+0]=750,所以执行:chmod 750 filename。
===============================
②、数字类型改变文件权限
还有一个改变权限的方法,从之前的介绍中我们可以发现,基本上就九个权限分别是:
- 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、文件与目录管理
1)、cd:[change directory] 切换工作目录。
语法格式为:cd [目录名]
例如:
- cd .. :进入上一层目录
- cd /tmp:进入tmp目录
- cd ~:进入当前用户的home目录(或者使用cd ~ username进入到其它用户的home目录)
2)、pwd:[print working directory] 打印当前工作目录。
语法格式为:pwd
只要输入pwd命令就可以打印当前目录,例如:
3)、ls:[list] 打印当前所有目录和文件。
语法格式为:ls [选项] [目录或文件名]
注意:如果ls 命令后边是目录,会显示目录下包含的文件信息,如果是文件名则会显示该文件的信息,如果没有跟任何参数则显示当前工作目录下包含的文件信息。
常用选项:
- -a 显示所有文件,包括隐藏文件
- -l 以长格式显示目录或文件的信息
- -d 只显示目录本身的信息,不显示目录下包含的文件
- -h human readable,用人性化显示的形式查看,比如以 K (KB),M (MB),G(GB)表示文件大小
=======================
简单举例:
4)、mkdir:[make directory] 创建目录。
语法格式为:mkdir [选项] 目录名
常用选项:
- -p 可以用于创建嵌套的多级目录(重要!)
5)、cp:[copy] 复制文件或目录
语法格式为:cp [选项] 源文件或目录 目标文件或目录
常用选项:
- -a 相当于-pdr 连在一起使用
- -p 连同文件的属性一起复制过去,而非使用默认的属性(备份常用)
- -d 如果源文件为连接文件的属性,则复制连接文件属性而非文件本身
- -r 递归复制,用于目录的复制
- -i 如果目标文件已经存在,在覆盖是会先询问操作的进行。
6)、mv:[move] 移动文件或目录
语法格式为:mv [选项] 源文件或目录 目标文件或目录
常用选项:
- -f force强制的意思,如果目标文件已经存在,不会询问而直接覆盖
- -i 如果目标文件已经存在是,就会询问是否覆盖
7)、rm:[remove] 删除文件或目录
语法格式为:rm [选项] 文件或目录
常用选项:
- -r 如果删除的是一个目录,则必须使用这个选项
- -f 强制删除,无须用户确认
- 一般删除目录时,两个选项会同时使用 -rf,但是建议删除前先用 mv 命令将待删除的目录移动到一个指定的回收目录中去,等过一段时间确认不再需要这些文件和目录,再使用 rm 命令将其删除。
- -i 在生成前会询问用户是否操作
8)、touch:用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
语法格式为:touch [-acfm][-d<日期时间>][-r<参考文件或目录>] [-t<日期时间>][--help][--version][文件或目录…]
- -a 改变档案的读取时间记录。
- -m 改变档案的修改时间记录。
- -c 假如目的档案不存在,不会建立新的档案。与 --no-create 的效果一样。
- -f 不使用,是为了与其他 unix 系统的相容性而保留。
- -r 使用参考档的时间记录,与 --file 的效果一样。
- -d 设定时间与日期,可以使用各种不同的格式。
- -t 设定档案的时间记录,格式与 date 指令相同。
- --no-create 不会建立新档案。
- --help 列出指令格式。
- --version 列出版本讯息。
7、关机、重启与sync
关机、重启的命令有:shutdown、reboot、halt、poweroff。其中关机命令用的最多的是shutdown,重启用reboot,所以我们通常只用记住shutdown和reboot这两个目录即可。因为Linux系统的关机、重启是比较重要的操作,所以只有root权限才能操作shutdown、reboot等命令。
1)、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分钟后系统会重启,并且后面的警告信息会给所有在线的用户。
=============================================
2)、reboot:将系统重启,等同于 shutdown –r now
3)、halt:将系统关机,等同于shutdown –h now 和 poweroff
4)、sync:将数据由内存同步到硬盘中。目前shutdown、reboot、halt等命令在关机是都会调用sync这个工具,但是你如果不放心也可以自己多次执行这个目录。
8、重定向与追加
linux中经常会用到将内容输出到某文件当中,只需要在执行命令后面加上>或者>>号即可进入操作。
- >:将一条命令执行的结果(标准输出,或者错误输出,本来都要打印到屏幕上面的)重定向其它输出设备(文件,打开文件操作符,或打印机等等),重定向文件时,覆盖文件原有内容
- >> :将一条命令执行的结果追加到其它输出设备
注意:这两个语法在Shell编程中非常有用,所有我们必须要理解。
简单举例:
更多的Linux命令学习可以参考:https://www.runoob.com/linux/linux-command-manual.html