大部分资料来自linux鸟哥私房菜
Linux 目录结构
在 linux 中根目录的子目录结构相对是固定的 (名字固定), 不同的目录功能是也是固定的
bin: binary, 二进制文件目录,存储了可执行程序,今天要将的命令对应的可执行程序都在这个目录中
sbin: super binary, root 用户使用的一些二进制可执行程序
etc: 配置文件目录,系统的或者用户自己安装的应用程序的配置文件都存储在这个目录中
lib: library, 存储了一些动态库和静态库,给系统或者安装的软件使用
media: 挂载目录,挂载外部设备,比如:光驱,扫描仪
mnt: 临时挂载目录,比如我们可以将 U 盘临时挂载到这个目录下
proc: 内存使用的一个映射目录,给操作系统使用的
tmp: 临时目录,存放临时数据,重启电脑数据就被自动删除了
boot: 存储了开机相关的设置
home: 存储了普通用户的家目录,家目录名和用户名相同
root: root 用户的家目录
dev: device , 设备目录,Linux 中一切皆文件,所有的硬件会抽象成文件存储起来,比如:键盘, 鼠标
lost+found: 一般时候是空的,电脑异常关闭 / 崩溃时用来存储这些无家可归的文件,用于用户系统恢复
opt: 第三方软件的安装目录
var: 存储了系统使用的一些经常会发生变化的文件, 比如:日志文件
usr: unix system resource, 系统的资源目录
/usr/bin: 可执行的二进制应用程序
/usr/games: 游戏目录
/usr/include: 包含的标准头文件目录
/usr/local: 和 opt 目录作用相同,安装第三方软件
对于用户自己的文件,一般都是存放到自己的家目录中,也就是 /home/用户名里边,通过指定的相> 应的路径就可以找到这个文件了。关于路径的指定的有两种方式:相对路径和绝对路径。
# 这是在root用户的家目录中, 并且展示了家目录中的子目录的从属关系
[root@VM-8-14-centos ~]# tree
.
|-- ace
| `-- brother
| `-- finally
| `-- die.txt
`-- luffy
`-- get
`-- onepiece
`-- haha.txt
相对路径
相对路径:相对路径就是相对于当前文件的路径。在 Linux 中有两个表示路径的特殊符号:
./:代表目前所在的目录,也可以使用 . 表示。
../:代表当前目录的上一层目录,也可以使用 .. 表示。
以上边的目录为例,从当前 root 家目录 /root, 进入到 onepiece 目录使用相对路径
绝对路径
绝对路径:从系统磁盘起始节点开始描述的路径。
Linux:起始节点为根目录,比如: /root/luffy/get/onepiece
Windows: 起始节点为某个磁盘的盘符,比如:f:\root\luffy\get\onepiece
以上边的目录为例,从当前 root 家目录 /root, 进入到 onepiece 目录使用绝对路径
工作原理
命令解析器在 Linux 操作系统中就是一个进程 (运行的应用程序), 它的名字叫做 bash 通常我们更习惯将其称之为 shell (即: sh)。他们之间的渊源是这样的,在 Unix 操作系统诞生之后一个叫伯恩 (Bourne) 的人为其编写了命令解析器取名为 shell, Linux 操作系统诞生之后伯恩再次改写了 shell (sh), 将其称之为 bash (Bourne Again SHell), bash 就是 sh 的增强版本。
在 Linux 操作系统中默认使用的命令解析器是 bash, 当然也同样支持使用 sh。当用户打开一个终端窗口,并输入相关指令, 按回车键, 这时候命令解析器就开始工作了, 具体步骤如下:
在 Linux 中有一个叫做 PATH 的环境变量,里边存储了一些系统目录 (windows也有, 叫 Path)
# 通过 echo 命令可以查看环境变量 PATH 中的值, 在shell中变量名前加 $ 就是取值
[root@VM-8-14-centos ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
命令解析器需要依次搜索 PATH 中的各个目录,检查这些目录中是否有用户输入的指令
如果找到了,执行该目录下的可执行程序,用户输入的命令就被执行完毕了
如果没有找到,继续搜索其他目录,最后还是没有找到,会提示命令找不到,因此无法被执行
[root@VM-8-14-centos ~]# asdjflksd
-bash: asdjflksd: command not found
命令提示行
在 Linux 终端中,输入要执行的指令之前会有想用的命令提示,我们将其称之为命令提示行,例如:
[root@VM-8-14-centos ~/luffy/get/onepiece]#
[robin@VM-8-14-centos ~/luffy/get/onepiece]$
root : 当前登录的用户的用户名
@: at -> 在
VM-8-14-centos: 主机名,在安装这个 linux 操作系统的时候手动指定,可以修改
~: 当前用户的家目录
在 linux 中有很多用户,每个用户都用一个属于自己的目录,这个目录称之为家目录
普通用户家目录 /home/用户名 , root 用户家目录 /root
~/luffy/get/onepiece: 当前用户所在的工作目录,也可以使用 pwd 命令查看: 代表当前用户是 root 用户
$: 当前用户是普通用户,也就是说例子中的 robin 是一个普通用户
cd 命令
在 Linux 终端中如果想要进行工作路径的切换,需要使用 cd 命令。在进行目录的切换的时候, 我们可以使用相对路径也可以使用绝对路径。
$ cd 目录名
目录名: 使用相对路径 / 绝对路径都可以,该路径必须是一个有效路径
特殊的目录:
..: 表示当前目录的上一级目录,使用 cd .. 或者 cd ../ 都可以
. : 表示当前目录,使用 . 或者./ 都可以,cd . 不会切换目录
进入家目录
每个用户 (普通用户和 root) 都有一个属于自己的目录,比如:
robin 是普通用户,家目录: /home/robin
luffy 是用户,家目录: /home/luffy
root 是管理员用户,家目录: /root
按照上边的格式来表示家目录书写起来比较麻烦,有一种相对简单的写法就是使用 ~ 表示。如果是使用 cd 命令切换到家目录,后边可以什么路径都不加,这样也可以进入到当前用户的家目录。综上所述也就是通过 cd 进入到当前用户的家目录一共有三种不同的方式。
SHELL
$ cd # 方式1
$ cd ~ # 方式2
$ cd /home/用户名 # 方式3
在临近的两个目录之间切换
如果我们要频繁的在两个路径之间切换,也有相关的快捷操作,尤其是对于比较长的路径,可以是这简直是一个福利:
# 通过cd进入到目录1: /usr/include/c++/7.5.0/ext/pb_ds/detail/list_update_map_/
# 通过cd进入到目录2: /home/luffy/get/onepiece/itis/a/goldfish
# 频繁在两个目录之间切换
$ cd
ls 命令
ls 就是 list, 打印指定的文件信息,如果是目录,显示对应目录中有哪些子文件,语法格式如下:
显示所有文件
给 ls 添加 -a 参数(就是 all 的意思)就可以显示指定目录中是所有文件了,因为默认情况下具有隐藏属性的文件是不会显示出来的。那么在 Linux 中什么样是文件才能被隐藏呢?起始很简单只需要在文件名前边加一个点 (.) 文件就具有隐藏属性了, 例如: .demo, .a.txt
# 查看root家目录下所有非隐藏文件
[root@VM-8-14-centos ~]# ls
ace luffy
# 查看root家目录下所有文件 (隐藏 + 非隐藏)
[root@VM-8-14-centos ~]# ls -a
. ace .bash_logout .bashrc .config .lesshst .pip .pydistutils.cfg
.. .bash_history .bash_profile .cache .cshrc luffy .pki .ssh .viminfo
显示文件详细信息
给 ls 添加 -l 参数(就是 list 的意思)我们就可以看到文件的详细信息了,里边的信息量还是非常大的,其中包括: 文件类型 , 文件所有者对文件的操作权限 , 文件所属组用户对文件的操作权限 , 其他人对文件的操作权限 , 硬链接计数 , 文件所有者 , 文件所属组 , 文件大小 , 文件的修改日期 , 文件名
# 显示文件的详细信息
robin@OS:~$ ls -l
total 204
-rw-rw-r-- 1 robin robin 268 Mar 22 17:32 a.c
drwxrwxr-x 2 robin robin 4096 Aug 4 2019 config
-rw-r--r-- 1 robin robin 129487 Dec 25 11:28 english.txt
drwxrwxr-x 4 robin robin 4096 Jan 15 17:48 libevent
drwxrwxr-x 17 robin robin 4096 Apr 13 22:42 Linux
drwxrwxr-x 8 robin robin 4096 Feb 5 16:57 luffy
-rw-r--r-- 1 robin robin 2223 Mar 2 14:39 main.cpp
-rw-rw-r-- 1 robin robin 2167 Dec 1 22:41 mysql_test.c
drwxrwxr-x 9 robin robin 4096 Mar 26 19:19 network
-rw-r--r-- 1 robin robin 1406 Mar 2 20:18 occi.cpp
drwxrwxr-x 3 robin robin 4096 Oct 30 12:09 oradiag_robin
drwxrwxr-x 11 robin robin 4096 Mar 26 09:40 package
drwxrwxr-x 2 robin robin 4096 Dec 29 17:11 process
drwxrwxr-x 17 robin robin 4096 Mar 29 22:31 projects
-rw-r--r-- 1 robin robin 1816 Jan 6 09:37 sidtime.c
drwxrwxr-x 2 robin robin 4096 Mar 22 11:31 socket
-rw-r--r-- 1 robin robin 583 Oct 18 17:21 test.c
-rw-r--r-- 1 robin robin 2015 Mar 1 17:05 test.cpp
-rw-rw-r-- 1 robin robin 2218 Dec 2 17:02 test_mysql.c
drwxrwxr-x 5 robin robin 4096 Jan 13 17:35 udp
# 文件详细信息介绍
d rwx rwx r-x 5 robin robin 4096 Jan 13 17:35 udp
| | | | | | | | | |
文件 文件所 文件所 其他人 硬链接 文件 文件 文件大小 文件修改时间 文件名
类型 有者权限 属组权限 权限 计数 所有者 所属组
在查看文件详细信息的时候,还有一种简单的写法,可以使用 ll 命令:
有些版本的 Linux 中 ll 等价于 ls -l;
有些版本的 Linux 中 ll 等价于 ls -laF;
文件类型
在 Linux 操作系统中,一共有 7 中文件类型,这 7 中类型是根据文件属性进行划分的,而不是根据文件后缀划分的。
-: 普通的文件,在 Linux 终端中没有执行权限的为白色,压缩包为红色,可执行程序为绿色字体
d: 目录 (directory), 在 Linux 终端中为蓝色字体,如果目录的所有权限都是开放的,有绿色的背景色
l: 软链接文件 (link), 相当于 windows 中的快捷方式,在 Linux 终端中为淡蓝色 (青色) 字体
c: 字符设备 (char), 在 Linux 终端中为黄色字体
b: 块设备 (block), 在 Linux 终端中为黄色字体
p: 管道文件 (pipe), 在 Linux 终端中为棕黄色字体
s: 本地套接字文件 (socket), 在 Linux 终端中为粉色字体
用户类型
在 Linux 中有三大类用户: 文件所有者 , 文件所属组用户 , 其他人 , 我们可以对同一个文件给这三种人设置不同的操作权限,用于限制用户对文件的访问。
文件所有者
Linux 中的所有的文件都有一个所有者,就是文件的主人
文件所属组
文件的主人属于哪个组,这个文件默认也就属于哪个组
用户组中可以有多个用户,这些组中的其他用户和所有者的权限可以是不一样的
其他人
这个用户既不是文件所有者也不是文件所属组中的用户,就称之为其他人
其他人对文件也可以拥有某些权限
文件权限
Linux 中不同的用户可以对文件拥有不同的操作权限,权限一共有四种: 读权限 , 写权限 , 执行权限 , 无权限。
读权限:使用 r 表示,即: read
写权限:使用 w 表示,即: write
执行权限:使用 x 表示,即: excute
没有任何权限:使用 - 表示
- rwx rw- r-- 1 robin robin 2218 Dec 2 17:02 app
| | | |
文件类型 文件所有 文件所属 其他人权限
者权限 组权限
从上边的例子中可以看出:
文件所有者对文件有读、写、执行权限
文件所属组用户对文件有 读、写权限, 没有执行权限
其他人对文件有 读权限, 没有写、执行权限
硬链接计数
硬链接计数是一个整数,如果这个数为 N (N>=1),就说明在一个或者多个目录下一共有 N 个文件,但是这 N 个文件并不占用多块磁盘空间,他们使用的是同一块,如果通过其中一个文件修改了磁盘数据,那么其他文件中的内容也就变了。每当我们给给磁盘文件创建一个硬链接(使用 ln),磁盘上就会出现一个新的文件名,硬链接计数加 1,但是这新文件并不占用任何的磁盘空间,文件名还是映射到原来的磁盘地址上。
下图中为大家展示了给文件创建硬链接,和直接进行文件拷贝的区别,创建硬链接只是多了一个新的文件名, 拷贝文件不仅多了新的文件名在磁盘上数据也进行了拷贝
[图片上传中...(image.png-cf4d1d-1625389991024-0)]
其他属性
关于 ls -l 得到的其他属性相对比较简单,最后再给大家介绍一下:
文件大小 —> 单位是字节
如果文件是目录显示为 4096, 这是目录自身大小,不包括目录中的文件大小
文件日期:显示的是文件的修改日期,只要文件被更新,日期也会随之变化
文件名:文件自己的名字(没啥可解释的)
如果文件类型是软连接会这样显示: link -> /root/file/test, 后边的路径表示快捷方式链接的是哪个磁盘文件
单位显示
在查看文件大小的时候,如果文件比较大对应的数组自然也就很大,我们还需要基于字节进行相关的换算,不能直观得到我们想要的结果,如果数学不好,我们可以使用一个参数 -h (human)(就是命令说人话)。
# 直接查看文件大小
[root@VM-8-14-centos ~]# ls -l ipc.tar.gz
-rw-r--r-- 1 root root 122962 Apr 25 2020 ipc.tar.gz
# 添加 -h 参数查看文件大小
[root@VM-8-14-centos ~]# ls -lh ipc.tar.gz
-rw-r--r-- 1 root root 121K Apr 25 2020 ipc.tar.gz
显示目录后缀
在查看文件信息的时候,处理通过文件类型区分该文件是不是一个目录之外,还可以通过一个参数 -F 在目录名后边显示一个 /, 这样就可以直接区分出来了。
# 直接查看文件信息
[root@VM-8-14-centos ~/file]# ls -l
total 8
drwxr-xr-x 2 root root 4096 Jan 25 14:29 dir
-rw-r--r-- 1 root root 0 Jan 25 14:49 haha.tar.gz
-rwxrwxrwx 1 root root 0 Jan 25 14:49 hello
lrwxrwxrwx 1 root root 15 Jan 25 14:30 link -> /root/file/test
prw-r--r-- 1 root root 0 Jan 25 14:24 pipe-2
drwxrwxrwx 2 root root 4096 Jan 25 15:20 subdir
-rw-r--r-- 1 root root 0 Jan 25 14:23 test
# 添加了 -F 参数查看文件信息
[root@VM-8-14-centos ~/file]# ls -lF
total 8
drwxr-xr-x 2 root root 4096 Jan 25 14:29 dir/
-rw-r--r-- 1 root root 0 Jan 25 14:49 haha.tar.gz
-rwxrwxrwx 1 root root 0 Jan 25 14:49 hello*
lrwxrwxrwx 1 root root 15 Jan 25 14:30 link -> /root/file/test
prw-r--r-- 1 root root 0 Jan 25 14:24 pipe-2|
drwxrwxrwx 2 root root 4096 Jan 25 15:20 subdir/
-rw-r--r-- 1 root root 0 Jan 25 14:23 test
创建删除目录
目录的创建分为两种,一种是创建单个目录,另一种是一次性创建多层目录,使用的命令是 mkdir, 后边参数是要创建的目录的名字,如果是多层目录需要添加参数 -p。
关于创建的目录所在的路径可以是相对路径, 也可以是绝对路径。
# 单层目录
$ mkdir 新目录的名字
# 多层目录, 需要加参数 -p
$ mkdir parent/child/baby1/baby2 -p
删除目录
如果要删除已经存在的路径一共有两种方式,可以使用 rmdir 或者 rm
rmdir: 只能删除空目录,有点 low,不好用
rm: 可以删除文件也可以删除目录,如果删除的的是目录,需要加参数 -r, 意思是递归 (recursion)
rm 命令还有另外两个经常使用的参数:
-i: 删除的时候给提示
-f: 强制删除文件,没有提示直接删除并且不能恢复,慎用
SHELL
# 1. low, 矮穷矬, 只能删除空目录
$ rmdir 目录名
# 2. 高大上, 可以删除目录也可以删除文件
# 删除目录需要加参数 -r, 递归的意思, 删除之后是不能恢复的
$ rm 目录名 -r
cp 命令
cp 就是 copy, 拷贝,使用这个命令可以拷贝文件也可以拷贝目录
拷贝文件 => 文件不存在得到新文件, 文件存在就覆盖
# `语法: cp 要拷贝的文件 得到的文件`
# `场景1: 文件A, 将A拷贝一份得到文件B`
$ cp 文件A 文件B
# `场景2: 文件A存在的, 文件B也是存在的, 执行下边的拷贝 ==> 文件A覆盖文件B`
$ cp 文件A 文件B
拷贝目录 ==> 目录不存在得到新目录, 该目录被拷贝到存在的目录中
# 拷贝目录需要参数 -r
# 场景1: 目录A, 通过拷贝得到不存在的目录B
$ cp 目录A 目录B -r
# 场景2: 目录A存在的, 目录B也是存在的, 执行下边的拷贝 ==> 目录A会被拷贝并将其放到目录B中
$ cp 目录A 目录B -r
# 场景3: 把A目录里的某一个或者多个文件拷贝到B目录中
$ cp A/a.txt B # 拷贝 A目录中的 a.txt 到目录B中
$ cp A/* B -r # 拷贝 A目录中的所有文件到目录B中, 不能确定A目录中是否有子目录, 因此需要加 -r
mv 命令
mv 就是 move, 这个 Linux 命令既能移动文件所在目录也可以给文件改名。
文件的移动 文件改名 文件覆盖
# 语法: mv 存在文件A 存在的文件B
# 其中A是文件(非目录)并且是存在的, B也是一个文件(非目录)并且也存在
# A文件中的内容覆盖B文件中的内容, A文件被删除, 只剩下B文件
$ mv A B
查看文件内容
如果想要查看文件内容方式有很多,最常用的是 vim, 下面介绍一下 vim 以外的一些的一些方式:
cat
该命令可以将文件内容显示到终端,由于终端是有缓存的,因此能显示的字节数也是受限制的。 如果文件太大数据就不能完全显示出来了,因此该命令适合查看比较小的文件内容。
$ cat 文件名
more
该命令比 cat 要高级一点,我们可以以翻屏的方式查看文件中的内容,使用方式如下:
$ more 文件名
# 快捷键
- 回车: 显示下一行
- 空格: 向下滚动一屏
- b: 返回上一屏
- q: 退出more
less
该命令和 more 命令差不多,我们可以以翻屏的方式查看文件中的内容,使用方式如下:
SHELL
$ less 文件名
# 快捷键
- b: 向上翻页
- 空格: 向后翻页
- 回车: 显示下一行
- 上下键: 上下滚动
- q:退出
head
使用该命令可以查看文件头部的若干行信息,使用方式如下:
# 默认显示文件的前10行
$ head 文件名
# 指定显示头部的前多少行
$ head -行数 文件名
tail
SHELL
# 默认显示文件的后10行
$ tail 文件名
# 指定显示尾部的最后多少行
$ tail -行数 文件名
链接的创建
链接分两种类型: 软连接和硬链接。软连接相当于 windows 中的快捷方式,硬链接前边也已经介绍过了文件并不会进行拷贝,只是多出一个新的文件名并且硬链接计数会加 1。
软连接
# 语法: ln -s 源文件路径 软链接文件的名字(可以带路径)
# 查看目录文件
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:27 get
-rw-r--r-- 1 root root 37 Jan 25 17:26 onepiece.txt
# 给 onepiece.txt 创建软连接, 放到子目录 get 中
[root@VM-8-14-centos ~/luffy]# ln -s /root/luffy/onepiece.txt get/link.lnk
[root@VM-8-14-centos ~/luffy]# ll get
total 4
lrwxrwxrwx 1 root root 24 Jan 25 17:27 link.lnk -> /root/luffy/onepiece.txt
drwxr-xr-x 2 root root 4096 Jan 24 21:37 onepiece
硬链接
···
语法: ln 源文件 硬链接文件的名字(可以带路径)
创建硬链接文件, 放到子目录中
[root@VM-8-14-centos ~/luffy]# ln onepiece.txt get/link.txt
查看链接文件和硬链接计数, 从 1 --> 2
[root@VM-8-14-centos ~/luffy]# ll get
total 8
lrwxrwxrwx 1 root root 24 Jan 25 17:27 link.lnk -> /root/luffy/onepiece.txt
-rw-r--r-- 2 root root 37 Jan 25 17:26 link.txt
drwxr-xr-x 2 root root 4096 Jan 24 21:37 onepiece
···
修改文件文件权限
文件权限是针对文件所有者 , 文件所属组用户 , 其他人这三类人而言的,对应的操作指令是 chmod。设置方式也有两种,分别为文字设定法和数字设定法。
文字设定法是通过一些关键字 r, w, x, - 来描述用户对文件的操作权限。
数字设定法是通过一些数字 0, 1, 2, 4, 5, 6, 7 来描述用户对文件的操作权限。
#chmod
# 语法格式: chmod who [+|-|=] mod 文件名
- who:
- u: user -> 文件所有者
- g: group -> 文件所属组用户
- o: other -> 其他
- a: all, 以上是三类人 u+g+o
- 对权限的操作:
+: 添加权限
-: 去除权限
=: 权限的覆盖
- mod: 权限
r: read, 读
w: write, 写
x: execute, 执行
-: 没有权限
# 将文件所有者权限设置为读和执行, 也就是权限覆盖
robin@OS:~/Linux$ chmod u=rx b.txt
robin@OS:~/Linux$ ll b.txt
-r-xrw-r-- 2 robin robin 2929 Apr 14 18:53 b.txt*
# 给其他人添加写和执行权限
robin@OS:~/Linux$ chmod o+wx b.txt
robin@OS:~/Linux$ ll b.txt
-r-xrw-rwx 2 robin robin 2929 Apr 14 18:53 b.txt*
# 给文件所属组用户去掉读和执行权限
robin@OS:~/Linux$ chmod g-rx b.txt
robin@OS:~/Linux$ ll b.txt
-r-x-w-rwx 2 robin robin 2929 Apr 14 18:53 b.txt*
# 将文件所有者,文件所属组用户,其他人权限设置为读+写+执行
robin@OS:~/Linux$ chmod a=rwx b.txt
robin@OS:~/Linux$ ll b.txt
-rwxrwxrwx 2 robin robin 2929 Apr 14 18:53 b.txt*
数字设定法
# 语法格式: chmod [+|-|=] mod 文件名
- 对权限的操作:
+: 添加权限
-: 去除权限
=: 权限的覆盖, 等号可以不写
- mod: 权限描述, 所有权限都放开是 7
- 4: read, r
- 2: write, w
- 1: execute , x
- 0: 没有权限
# 分解: chmod 0567 a.txt
0 5 6 7
八进制 文件所有者 文件所属组用户 其他人
r + x r + w r+w+x
######################### 举例 #########################
# 查看文件 c.txt 的权限
robin@OS:~/Linux$ ll c.txt
-rwxrwxrwx 2 robin robin 2929 Apr 14 18:53 c.txt*
# 文件所有者去掉执行权限, 所属组用户去掉写权限, 其他人去掉读+写权限
robin@OS:~/Linux$ chmod -123 c.txt
robin@OS:~/Linux$ ll c.txt
-rw-r-xr-- 2 robin robin 2929 Apr 14 18:53 c.txt*
# 文件所有者添加执行权限, 所属组用户和其他人权限不变
robin@OS:~/Linux$ chmod +100 c.txt
robin@OS:~/Linux$ ll c.txt
-rwxr-xr-- 2 robin robin 2929 Apr 14 18:53 c.txt*
# 将文件所有者,文件所属组用户,其他人权限设置为读+写, 没有执行权限
robin@OS:~/Linux$ chmod 666 c.txt
robin@OS:~/Linux$ ll c.txt
-rw-rw-rw- 2 robin robin 2929 Apr 14 18:53 c.txt
修改文件所有者
默认情况下,文件是通过哪个用户创建出来的,就属于哪个用户,这个用户属于哪个组,文件就属于哪个组。如果有特殊需求,可以修改文件所有者,对应的操作命令是 chown。因为修改文件所有者就跨用户操作,普通用户没有这个权限,需要借助管理员权限才能完成该操作。
普通用户借助管理员权限执行某些shell命令, 需要在命令前加关键字sudo, 但是普通用户默认是没有使用 sudo的资格的, 需要修改 /etc/sudoers 文件 。
# 语法1-只修改所有者:
$ sudo chown 新的所有者 文件名
# 语法2-同时修改所有者和所属组:
$ sudo chown 新的所有者:新的组名 文件名
# 查看文件所有者:b.txt 属于 robin 用户
robin@OS:~/Linux$ ll b.txt
-rw-rw-rw- 2 robin robin 2929 Apr 14 18:53 b.txt
# 将 b.txt 的所有者修改为 luffy
robin@OS:~/Linux$ sudo chown luffy b.txt
[sudo] password for robin:
robin@OS:~/Linux$ ll b.txt
-rw-rw-rw- 2 luffy robin 2929 Apr 14 18:53 b.txt
# 修改文件所有者和文件所属组
# 查看文件所有者和所属组
robin@OS:~/Linux$ ll b.txt
-rw-rw-rw- 2 luffy robin 2929 Apr 14 18:53 b.txt
# 同时修改文件所有者和文件所属组
robin@OS:~/Linux$ sudo chown robin:luffy b.txt
robin@OS:~/Linux$ ll b.txt
-rw-rw-rw- 2 robin luffy 2929 Apr 14 18:53 b.txt
修改文件所属组
普通用户没有修改文件所属组的权限,如果需要修改需要借助管理员权限才能完成,需要使用的命令是 chgrp。当然了这个属性的修改也可以使用 chown 命令来完成。
# 只修改文件所属的组, 普通用户没有这个权限, 借助管理员的权限
# 语法: sudo chgrp 新的组 文件名
# 查看文件所属组信息
robin@OS:~/Linux$ ll b.txt
-rw-rw-rw- 2 robin luffy 2929 Apr 14 18:53 b.txt
# 修改文件所属的组
robin@OS:~/Linux$ sudo chgrp robin b.txt
robin@OS:~/Linux$ ll b.txt
-rw-rw-rw- 2 robin robin 2929 Apr 14 18:53 b.txt
tree 命令
该命令的作用是以树状结构显示目录 , tree 工具默认是没有的,需要手动安装,系统版本不同安装方式也不尽相同:
ubuntu: sudo apt install tree
centos: sudo yum install tree
如果是基于管理员用户安装软件,不需要加 sudo。该命令有一个常用参数 -L, 即 (layer) 显示目录的层数。
# 语法格式
$ tree [-L n] # 查看当前目录的结构, n为显示的目录层数
$ tree 目录名 [-L n] # 查看指定目录的结构, n为显示的目录层数
# 只显示1层
[root@VM-8-14-centos ~]# tree -L 1
.
|-- ace
|-- file
|-- ipc.tar.gz
|-- link.lnk -> /root/luffy/onepiece.txt
`-- luffy
# 显示2层目录
[root@VM-8-14-centos ~]# tree -L 2
.
|-- ace
| `-- brother
|-- file
| |-- dir
| |-- haha.tar.gz
| |-- hello
| |-- link -> /root/file/test
| |-- pipe-2
| |-- subdir
| `-- test
|-- ipc.tar.gz
|-- link.lnk -> /root/luffy/onepiece.txt
`-- luffy
|-- get
`-- onepiece.txt
pwd 命令
pwd 命令用户当前所在的工作目录,没有参数,直接执行该命令即可。
# 查看当前用户在哪个目录中, 所在的目录一般称之为工作目录
[root@VM-8-14-centos ~/luffy/get/onepiece]# pwd
/root/luffy/get/onepiece # 当前工作目录
touch 命令
使用 touch 命令可以创建一个新的空文件 , 如果指定的文件是已存在的,只会更新文件的修改日期,对内容没有任何影响。
# 语法: touch 文件名
# 查看目录信息
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:38 get
-rw-r--r-- 2 root root 37 Jan 25 17:26 onepiece.txt
# 创建一个新的文件 robin.txt
[root@VM-8-14-centos ~/luffy]# touch robin.txt
# 再次查看目录中的文件信息, 发现 robin.txt是空的, 大小为 0
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:38 get
-rw-r--r-- 2 root root 37 Jan 25 17:26 onepiece.txt
-rw-r--r-- 1 root root 0 Jan 25 17:54 robin.txt
# touch 后的参数指定一个已经存在的文件名
[root@VM-8-14-centos ~/luffy]# touch onepiece.txt
# 继续查看目录中的文件信息, 发现文件时间被更新了: 37 Jan 25 17:26 --> 37 Jan 25 17:54
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:38 get
-rw-r--r-- 2 root root 37 Jan 25 17:54 onepiece.txt
-rw-r--r-- 1 root root 0 Jan 25 17:54 robin.txt
which 命令
which 命令可以查看要执行的命令所在的实际路径,命令解析器工作的时候也会搜索这个目录。需要注意的是该命令只能查看非内建的shell指令所在的实际路径, 有些命令是直接写到内核中的, 无法查看。
我们使用的大部分 shell 命令都是放在系统的 /bin 或者 /usr/bin 目录下:
# 由于使用的Linux版本不同, 得到的路径也会有不同
[root@VM-8-14-centos ~]# which ls
alias ls='ls --color=auto'
/usr/bin/ls
[root@VM-8-14-centos ~]# which date
/usr/bin/date
[root@VM-8-14-centos ~]# which cp
alias cp='cp -i'
/usr/bin/cp
[root@VM-8-14-centos ~]# which mv
alias mv='mv -i'
/usr/bin/mv
[root@VM-8-14-centos ~]# which pwd
/usr/bin/pwd
重定向命令
关于重定向使用最多的是就是输出重定向 , 顾名思义就是修改输出的数据的位置,通过重定向操作我们可以非常方便的进行文件的复制,或者文件内容的追加。输出重定向使用的不是某个关键字而是符号 > 或者 >>。
: 将文件内容写入到指定文件中,如果文件中已有数据,则会使用新数据覆盖原数据
: 将输出的内容追加到指定的文件尾部
# 输出的重定向举例: printf默认是要将数据打印到终端, 可以修改默认的输出位置 => 重定向到某个文件中
# 关键字 >
# 执行一个shell指令, 获得一个输出, 这个输出默认显示到终端, 如果要将其保存到文件中, 就可以使用重定向
# 如果当前目录下test.txt不存在, 会被创建, 如果存在, 内容被覆盖
$ date > test.txt
# 日期信息被写入到文件 test.txt中
robin@OS:~/Linux$ cat test.txt
Wed Apr 15 09:37:52 CST 2020
# 如果不希望文件被覆盖, 而是追加, 需要使用 >>
in@OS:~/Linux$ date >> test.txt
# 日期信息被追加到 test.txt中
robin@OS:~/Linux$ cat test.txt
Wed Apr 15 09:37:52 CST 2020
Wed Apr 15 09:38:44 CST 2020
# 继续追加信息
robin@OS:~/Linux$ date >> test.txt
robin@OS:~/Linux$ cat test.txt
Wed Apr 15 09:37:52 CST 2020
Wed Apr 15 09:38:44 CST 2020
Wed Apr 15 09:39:03 CST 2020
由于昨天出去玩了所以只看了一天,暂时就更新这么多...
7.7肚子疼 更新部分
切换用户
Linux 是一个多用户的操作系统,可以同时登陆多个用户,因此很多时候需要在多个用户之间切换,用户切换需要使用 su 或者 su -。使用 su 只切换用户,当前的工作目录不会变化,但是使用 su - 不仅会切换用户也会切换工作目录,工作目录切换为当前用户的家目录。
从用户 A 切换到用户 B, 如果还想再切换回用户 A,可以直接使用 exit。
# 只切换用户, 工作目录不变
$ su 用户名
# 举例:
robin@OS:~/Linux$ su hws
Password: # 需要输入hws用户的密码
hws@OS:/home/robin/Linux$ # 工作目录不变
# 切换用户和工作目录, 会自动跳转到当前用户的家目录中
$ su - 用户名
# 举例:
robin@OS:~/Linux$ su - hws
Password: # 需要输入hws用户的密码
hws@OS:~$ pwd
/home/luffy # 工作目录变成了hws的家目录
# 回到原来的用户
$ exit
添加删除用户
作为一个普通用户是没有给系统添加新用户这个权限的,如果想要添加新用户可以先切换到 root 用户,或者基于普通用户为其添加管理员权限来完成新用户的添加。添加新用户需要使用 adduser/useradd 命令来完成。
普通用户没有添加 / 删除用户的权限,需要授权
# 添加用户
# sudo -> 使用管理员权限执行这个命令
$ sudo adduser 用户名
# centos
$ sudo useradd 用户名
# ubuntu
$ sudo useradd -m -s /bin/bash 用户名
# 在使用 adduser 添加新用户的时候,有的Linux版本执行完命令就结束了,有的版本会提示设置密码等用户信息
robin@OS:~/Linux$ sudo adduser lisi
Adding user `lisi' ...
Adding new group `lisi' (1004) ...
Adding new user `lisi' (1004) with group `lisi' ...
Creating home directory `/home/lisi' ...
Copying files from `/etc/skel' ...
Enter new UNIX password:
Retype new UNIX password:
passwd: password updated successfully
Changing the user information for lisi
Enter the new value, or press ENTER for the default
Full Name []:
Room Number []:
Work Phone []:
Home Phone []:
Other []:
Is the information correct? [Y/n] y
当新用户添加完毕之后,我们可以切换到新添加的用户下,用来检测是否真的添加成功了,另外我们也可以使用其他方式来检验,首先在 /home 目录中会出现一个和用户名同名的目录,这就是新创建的用户的家目录,另外我们还可以查看 /etc/passwd 文件,里边记录着新添加的用户的更加详细的信息:
删除用户
删除用户并不是将 /home 下的用户家目录删除就完事儿了,我们需要使用 userdle 命令才能删除用户在系统中的用户 ID 和所属组 ID 等相关信息,但是需要注意的是在某些Linux版本中用户虽然被删除了, 但是它的家目录却没有被删除,需要我们手动将其删除。
# 删除用户, 添加参数 -r 就可以一并删除用户的家目录了
$ sudo userdel 用户名 -r
# 删除用户 lisi
$ sudo userdel lisi -r
# 使用deluser不能添加参数-r, 家目录不能被删除, 需要使用 rm 命令删除用户的家目录, 比如:
$ sudo rm /home/用户名 -r
添加删除用户组
默认情况下,只要创建新用户就会得到一个同名的用户组,并且这个用户属于这个组。一般情况下不需要创建新的用户组,如果有需求可以使用 groupadd 添加用户组,使用 groupdel 删除用户组。
由于普通用户没有添加删除用户组权限,因此需要在管理员(root)用户下操作,或者在普通用户下借助管理员权限完成该操作。
# 基于普通用户创建新的用户组
$ sudo groupadd 组名
# 基于普通用户删除已经存在的用户组
$ sudo groupdel 组名
如果验证用户组是否添加成功了,可以查看 /etc/group 文件,里边有用户组相关的信息:
修改密码
Linux 中设置用户密码和修改用户密码的方式是一样的,修改用户密码又分几种情况: 修改当前用户密码 , 普通用户A修改其他普通用户密码 , 普通用户A修改root用户密码 , root用户修改普通用户密码。修改密码需要使用 passwd 命令。当创建了一个普通用户却没有提示指定密码,或者忘记了用户密码都可以通过该命令来实现自己重置密码的需求。
当前用户修改自己的密码,默认是有权限操作的
当前普通用户修改其他用户密码,默认没有权限,需要借助管理员权限才能完成操作
当前普通用户修改 root 用户密码,默认没有权限,需要借助管理员权限才能完成操作
root 用户修改其他普通用户密码,默认有权限,可以直接修改
# passwd
# 修改当前用户
$ passwd
# 修改非当前用户密码
$ sudo passwd 用户名
# 修改root
$ sudo passwd root
先更这些...