6-实用指令 Part1

帮助指令

  • help:获取Shell内置帮助信息

  • man:获取在线文档

  • info:类似man

    将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的『超链接』来跳到各不同的页面中

$PATH环境变量

 在Linux中,环境变量可以由$PATH变量来获取,就像/bin:/sbin:/usr/bin:……,其中的冒号使目录与目录之间隔开。

 当我们在运行一个命令的时候,举例来说『ls』好了,系统会依照PATH的配置去每个PATH定义的目录下搜寻档名为ls的可运行档, 如果在PATH定义的目录中含有多个档名为ls的可运行档,那么先搜寻到的同名命令先被运行!

 这里要说明一件事,在Linux中运行一个命令的方式有两种:

  • 使用命令的绝对路径:

比如ls命令在/bin下,所以我们可以使用/bin/ls来运行

1
2
zuo@zuo-VirtualBox:~$ /bin/ls
examples.desktop 公共的 模板 视频 图片 文档 下载 音乐 桌面

  • 直接运行命令,让系统自行在 $PATH 中查找

 除了以上两种,其余的都不行,比如在 /root 下有一个命令 command, 那么即使我们现在在 /root/ 目录下也不能直接运行它,只能要么使用 /root/command 要么把 /root 加入环境变量中。

  • 将一个目录加入环境变量的方法

    1
    2
    3
    4
    5
    6
    zuo@zuo-VirtualBox:~$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
    # 将/root加入环境变量
    zuo@zuo-VirtualBox:~$ PATH="$PATH":/root
    zuo@zuo-VirtualBox:~$ echo $PATH
    /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/root

    使用这种方法,只对当前会话有效,也就是说每当登出或注销系统以后,PATH设置就会失效。

    不过,为了安全起见,不建议将.加入PATH的搜寻目录中

目录与路径相关

  • cd

  • pwd

    注意pwd打印的是当前的连接地址,如果要想知道真实地址,需要带上-P参数

    1
    2
    zuo@zuo-VirtualBox:~$ pwd -P
    /home/zuo
  • tree

    1
    2
    3
    4
    5
    用法: tree [选项]

    -a 显示所有
    -d 只显示目录
    -L Level 只显示Level层
  • mkdir

    创建一个空目录,默认情况下其父目录必须存在,访问权限为默认权限umask

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    用法:mkdir [选项]... 目录...

    -m, --mode=MODE 配置文件的权限
    -p, --parents 直接将所需要的目录(包含上一级目录)递回创建起来

    # 例子
    zuo@zuo-VirtualBox:~/Sample$ ls -a
    . ..
    zuo@zuo-VirtualBox:~/Sample$ mkdir ./1/1
    mkdir: 无法创建目录"./1/1": 没有那个文件或目录
    zuo@zuo-VirtualBox:~/Sample$ mkdir -p ./1/1
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    └── 1
    └── 1
    2 directories, 0 files
  • rmdir

    删除空的目录

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    用法:rmdir [选项]... 目录...
    删除指定的空目录。
    -p, --parents remove DIRECTORY and its ancestors;
    e.g., 'rmdir -p a/b/c' is similar to 'rmdir a/b/c a/b a', a b c are all empty

    # 例子
    # Sample目录下结构如下
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    └── 1
    └── 1
    └── 1

    3 directories, 0 files
    # 由于目录 1 非空,所以不能删除
    zuo@zuo-VirtualBox:~/Sample$ rmdir -p 1
    rmdir: 删除 '1' 失败: 目录非空
    # 加上参数-p,相当于 rmdir 1/1/1 1/1 1
    zuo@zuo-VirtualBox:~/Sample$ rmdir -p 1/1/1
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    0 directories, 0 files

文件与目录管理

  • ls

    列出目录和文件的信息,默认是列出当前路径的所有目录和文件

    1
    2
    3
    4
    5
    6
    用法:ls [选项]... [文件]...
    -a, --all 不隐藏任何以. 开始的项目(常用)
    -d, --directory 仅列出目录本身,而不是列出目录内的文件数据(常用)
    -l 使用较长格式列出信息(常用)
    -R, --recursive 递归显示子目录
    -s, --size 以块数形式显示每个文件分配的尺寸
  • cp

    复制文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    用法:cp [选项]... [-T] 源文件 目标文件
     或:cp [选项]... 源文件... 目录
     或:cp [选项]... -t 目录 源文件...
    Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.

    必选参数对长短选项同时适用。
    -a, --archive 等于-dR --preserve=all
    -i, --interactive 若目标档(destination)已经存在时,在覆盖时会先询问动作的进行
    -p 等于--preserve=模式,所有权,时间戳
    -R, -r, --recursive 递归复制目录及其子目录内的所有内容

    给出几个使用的例子

    1
    2
    3
    4
    5
    6
    7
    8
    # 例子
    # 将Temp.cpp 复制到目录 1/ 下
    zuo@zuo-VirtualBox:~/Sample$ cp Temp.cpp 1
    # 将Temp.cpp 复制到目录 1/ 下,并重命名为Temp2.cpp
    zuo@zuo-VirtualBox:~/Sample$ cp Temp.cpp 1/Temp2.cpp
    # 带上参数 -i ,然后输入 y/n
    zuo@zuo-VirtualBox:~/Sample$ cp -i Temp.cpp 1
    cp:是否覆盖'1/Temp.cpp'? n

    不过要注意一个问题,正常使用cp拷贝过去的文件,只拷贝了文件内容而不拷贝文件权限、、时间等信息,如果要完整拷贝所有内容和权限、信息,需要使用-a参数

    1
    2
    3
    4
    5
    6
    7
    8
    # 可以看到,文件信息不同
    zuo@zuo-VirtualBox:~/Sample$ ll Temp.cpp; ll 1/Temp.cpp
    -rw-r--r-- 1 zuo zuo 71 7月 18 18:19 Temp.cpp
    -rw-r--r-- 1 zuo zuo 71 7月 18 18:24 1/Temp.cpp
    # 使用 -a 参数
    zuo@zuo-VirtualBox:~/Sample$ ll Temp.cpp; ll 1/Temp.cpp
    -rw-r--r-- 1 zuo zuo 71 7月 18 18:19 Temp.cpp
    -rw-r--r-- 1 zuo zuo 71 7月 18 18:19 1/Temp.cpp

    还可以使用-r来拷贝整个文件夹

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    ├── 1
    │   └── Temp.cpp
    ├── 2
    └── Temp.cpp
    # 将整个目录 1 拷贝到 目录 2 下
    zuo@zuo-VirtualBox:~/Sample$ cp -r 1 2
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    ├── 1
    │   └── Temp.cpp
    ├── 2
    │   └── 1
    │   └── Temp.cpp
    └── Temp.cpp
  • rm

    移除目录或文件的指令,默认状况下只能删除文件不能删除文件夹

    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
    用法:rm [选项]... [文件]...
    Remove (unlink) the FILE(s).

    -f, --force 忽略不存在的文件,不会出现警告信息
    -i 互动模式,在删除前会询问使用者是否动作
    -r, -R, --recursive 递归删除整个目录和其内容(非常危险!)

    # 例子
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    ├── 1
    │   ├── Temp2.cpp
    │   └── Temp.cpp
    ├── 2
    │   └── 1
    │   └── Temp.cpp
    └── Temp.cpp

    # 删除 1/Temp.cpp
    zuo@zuo-VirtualBox:~/Sample$ rm 1/Temp.cpp
    # 删除 1/Temp2.cpp 删前询问
    zuo@zuo-VirtualBox:~/Sample$ rm -i 1/Temp2.cpp
    rm:是否删除普通文件 '1/Temp2.cpp'? y
    # 删除整个目录 2
    zuo@zuo-VirtualBox:~/Sample$ rm -r 2
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    ├── 1
    └── Temp.cpp
  • mv

    移动文件或目录,也可以用于重命名。

    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
    用法:mv [选项]... 源文件 目标文件
     或:mv [选项]... 源文件... 目录(保留源文件名)

    -f, --force 覆盖前不询问
    -i, --interactive 覆盖前询问
    -n, --no-clobber 不覆盖已存在文件
    -u 若目标文件已经存在,且 source 比较新,才会更新
    如果您指定了-i、-f、-n 中的多个,仅最后一个生效。

    # 例子
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    ├── 1
    ├── 2
    └── Temp.cpp

    # 重命名文件
    zuo@zuo-VirtualBox:~/Sample$ mv Temp.cpp Src.cpp
    zuo@zuo-VirtualBox:~/Sample$ cp Src.cpp Src2.cpp
    zuo@zuo-VirtualBox:~/Sample$ ls
    1 2 Src2.cpp Src.cpp
    # 移动文件
    zuo@zuo-VirtualBox:~/Sample$ mv Src.cpp 1; mv Src2.cpp 2/Src.cpp
    # 移动整个目录
    zuo@zuo-VirtualBox:~/Sample$ mv 1 2/2-1
    zuo@zuo-VirtualBox:~/Sample$ tree
    .
    └── 2
    ├── 2-1
    │   └── Src.cpp
    └── Src.cpp

文件内容管理

  • touch

    touch命令有两个功能:

    1. 用于修改某个文件的时间属性

      • modification time (mtime)

        当该文件的内容数据变更时,就会升级这个时间!

        内容数据指的是文件的内容,而不是文件的属性或权限。

      • status time (ctime)

        当该文件的状态 (status)改变时,就会升级这个时间。

        举例来说,像是权限与属性被更改了,都会升级这个时间啊。

      • access time (atime)

        该文件的内容被取用时,就会升级这个访问时间 (access)。

        举例来说,我们使用 cat 去读取 /etc/man.config ,就会升级该文件的 atime 了。

    2. 用来创建新的空文件

    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
    用法:touch [选项]... 文件...

    必选参数对长短选项同时适用。
    -a 只更改访问时间
    -c, --no-create 不创建任何文件
    -d, --date=string 使用指定字符串表示时间而非当前时间
    -m 只更改修改时间
    -r, --reference=FILE use this file's times instead of current time
    -t STAMP use [[CC]YY]MMDDhhmm[.ss] instead of current time
    --time=WORD change the specified time:
    WORD is access, atime, or use: equivalent to -a
    WORD is modify or mtime: equivalent to -m

    # 例子
    # 创建空文件: touch filename ,若 filename 不存在会创建同名空文件
    zuo@zuo-VirtualBox:~/Sample$ touch TempFile
    zuo@zuo-VirtualBox:~/Sample$ ls
    1 2 TempFile
    # 查看mtime, atime, ctime, ll 是 ls -l 的一个别名
    zuo@zuo-VirtualBox:~/Sample$ ll TempFile; ll --time=atime TempFile; ll --time=ctime TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:11 TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:11 TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:11 TempFile
    # touch filename ,若 filename 存在会更新它的时间
    zuo@zuo-VirtualBox:~/Sample$ touch TempFile
    zuo@zuo-VirtualBox:~/Sample$ ll TempFile; ll --time=atime TempFile; ll --time=ctime TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:21 TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:21 TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:21 TempFile
    # 使用字符串形式修改访问时间
    zuo@zuo-VirtualBox:~/Sample$ touch -ad "2018/7/16 15:03" TempFile
    zuo@zuo-VirtualBox:~/Sample$ ll TempFile; ll --time=atime TempFile; ll --time=ctime TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:21 TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 16 15:03 TempFile
    -rw-r--r-- 1 zuo zuo 0 7月 18 12:31 TempFile
  • cat

    cat 是 Concatenate (连续)的简写, 主要的功能是将一个文件的内容连续的印出在萤幕上面,如果没有指定文件,或者文件为"-",则从标准输入读取

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    用法:cat [选项]... [文件]...
    如果没有指定文件,或者文件为"-",则从标准输入读取。

    -b, --number-nonblank 列出行号,仅针对非空白行做行号显示,空白行不标行号
    -n, --number 列印出行号,连同空白行也会有行号
    -T, --show-tabs 将跳格字符显示为^I
    -E, --show-ends 将结尾的断行字节 $ 显示出来
    -v, --show-nonprinting 列出一些看不出来的特殊字符,使用^ 和M- 引用,除了LFD和 TAB 之外
    -e 和 -vE 等价
    -t 和 -vT 等价
    -A, --show-all 相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已
  • more

    将文件内容显示在屏幕上,但是是一页一页翻动而不是一次性全部显示在屏幕上

    1
    2
    3
    4
    5
    6
     more [选项] <文件>...

    选项:
    -<数字> 每屏的行数
    +<数字> 从指定行开始显示文件
    +/<字符串> 从匹配搜索字符串的位置开始显示文件

    另外在浏览时,还有一些按键可以使用:

    • 空白键 (space):代表向下翻一页;
    • Enter :代表向下翻『一行』;
    • /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
    • = :显示行号
    • :f :立刻显示出档名以及目前显示的行数;
    • q :代表立刻离开 more ,不再显示该文件内容。
    • f/Ctrl+f :向下翻页
    • b/Ctrl+b :往回翻页
  • less:推荐使用less替代more

    类似more,但是用法比起 more 又更加的有弹性。在 more 的时候,我们并没有办法向前面翻, 只能往后面看,但若使用了 less 时,就可以使用 PgUp/PgDn 等按键的功能来往前往后翻看文件 。此外,它还提供了更加丰富的查找功能。

    • 空白键 :向下翻动一页;
    • pagedown :向下翻动一页;
    • pageup :向上翻动一页;
    • /字串 :向下搜寻『字串』的功能;
    • ?字串 :向上搜寻『字串』的功能;
    • n :重复前一个搜寻 (与 / 或 ? 有关!)
    • N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
    • q :离开 less 这个程序;
  • headtail

    顾名思义,是只看 前/后 n行的内容,有趣的是n可以为负数,可以近似的理解为Python中的 [0:n]

    1
    2
    3
    4
    5
    6
    7
    head/tail [-n number] 文件 

    # 例子
    # 显示前10行
    head -n 10 src.cpp
    # 显示从开头到倒数第10行
    head -n -10 src.cpp
  • od

    使用二进制方式读取文件

    1
    2
    3
    4
    5
    6
    7
    8
    9
    od [-t TYPE] 文件

    -t :后面可以接各种『类型 (TYPE)』的输出,例如:
    a :利用默认的字节来输出;
    c :使用 ASCII 字节来输出
    d[size] :利用十进位(decimal)来输出数据,每个整数占用 size bytes ;
    f[size] :利用浮点数值(floating)来输出数据,每个数占用 size bytes ;
    o[size] :利用八进位(octal)来输出数据,每个整数占用 size bytes ;
    x[size] :利用十六进位(hexadecimal)来输出数据,每个整数占用 size bytes ;