文件管理命令

1. cd 命令

在Linux终端中如果想要进行工作路径的切换, 需要使用cd命令。在进行目录的切换的时候, 我们可以使用相对路径也可以使用绝对路径。

  • 进入指定目录

    1
    $ cd 目录名
    • 目录名: 使用相对路径/绝对路径都可以, 该路径必须是一个有效路径
    • 特殊的目录:
      • ..: 表示当前目录的上一级目录, 使用cd .. 或者 cd ../都可以
      • . : 表示当前目录, 使用 .或者./都可以, cd .不会切换目录
  • 进入家目录

    每个用户(普通用户和root)都有一个属于自己的目录, 比如:

    • robin是普通用户, 家目录: /home/robin

    • luffy是用户, 家目录: /home/luffy

    • root是管理员用户, 家目录: /root

    按照上边的格式来表示家目录书写起来比较麻烦, 有一种相对简单的写法就是使用 ~ 表示。如果是使用cd命令切换到家目录, 后边可以什么路径都不加, 这样也可以进入到当前用户的家目录。综上所述也就是通过cd进入到当前用户的家目录一共有三种不同的方式。

    1
    2
    3
    $ cd                    # 方式1
    $ cd ~ # 方式2
    $ cd /home/用户名 # 方式3
  • 在临近的两个目录之间切换

    如果我们要频繁的在两个路径之间切换, 也有相关的快捷操作, 尤其是对于比较长的路径, 可以是这简直是一个福利:

    1
    2
    3
    4
    # 通过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 -

2. ls 命令

ls 就是 list, 打印指定的文件信息, 如果是目录, 显示对应目录中有哪些子文件, 语法格式如下:

1
2
3
$ ls [args]           # 查看当前目录
$ ls [args] 目录名 # 查看指定目录
$ ls [args] 文件名 # 查看某个文件的信息

2.1 显示所有文件

ls添加 -a参数(就是 all 的意思)就可以显示指定目录中是所有文件了, 因为默认情况下具有隐藏属性的文件是不会显示出来的。那么在Linux中什么样是文件才能被隐藏呢?起始很简单只需要在文件名前边加一个点(.)文件就具有隐藏属性了, 例如: .demo, .a.txt

1
2
3
4
5
6
7
8
# 查看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

2.2 显示文件详细信息

ls添加 -l参数(就是 list 的意思)我们就可以看到文件的详细信息了, 里边的信息量还是非常大的, 其中包括: 文件类型, 文件所有者对文件的操作权限, 文件所属组用户对文件的操作权限, 其他人对文件的操作权限, 硬链接计数, 文件所有者, 文件所属组, 文件大小, 文件的修改日期, 文件名

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 显示文件的详细信息
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

2.2.1 文件类型

在Linux操作系统中, 一共有7中文件类型, 这7中类型是根据文件属性进行划分的, 而不是根据文件后缀划分的。

  1. -: 普通的文件, 在Linux终端中没有执行权限的为白色, 压缩包为红色, 可执行程序为绿色字体
  2. d: 目录(directory), 在Linux终端中为蓝色字体, 如果目录的所有权限都是开放的, 有绿色的背景色
  3. l: 软链接文件(link), 相当于windows中的快捷方式, 在Linux终端中为淡蓝色(青色)字体
  4. c: 字符设备(char), 在Linux终端中为黄色字体
  5. b: 块设备(block), 在Linux终端中为黄色字体
  6. p: 管道文件(pipe), 在Linux终端中为棕黄色字体
  7. s: 本地套接字文件(socket), 在Linux终端中为粉色字体

2.2.2 用户类型

在Linux中有三大类用户: 文件所有者, 文件所属组用户, 其他人, 我们可以对同一个文件给这三种人设置不同的操作权限, 用于限制用户对文件的访问。

  • 文件所有者
    • Linux中的所有的文件都有一个所有者, 就是文件的主人
  • 文件所属组
    • 文件的主人属于哪个组, 这个文件默认也就属于哪个组
    • 用户组中可以有多个用户, 这些组中的其他用户和所有者的权限可以是不一样的
  • 其他人
    • 这个用户既不是文件所有者也不是文件所属组中的用户,就称之为其他人
    • 其他人对文件也可以拥有某些权限

2.2.3 文件权限

Linux中不同的用户可以对文件拥有不同的操作权限, 权限一共有四种: 读权限, 写权限, 执行权限, 无权限

  • 读权限:使用 r表示, 即: read
  • 写权限:使用 w表示, 即: write
  • 执行权限:使用 x表示, 即: excute
  • 没有任何权限:使用-表示
1
2
3
4
   -           rwx          rw-          r--  1 robin robin   2218 Dec  2 17:02 app
| | | |
文件类型 文件所有 文件所属 其他人权限
者权限 组权限

从上边的例子中可以看出:

  • 文件所有者对文件有读、写、执行权限
  • 文件所属组用户对文件有 读、写权限, 没有执行权限
  • 其他人对文件有 读权限, 没有写、执行权限

2.2.4 硬链接计数

硬链接计数是一个整数,如果这个数为N(N>=1),就说明在一个或者多个目录下一共有N个文件, 但是这N个文件并不占用多块磁盘空间, 他们使用的是同一块, 如果通过其中一个文件修改了磁盘数据, 那么其他文件中的内容也就变了。每当我们给给磁盘文件创建一个硬链接(使用 ln),磁盘上就会出现一个新的文件名,硬链接计数加1,但是这新文件并不占用任何的磁盘空间,文件名还是映射到原来的磁盘地址上。

下图中为大家展示了给文件创建硬链接, 和直接进行文件拷贝的区别, 创建硬链接只是多了一个新的文件名, 拷贝文件不仅多了新的文件名在磁盘上数据也进行了拷贝

2.2.5 其他属性

关于ls -l得到的其他属性相对比较简单, 最后再给大家介绍一下:

  • 文件大小 —> 单位是字节
    • 如果文件是目录显示为4096, 这是目录自身大小, 不包括目录中的文件大小
  • 文件日期: 显示的是文件的修改日期, 只要文件被更新, 日期也会随之变化
  • 文件名: 文件自己的名字(没啥可解释的)
    • 如果文件类型是软连接会这样显示: link -> /root/file/test, 后边的路径表示快捷方式链接的是哪个磁盘文件

2.3 其他参数

2.3.1 单位显示

在查看文件大小的时候, 如果文件比较大对应的数组自然也就很大, 我们还需要基于字节进行相关的换算, 不能直观得到我们想要的结果, 如果数学不好, 我们可以使用一个参数 -h (human)(就是命令说人话)。

1
2
3
4
5
6
7
# 直接查看文件大小
[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

2.3.2 显示目录后缀

在查看文件信息的时候, 处理通过文件类型区分该文件是不是一个目录之外, 还可以通过一个参数 -F在目录名后边显示一个/, 这样就可以直接区分出来了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 直接查看文件信息
[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

3. 创建删除目录

  • 创建目录

    目录的创建分为两种, 一种是创建单个目录, 另一种是一次性创建多层目录, 使用的命令是mkdir, 后边参数是要创建的目录的名字, 如果是多层目录需要添加参数-p

    关于创建的目录所在的路径可以是相对路径, 也可以是绝对路径。

    1
    2
    3
    4
    5
    # 单层目录
    $ mkdir 新目录的名字

    # 多层目录, 需要加参数 -p
    $ mkdir parent/child/baby1/baby2 -p
  • 删除目录

    如果要删除已经存在的路径一共有两种方式, 可以使用rmdir或者rm

    • rmdir: 只能删除空目录,有点low,不好用

    • rm: 可以删除文件也可以删除目录, 如果删除的的是目录, 需要加参数 -r, 意思是递归(recursion)

    rm命令还有另外两个经常使用的参数:

    • -i: 删除的时候给提示
    • -f: 强制删除文件, 没有提示直接删除并且不能恢复, 慎用
    1
    2
    3
    4
    5
    6
    # 1. low, 矮穷矬, 只能删除空目录
    $ rmdir 目录名

    # 2. 高大上, 可以删除目录也可以删除文件
    # 删除目录需要加参数 -r, 递归的意思, 删除之后是不能恢复的
    $ rm 目录名 -r

4. cp 命令

cp 就是copy, 拷贝, 使用这个命令可以拷贝文件也可以拷贝目录

  • 拷贝文件 => 文件不存在得到新文件, 文件存在就覆盖

    1
    2
    3
    4
    5
    6
    7
    # `语法: cp 要拷贝的文件  得到的文件`

    # `场景1: 文件A, 将A拷贝一份得到文件B`
    $ cp 文件A 文件B

    # `场景2: 文件A存在的, 文件B也是存在的, 执行下边的拷贝 ==> 文件A覆盖文件B`
    $ cp 文件A 文件B
  • 拷贝目录 ==> 目录不存在得到新目录, 该目录被拷贝到存在的目录中

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 拷贝目录需要参数 -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

5. mv 命令

mv 就是move, 这个Linux命令既能移动文件所在目录也可以给文件改名。

  • 文件的移动

    1
    2
    3
    4
    # 语法: mv 要移动的文件  目录
    # 有一个文件A, 移动到目录B中
    # 其中A可以是文件也可以是目录, B必须是目录而且必须是存在的
    $ mv A B
  • 文件改名

    1
    2
    3
    # 语法: mv 要改名的文件  新名字(原来是不存在的,这点很重要)
    # 其中A可以是文件也可以是目录,并且是存在的, B原来是不存在的
    $ mv A B
  • 文件覆盖

    1
    2
    3
    4
    # 语法: mv 存在文件A  存在的文件B
    # 其中A是文件(非目录)并且是存在的, B也是一个文件(非目录)并且也存在
    # A文件中的内容覆盖B文件中的内容, A文件被删除, 只剩下B文件
    $ mv A B

6 查看文件内容

如果想要查看文件内容方式有很多, 最常用的是vim, 下面介绍一下vim以外的一些的一些方式:

  • cat

    该命令可以将文件内容显示到终端, 由于终端是有缓存的, 因此能显示的字节数也是受限制的。 如果文件太大数据就不能完全显示出来了,因此该命令适合查看比较小的文件内容。

    1
    $ cat 文件名
  • more

    该命令比cat要高级一点, 我们可以以翻屏的方式查看文件中的内容,使用方式如下:

    1
    2
    3
    4
    5
    6
    $ more 文件名
    # 快捷键
    - 回车: 显示下一行
    - 空格: 向下滚动一屏
    - b: 返回上一屏
    - q: 退出more
  • less

    该命令和more命令差不多, 我们可以以翻屏的方式查看文件中的内容,使用方式如下:

    1
    2
    3
    4
    5
    6
    7
    $ less 文件名
    # 快捷键
    - b: 向上翻页
    - 空格: 向后翻页
    - 回车: 显示下一行
    - 上下键: 上下滚动
    - q:退出
  • head

    使用该命令可以查看文件头部的若干行信息, 使用方式如下:

    1
    2
    3
    4
    # 默认显示文件的前10行
    $ head 文件名
    # 指定显示头部的前多少行
    $ head -行数 文件名
  • tail

    使用该命令可以查看文件尾部的若干行信息, 使用方式如下:

    1
    2
    3
    4
    # 默认显示文件的后10行
    $ tail 文件名
    # 指定显示尾部的最后多少行
    $ tail -行数 文件名

7. 链接的创建

链接分两种类型: 软连接硬链接。软连接相当于windows中的快捷方式,硬链接前边也已经介绍过了文件并不会进行拷贝,只是多出一个新的文件名并且硬链接计数会加1。

  • 软连接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    # 语法: 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

    在创建软链接的时候, 命令中的 源文件路径建议使用绝对路径, 这样才能保证创建出的软链接文件在任意目录中移动都可以访问到链接的那个源文件。

  • 硬链接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 语法: 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

    硬链接和软链接不同, 它是通话文件名直接找对应的硬盘地址, 而不是基于路径, 因此 源文件使用相对路径即可, 无需为其制定绝对路径。

    目录是不允许创建硬链接的。

8. 文件属性

文件属性相关的命令主要是修改用户对文件的操作权限, 文件所有者, 文件所属组的相关信息。

8.1 修改文件文件权限

文件权限是针对文件所有者, 文件所属组用户, 其他人这三类人而言的, 对应的操作指令是chmod。设置方式也有两种,分别为文字设定法数字设定法

文字设定法是通过一些关键字r, w, x, -来描述用户对文件的操作权限。

数字设定法是通过一些数字 0, 1, 2, 4, 5, 6, 7 来描述用户对文件的操作权限。

  • 文字设定法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    #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*
  • 数字设定法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    # 语法格式: 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

8.2 修改文件所有者

默认情况下, 文件是通过哪个用户创建出来的, 就属于哪个用户, 这个用户属于哪个组, 文件就属于哪个组。如果有特殊需求,可以修改文件所有者,对应的操作命令是chown。因为修改文件所有者就跨用户操作, 普通用户没有这个权限, 需要借助管理员权限才能完成该操作。

普通用户借助管理员权限执行某些shell命令, 需要在命令前加关键字sudo, 但是普通用户默认是没有使用 sudo的资格的, 需要修改 /etc/sudoers 文件

普通用户添加sudo权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 语法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

8.3 修改文件所属组

普通用户没有修改文件所属组的权限, 如果需要修改需要借助管理员权限才能完成,需要使用的命令是chgrp。当然了这个属性的修改也可以使用chown命令来完成。

1
2
3
4
5
6
7
8
9
10
11
# 只修改文件所属的组, 普通用户没有这个权限, 借助管理员的权限
# 语法: 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

9. 其他命令

9.1 tree命令

该命令的作用是以树状结构显示目录, tree工具默认是没有的, 需要手动安装, 系统版本不同安装方式也不尽相同:

  • ubuntu: sudo apt install tree
  • centos: sudo yum install tree

如果是基于管理员用户安装软件,不需要加sudo。该命令有一个常用参数 -L, 即 (layer) 显示目录的层数。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 语法格式
$ 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

9.2 pwd命令

pwd命令用户当前所在的工作目录, 没有参数, 直接执行该命令即可。

1
2
3
# 查看当前用户在哪个目录中, 所在的目录一般称之为工作目录
[root@VM-8-14-centos ~/luffy/get/onepiece]# pwd
/root/luffy/get/onepiece # 当前工作目录

9.3 touch命令

使用touch命令可以创建一个新的空文件, 如果指定的文件是已存在的, 只会更新文件的修改日期, 对内容没有任何影响。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 语法: 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

9.4 which命令

which命令可以查看要执行的命令所在的实际路径, 命令解析器工作的时候也会搜索这个目录。需要注意的是该命令只能查看非内建的shell指令所在的实际路径, 有些命令是直接写到内核中的, 无法查看

我们使用的大部分shell命令都是放在系统的/bin或者/usr/bin目录下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 由于使用的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

9.5 重定向命令

关于重定向使用最多的是就是输出重定向, 顾名思义就是修改输出的数据的位置, 通过重定向操作我们可以非常方便的进行文件的复制, 或者文件内容的追加。输出重定向使用的不是某个关键字而是符号 >或者>>

  • >: 将文件内容写入到指定文件中, 如果文件中已有数据, 则会使用新数据覆盖原数据
  • >>: 将输出的内容追加到指定的文件尾部
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 输出的重定向举例: 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

10. 视频讲解

以上知识点对应的视频讲解可以关注 B站-爱编程的大丙
视频地址: https://www.bilibili.com/video/BV13U4y1p7kB