帮助指令
help
:获取Shell内置帮助信息man
:获取在线文档info
:类似man将文件数据拆成一个一个的段落,每个段落用自己的页面来撰写, 并且在各个页面中还有类似网页的『超链接』来跳到各不同的页面中
$PATH环境变量
在Linux中,环境变量可以由$PATH
变量来获取,就像/bin:/sbin:/usr/bin:……
,其中的冒号使目录与目录之间隔开。
当我们在运行一个命令的时候,举例来说『ls』好了,系统会依照PATH的配置去每个PATH定义的目录下搜寻档名为ls的可运行档, 如果在PATH定义的目录中含有多个档名为ls的可运行档,那么先搜寻到的同名命令先被运行!
这里要说明一件事,在Linux中运行一个命令的方式有两种:
- 使用命令的绝对路径:
比如ls
命令在/bin
下,所以我们可以使用/bin/ls
来运行
1
2zuo@zuo-VirtualBox:~$ /bin/ls
examples.desktop 公共的 模板 视频 图片 文档 下载 音乐 桌面
- 直接运行命令,让系统自行在 $PATH 中查找
除了以上两种,其余的都不行,比如在 /root 下有一个命令 command
, 那么即使我们现在在 /root/ 目录下也不能直接运行它,只能要么使用 /root/command
要么把 /root 加入环境变量中。
将一个目录加入环境变量的方法
1
2
3
4
5
6zuo@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
2zuo@zuo-VirtualBox:~$ pwd -P
/home/zuotree
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 filesrmdir
删除空的目录
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
16zuo@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.cpprm
移除目录或文件的指令,默认状况下只能删除文件不能删除文件夹。
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.cppmv
移动文件或目录,也可以用于重命名。
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命令有两个功能:
用于修改某个文件的时间属性
modification time (mtime):
当该文件的内容数据变更时,就会升级这个时间!
内容数据指的是文件的内容,而不是文件的属性或权限。
status time (ctime):
当该文件的状态 (status)改变时,就会升级这个时间。
举例来说,像是权限与属性被更改了,都会升级这个时间啊。
access time (atime):
当该文件的内容被取用时,就会升级这个访问时间 (access)。
举例来说,我们使用 cat 去读取 /etc/man.config ,就会升级该文件的 atime 了。
用来创建新的空文件
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 TempFilecat
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
6more [选项] <文件>...
选项:
-<数字> 每屏的行数
+<数字> 从指定行开始显示文件
+/<字符串> 从匹配搜索字符串的位置开始显示文件另外在浏览时,还有一些按键可以使用:
- 空白键 (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 这个程序;
head
和tail
顾名思义,是只看 前/后 n行的内容,有趣的是n可以为负数,可以近似的理解为Python中的 [0:n]
1
2
3
4
5
6
7head/tail [-n number] 文件
# 例子
# 显示前10行
head -n 10 src.cpp
# 显示从开头到倒数第10行
head -n -10 src.cppod
使用二进制方式读取文件
1
2
3
4
5
6
7
8
9od [-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 ;