Linux 基础指令速查:从 ls 到 tar 的常用命令全解析
前言
本篇文章将带你了解Linux中基础的指令,话不多说,直接开始吧。
一、命令总览
| 分类 | 命令 |
|---|---|
| 目录与文件 | ls、pwd、cd、touch、mkdir、rmdir、rm、cp、mv、cat、more、less、head、tail |
| 查找与帮助 | man、find、which、whereis、grep |
| 时间与日历 | date、cal |
| 压缩与打包 | zip/unzip、tar、rzsz |
| 系统信息与工具 | alias、top、bc、uname、file、shutdown |
| 权限管理 | su、chmod、chown、chgrp、umask、sudo |
二、目录与文件操作类
1. ls 指令
语法
bash
ls [选项] [目录或文件]
功能:对于目录,该命令列出该目录下的所有子目录与文件;对于文件,将列出文件名以及其他信息。
常用选项
| 选项 | 说明 |
|---|---|
-a |
列出目录下的所有文件,包括以 . 开头的隐含文件 |
-d |
将目录像文件一样显示,而不是显示其下的文件,如 ls -d 指定目录 |
-i |
输出文件的 i 节点的索引信息,如 ls -ai 指定文件 |
-k |
以 k 字节的形式表示文件的大小,如 ls -alk 指定文件 |
-l |
列出文件的详细信息 |
-n |
用数字的 UID、GID 代替名称 |
-F |
在每个文件名后附上一个字符以说明该文件的类型:* 表示可执行的普通文件,/ 表示目录,@ 表示符号链接,` |
-r |
对目录反向排序 |
-t |
以时间排序 |
-s |
在文件名后输出该文件的大小(可用于大小排序,如找出目录下最大的文件) |
-R |
列出所有子目录下的文件(递归) |
-1 |
一行只输出一个文件 |
举例
bash
[whb@bite-alicloud test]$ ls
dir file.txt
[whb@bite-alicloud test]$ ls -a
. .. dir file.txt
[whb@bite-alicloud test]$ ls -a -l
total 12
drwxrwxr-x 3 whb whb 4096 Jan 11 15:01 .
drwx------ 22 whb whb 4096 Jan 11 14:21 ..
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[whb@bite-alicloud test]$ ls -a -l -F
total 12
drwxrwxr-x 3 whb whb 4096 Jan 11 15:01 ./
drwx------ 22 whb whb 4096 Jan 11 14:21 ../
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir/
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[whb@bite-alicloud test]$ ls -alFn
total 12
drwxrwxr-x 3 1003 1003 4096 Jan 11 15:01 ./
drwx------ 22 1003 1003 4096 Jan 11 14:21 ../
drwxrwxr-x 2 1003 1003 4096 Jan 11 14:22 dir/
-rw-rw-r-- 1 1003 1003 0 Jan 11 14:22 file.txt
可以看到,-F 会在文件名后追加类型字符,-n 会把用户名和组名换成数字 ID。
2. pwd 命令
语法
bash
pwd
功能:显示用户当前所在的目录。
常用选项:无
举例
bash
[whb@bite-alicloud test]$ pwd
/home/whb/test
3. cd 指令
补充知识:路径的认识
- Linux 系统中,磁盘上的文件和目录被组成一棵目录树,每个节点都是目录或文件。
- 其中普通文件一定是目录树的叶子节点;目录可能是叶子(空目录),也可能是路上节点。
- 路径存在的意义:树状组织方式都是为了保证快速定位查找到指定的文件,而定位文件就需要具有唯一性的方案。其中任何一个节点都只有一个父节点,所以从根目录开始定位指定文件,路径具有唯一性。
- 绝对路径 :一般从
/开始,不依赖其他目录来定位文件的方式。- 相对路径:相对于当前用户所处目录,定位文件的路径方式。
- 绝对路径一般不会随着用户的路径变化而丧失唯一性,通常在特定服务的配置文件中被使用;相对路径因为便捷,一般在命令行中使用较多。
语法
bash
cd 目录名
功能:改变工作目录,将当前工作目录改变到指定的目录下。
举例
bash
# 返回上级目录
[whb@bite-alicloud ~]$ pwd
/home/whb
[whb@bite-alicloud ~]$ cd ..
[whb@bite-alicloud home]$ pwd
/home
# 绝对路径定位目录或者文件
[whb@bite-alicloud home]$ pwd
/home
[whb@bite-alicloud home]$ cd /home/whb/test
[whb@bite-alicloud test]$ pwd
/home/whb/test
# 相对路径定位目录或者文件
[whb@bite-alicloud test]$ pwd
/home/whb/test
[whb@bite-alicloud test]$ cd ../temp/
[whb@bite-alicloud temp]$ pwd
/home/whb/temp
# 每一次新建一个用户都会在 /home 目录下为新用户创建新的工作目录,目录以新用户名称命名
# root 用户在安装操作系统的时候,就已经内置了工作目录: /root
[whb@bite-alicloud temp]$ ls /home
bss gaobo luojie whb wudu
# 快速进入自己的家目录
[whb@bite-alicloud test]$ whoami
whb
[whb@bite-alicloud test]$ pwd
/home/whb/test
[whb@bite-alicloud test]$ cd ~
[whb@bite-alicloud ~]$ pwd
/home/whb
# 返回到最近访问目录
[whb@bite-alicloud ~]$ pwd # 当前在 /home/whb 目录下
/home/whb
[whb@bite-alicloud ~]$ cd / # 进入 / 目录
[whb@bite-alicloud /]$ pwd
/
[whb@bite-alicloud /]$ cd - # 直接可以回退到最近一次所处的目录: /home/whb
/home/whb
[whb@bite-alicloud ~]$ pwd
/home/whb
[whb@bite-alicloud ~]$ cd - # 直接可以回退到最近一次所处的目录: /
/
[whb@bite-alicloud /]$ pwd
/
[whb@bite-alicloud /]$ cd - # 同上
/home/whb
[whb@bite-alicloud ~]$ pwd
/home/whb
4. touch 指令
补充知识:文件类型的认识
语法
bash
touch [选项]... 文件...
功能:touch 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。
常用选项
-a:change only the access time-c:change only the modification time
举例
bash
# 创建普通文件
[whb@bite-alicloud test]$ ls
dir file.txt
[whb@bite-alicloud test]$ touch newFile.txt
[whb@bite-alicloud test]$ ls
dir file.txt newFile.txt
# 查看文件时间
[whb@bite-alicloud test]$ stat newFile.txt
File: 'newFile.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 1844719 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1003/ whb) Gid: ( 1003/ whb)
Access: 2023-01-11 15:06:45.832787572 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:06:45.832787572 +0800
Birth: -
# 修改文件 access 时间
[whb@bite-alicloud test]$ touch -a newFile.txt
[whb@bite-alicloud test]$ stat newFile.txt
File: 'newFile.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 1844719 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1003/ whb) Gid: ( 1003/ whb)
Access: 2023-01-11 15:07:00.062846804 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:07:00.062846804 +0800 # 该时间为何会变化?
Birth: -
# 修改文件 Modify 时间
[whb@bite-alicloud test]$ touch -m newFile.txt
[whb@bite-alicloud test]$ stat newFile.txt
File: 'newFile.txt'
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fd01h/64769d Inode: 1844719 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1003/ whb) Gid: ( 1003/ whb)
Access: 2023-01-11 15:07:00.062846804 +0800
Modify: 2023-01-11 15:09:19.428426903 +0800
Change: 2023-01-11 15:09:19.428426903 +0800
Birth: -
更多细节(三个时间的区别、inode 与文件的对应关系)会在基础 IO 部分统一讲解。
5. mkdir 指令
语法
bash
mkdir [选项] dirname...
功能 :在当前目录下创建一个名为 dirname 的目录。
常用选项
-p/--parents:可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录。
举例
bash
# 创建普通空目录
[whb@bite-alicloud test]$ ls -l
total 4
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
[whb@bite-alicloud test]$ mkdir mydir
[whb@bite-alicloud test]$ ls -l
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
# 递归建立多个目录,创建指定路径
[whb@bite-alicloud test]$ mkdir -p path1/path2/path3/path4
[whb@bite-alicloud test]$ ls -l
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:16 path1
[whb@bite-alicloud test]$ tree path1
path1
└── path2
└── path3
└── path4
tree命令是一个递归以树状结构显示指定目录的命令,如果没有安装:
- 如果当前用户是 root:
yum install -y tree- 如果当前用户是普通用户:
sudo yum install -y tree
6. rmdir 指令 && rm 指令
rmdir 是一个与 mkdir 相对应的命令,mkdir 是建立目录,而 rmdir 是删除命令。
语法
bash
rmdir [-p] [dirName]
适用对象:具有当前目录操作权限的所有使用者
功能:删除空目录
常用选项
-p:当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。
举例
bash
# 删除空目录
[whb@bite-alicloud test]$ ll
total 12
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 whb whb 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:16 path1
[whb@bite-alicloud test]$ tree mydir/
mydir/
0 directories, 0 files
[whb@bite-alicloud test]$ rmdir mydir
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:16 path1
# 删除路径
[whb@bite-alicloud test]$ tree path1
path1
└── path2
└── path3
└── path4
3 directories, 0 files
[whb@bite-alicloud test]$ rmdir -p path1/path2/path3/path4
[whb@bite-alicloud test]$ ll
total 4
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
# 指定路径中有不为空的路径,便无法删除
[whb@bite-alicloud test]$ rmdir -p path1/path2/path3
rmdir: failed to remove 'path1/path2/path3': Directory not empty
rm 命令可以同时删除文件或目录。
语法
bash
rm [-f-i-r-v] [dirName/dir]
适用对象:所有使用者
功能:删除文件或目录
常用选项
-f:即使文件属性为只读(即写保护),亦直接删除-i:删除前逐一询问确认-r:删除目录及其下所有文件
举例
bash
# 删除普通文件
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
[whb@bite-alicloud test]$ rm file.txt
[whb@bite-alicloud test]$ ll
total 8
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
# 删除目录文件
[whb@bite-alicloud test]$ rm dir
rm: cannot remove 'dir': Is a directory
[whb@bite-alicloud test]$ rm -r dir
[whb@bite-alicloud test]$ ll
total 4
-rw-rw-r-- 1 whb whb 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 whb whb 4096 Jan 11 15:26 path1
# 删除普通文件前询问
[whb@bite-alicloud test]$ rm -i newFile.txt
rm: remove regular empty file 'newFile.txt'? y
# 删除目录前询问
[whb@bite-alicloud test]$ mkdir -p d/d/d/d
[whb@bite-alicloud test]$ rm -ri d
rm: descend into directory 'd'? y
rm: descend into directory 'd/d'? y
rm: descend into directory 'd/d/d'? y
rm: remove directory 'd/d/d/d'? y
rm: remove directory 'd/d/d'? y
rm: remove directory 'd/d'? y
rm: remove directory 'd'? y
# 递归强制删除非空目录
[whb@bite-alicloud test]$ rm -f path1
rm: cannot remove 'path1': Is a directory
[whb@bite-alicloud test]$ rm -rf path1
[whb@bite-alicloud test]$ ll
total 0
7. man 指令
Linux 的命令有很多参数,我们不可能全记住,可以通过查看联机手册获取帮助。
语法
bash
man [选项] 命令
常用选项
-k:根据关键字搜索联机帮助num:只在第 num 章节查找-a:将所有章节的都显示出来。比如man printf它缺省从第一章开始搜索,找到就停止;用a选项,当按下 q 退出,它会继续往后面搜索,直到所有章节都搜索完毕
man 手册分为 9 章(不同系统可能会有差别):
- 是普通的命令
- 是系统调用,如 open、write 之类的(通过这个至少可以很方便地查到调用这个函数需要加什么头文件)
- 是库函数,如 printf、fread
- 是特殊文件,也就是
/dev下的各种设备文件 - 是指文件的格式,比如 passwd,就会说明这个文件中各个字段的含义
- 是给游戏留的,由各个游戏自己定义
- 是附件还有一些变量,比如像 environ 这种全局变量在这里就有说明
- 是系统管理用的命令,这些命令只能由 root 使用,如 ifconfig
- 略
举例
bash
[whb@bite-alicloud test]$ man printf # 查看 printf 指令(没错,printf 也是一个指令)
[whb@bite-alicloud test]$ man fork # 查看系统调用,默认没有这个指令,man 就自动去 2 号手册查找
[whb@bite-alicloud test]$ man 2 frok # 查看系统调用
[whb@bite-alicloud test]$ man 3 printf # 查看 C 库函数
[whb@bite-alicloud test]$ man 7 signal # 查看变量
[whb@bite-alicloud test]$ man 7 environ
[whb@bite-alicloud test]$ man man # 查看 man 手册自己
8. cp 指令
语法
bash
cp [选项] 源文件或目录 目标文件或目录
功能:复制文件或目录
说明
- cp 指令用于复制文件或目录
- 如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中
常用选项
-f或--force:强行复制文件或目录,不论目的文件或目录是否已经存在-i或--interactive:覆盖文件之前先询问用户-r:递归处理,将指定目录下的文件与子目录一并处理。若源文件或目录的形态不属于目录或符号链接,则一律视为普通文件处理
举例
bash
# cp 普通文件
[whb@bite-alicloud test]$ echo "你好比特就业课" > myfile.txt
[whb@bite-alicloud test]$ cat myfile.txt
你好比特就业课
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ cat myfile-backup.txt
你好比特就业课
# 将多个文件拷贝到指定路径下
[whb@bite-alicloud test]$ mkdir dir
[whb@bite-alicloud test]$ cp *.txt dir # * 表示通配符,匹配所有 .txt 结尾的文件名
[whb@bite-alicloud test]$ tree dir
dir
├── myfile-backup.txt
└── myfile.txt
# cp 如果目标文件存在,就覆盖
[whb@bite-alicloud test]$ echo "hello bite tech" > myfile.txt
[whb@bite-alicloud test]$ cp myfile.txt myfile-backup.txt
[whb@bite-alicloud test]$ cat myfile-backup.txt
hello bite tech
# 拷贝前询问
[whb@bite-alicloud test]$ cp -i myfile.txt myfile-backup.txt
cp: overwrite 'myfile-backup.txt'? y
# 递归强制拷贝整个目录
[whb@bite-alicloud ~]$ tree test
test
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
[whb@bite-alicloud ~]$ cp -rf test test-backup
[whb@bite-alicloud ~]$ tree test-backup
test-backup
├── dir
│ ├── myfile-backup.txt
│ └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
9. mv 指令
mv 命令是 move 的缩写,可以用来移动文件或者将文件改名(move (rename) files),经常用来备份文件或者目录。
语法
bash
mv [选项] 源文件或目录 目标文件或目录
功能
- 视 mv 命令中第二个参数类型的不同(是目标文件还是目标目录),mv 命令将文件重命名或将其移至一个新的目录中。
- 当第二个参数类型是文件时,mv 命令完成文件重命名,此时源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。
- 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标目录中。
常用选项
-f:force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖-i:若目标文件(destination)已经存在时,就会询问是否覆盖!
举例
bash
# 更改名称
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ mv myfile.txt yourfile.txt
# 如果当前路径存在同名文件,改名即覆盖
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ mv yourfile.txt myfile.txt
# 如果当前路径存在同名文件,改名前可以添加 i 选项,让系统提出警告供用户做选择
[whb@bite-alicloud test]$ mv -i yourfile.txt myfile.txt
mv: overwrite 'myfile.txt'? y
# mv 整个目录
[whb@bite-alicloud test]$ touch myfile.txt
[whb@bite-alicloud test]$ mkdir temp
[whb@bite-alicloud test]$ mv myfile.txt temp
[whb@bite-alicloud test]$ ls
temp
[whb@bite-alicloud test]$ mv temp ../
[whb@bite-alicloud test]$ ls
[whb@bite-alicloud test]$ ls -d ../temp
../temp
10. cat 指令
语法
bash
cat [选项] [文件]
功能:查看目标文件的内容。
常用选项
-b:对非空输出行编号,空行不做编号-n:对输出的所有行编号-s:不输出多行空行
举例
bash
# 命令行构建多行文本
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 20 ]; do echo "hello bite"; let cnt++; done > temp.txt
# 测试 cat 基本命令
[whb@bite-alicloud test]$ cat temp.txt
hello bite
(共 21 行 hello bite,此处省略)
# cat 输出携带行号
[whb@bite-alicloud test]$ cat -b temp.txt
1 hello bite
2 hello bite
3 hello bite
...
# 修改 temp.txt,使其携带多行空行后,测试 -b 对非空输出行编号
[whb@bite-alicloud test]$ vim temp.txt
[whb@bite-alicloud test]$ cat -b temp.txt
1 hello bite
2 hello bite
3 hello bite
4 hello bite
5 hello bite
6 hello bite
7 hello bite
...
# 测试 -n 对输出的所有行编号
[whb@bite-alicloud test]$ cat -n temp.txt
1 hello bite
2 hello bite
3 hello bite
4
5
6
7 hello bite
8 hello bite
9
10 hello bite
11 hello bite
...
# 测试 -s 不输出多行空行,多行空行压缩成为一行
[whb@bite-alicloud test]$ cat -s temp.txt
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
...
11. more 指令
语法
bash
more [选项]
功能:more 命令,功能类似 cat。
常用选项
-n:指定输出行数q:退出 more
举例
bash
# 命令行输出多行文本
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 2000 ]; do echo "hello bite"; let cnt++; done > temp.txt
# -n 指定输出行数
[whb@bite-alicloud test]$ more -10 temp.txt
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
hello bite
--More--(0%)
12. less 指令
- less 工具也是对文件或其它输出进行分页显示的工具,应该说是 Linux 正统查看文件内容的工具,功能极其强大。
- less 的用法比起 more 更加的有弹性,在 more 的时候,我们并没有办法向前面翻,只能往后面看。
- 但若使用了 less 时,就可以使用
[pageup][pagedown]等按键的功能来往前往后翻看文件,更容易用来查看一个文件的内容。 - 除此之外,在 less 里头可以拥有更多的搜索功能,不止可以向下搜,也可以向上搜。
语法
bash
less [参数] 文件
功能:less 与 more 类似,但使用 less 可以随意浏览文件,而 more 仅能向前移动,却不能向后移动,而且 less 在查看之前不会加载整个文件。
选项
-i:忽略搜索时的大小写-N:显示每行的行号/字符串:向下搜索"字符串"的功能?字符串:向上搜索"字符串"的功能n:重复前一个搜索(与/或?有关)N:反向重复前一个搜索(与/或?有关)q:quit
举例
bash
# 命令行输出多行文本
[whb@bite-alicloud test]$ cnt=0; while [ $cnt -le 2000 ]; do echo "hello $cnt"; let cnt++; done > temp.txt
# 测试搜索和 -N 等功能
[whb@bite-alicloud test]$ less -N temp.txt
1 hello 0
2 hello 1
3 hello 2
4 hello 3
5 hello 4
6 hello 5
7 hello 6
8 hello 7
9 hello 8
10 hello 9
11 hello 10
12 hello 11
13 hello 12
14 hello 13
...
# 其他选项也可以直接测试
13. head 指令
head 与 tail 就像它的名字一样的浅显易懂,它是用来显示开头或结尾某个数量的文字区块,head 用来显示档案的开头至标准输出中,而 tail 想当然尔就是看档案的结尾。
语法
bash
head [参数]... [文件]...
功能:head 用来显示档案的开头至标准输出中,默认 head 命令打印其相应文件的开头 10 行。
选项
-n<行数>:显示的行数
举例
bash
[whb@bite-alicloud test]$ head temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9
[whb@bite-alicloud test]$ head -5 temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
14. tail 指令
tail 命令从指定点开始将文件写到标准输出。使用 tail 命令的 -f 选项可以方便的查阅正在改变的日志文件,tail -f filename 会把 filename 里最尾部的内容显示在屏幕上,并且不断刷新,使你看到最新的文件内容。
语法
bash
tail [必要参数] [文件]
功能:用于显示指定文件末尾内容,不指定文件时,作为输入信息进行处理。常用查看日志文件。
选项
-f:循环读取-n<行数>:显示行数
举例(顺便讲解重定向和管道)
bash
# 基本功能演示
[whb@bite-alicloud test]$ tail temp.txt
hello 1991
hello 1992
hello 1993
hello 1994
hello 1995
hello 1996
hello 1997
hello 1998
hello 1999
hello 2000
[whb@bite-alicloud test]$ tail -3 temp.txt
hello 1998
hello 1999
hello 2000
综合问题:如何显示文件的 180,200 行内容?
bash
[whb@bite-alicloud test]$ head -200 temp.txt | tail -20
hello 180
hello 181
hello 182
...
hello 199
三、查找与帮助类
15. find 指令
- Linux 下 find 命令在目录结构中搜索文件,并执行指定的操作。
- Linux 下 find 命令提供了相当多的查找条件,功能很强大。由于 find 具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。
- 即使系统中含有网络文件系统(NFS),find 命令在该文件系统中同样有效,只要你具有相应的权限。
- 在运行一个非常消耗资源的 find 命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指 30G 字节以上的文件系统)。
语法
bash
find pathname -options
功能:用于在文件树中查找文件,并作出相应的处理(可能访问磁盘)。
常用选项
-name:按照文件名查找文件- 其他选项需要再查,这个命令其实比较复杂
举例
bash
# 在指定路径下搜索指定名称的文件
[whb@bite-alicloud test]$ find ~ -name test.c
/home/whb/test_code/old_code/test.c
/home/whb/test_code/test.c
...
16. which 指令
功能:搜索系统指定的命令。
举例
bash
[whb@bite-alicloud test]$ which ls
alias ls='ls --color=auto'
/usr/bin/ls
[whb@bite-alicloud test]$ which pwd
/usr/bin/pwd
17. whereis 指令
功能:用于找到程序的源、二进制文件或手册。
举例
bash
[whb@bite-alicloud test]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
[whb@bite-alicloud test]$ whereis libc.so
libc: /usr/lib64/libc.so /usr/lib64/libc.a /usr/share/man/man7/libc.7.gz
18. grep 指令
语法
bash
grep [选项] 搜寻字符串 文件
功能:在文件中搜索字符串,将找到的行打印出来。
常用选项
-i:忽略大小写的不同,所以大小写视为相同-n:顺便输出行号-v:反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
举例
bash
# 文件内容
[whb@bite-alicloud test]$ cat temp.txt
abcd
ABCD
hello
bite
1234
# 基本查找
[whb@bite-alicloud test]$ grep "abcd" temp.txt
abcd
# 忽略大小写的不同,所以大小写视为相同
[whb@bite-alicloud test]$ grep -i "abcd" temp.txt
abcd
ABCD
# 顺便输出行号
[whb@bite-alicloud test]$ grep -n "abcd" temp.txt
1:abcd
[whb@bite-alicloud test]$ grep -ni "abcd" temp.txt
1:abcd
2:ABCD
# 反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行
[whb@bite-alicloud test]$ grep -v "abcd" temp.txt
ABCD
hello
bite
1234
[whb@bite-alicloud test]$ grep -vn "abcd" temp.txt
2:ABCD
3:hello
4:bite
5:1234
[whb@bite-alicloud test]$ grep -vni "abcd" temp.txt
3:hello
4:bite
5:1234
四、时间与日历类
19. date 指令
指定格式显示时间:
bash
date +%Y:%m:%d
用法
bash
date [OPTION]... [+FORMAT]
1. 在显示方面,使用者可以设定欲显示的格式,格式设定为一个加号后接数个标记,其中常用的标记列表如下:
%H:小时 (00...23)%M:分钟 (00...59)%S:秒 (00...61)%X:相当于%H:%M:%S%d:日 (01...31)%m:月份 (01...12)%Y:完整年份 (0000...9999)%F:相当于%Y-%m-%d
2. 在设定时间方面
bash
date -s # 设置当前时间,只有 root 权限才能设置,其他只能查看
date -s 20080523 # 设置成 20080523,这样会把具体时间设置成空 00:00:00
date -s 01:01:01 # 设置具体时间,不会对日期做更改
date -s "01:01:01 2008-05-23" # 这样可以设置全部时间
date -s "01:01:01 20080523" # 这样可以设置全部时间
date -s "2008-05-23 01:01:01" # 这样可以设置全部时间
date -s "20080523 01:01:01" # 这样可以设置全部时间
3. 时间戳
- 时间 -> 时间戳:
date +%s - 时间戳 -> 时间:
date -d@1508749502 - Unix 时间戳(英文为 Unix epoch, Unix time, POSIX time 或 Unix timestamp)是从 1970 年 1 月 1 日(UTC/GMT 的午夜)开始所经过的秒数,不考虑闰秒。
4. 举例
bash
# 显示常规时间
[whb@bite-alicloud test]$ date
Wed Jan 11 18:22:50 CST 2023
[whb@bite-alicloud test]$ date +%Y/%m/%d
2023/01/11
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S
2023/01/11-18:23:20
# 显示时间戳
[whb@bite-alicloud test]$ date +%s
1673432636
# 时间戳转成可视时间
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @0
1970/01/01-08:00:00
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @100000
1970/01/02-11:46:40
[whb@bite-alicloud test]$ date +%Y/%m/%d-%H:%M:%S -d @1000000000
2001/09/09-09:46:40
20. cal 指令
cal 命令可以用来显示公历(阳历)日历。公历是现在国际通用的历法,又称格列历,通称阳历。"阳历"又名"太阳历",系以地球绕行太阳一周为一年,为西方各国所通用,故又名"西历"。
命令格式
bash
cal [参数] [年份]
功能:用于查看日历等时间信息,如只有一个参数,则表示年份 (1-9999),如有两个参数,则表示月份和年份。
常用选项
-3:显示系统前一个月,当前月,下一个月的月历-j:显示在当年中的第几天(一年日期按天算,从 1 月 1 号算起,默认显示当前月在一年中的天数)-y:显示当前年份的日历
举例
bash
# 常规样例
[whb@bite-alicloud test]$ cal
January 2023
Su Mo Tu We Th Fr Sa
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
[whb@bite-alicloud test]$ cal 1949
1949
January February March
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 1 2 3 4 5 1 2 3 4 5
2 3 4 5 6 7 8 6 7 8 9 10 11 12 6 7 8 9 10 11 12
9 10 11 12 13 14 15 13 14 15 16 17 18 19 13 14 15 16 17 18 19
16 17 18 19 20 21 22 20 21 22 23 24 25 26 20 21 22 23 24 25 26
23 24 25 26 27 28 29 27 28 27 28 29 30 31
...
[whb@bite-alicloud test]$ cal -3
December 2022 January 2023 February 2023
Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa Su Mo Tu We Th Fr Sa
1 2 3 1 2 3 4 5 6 7 1 2 3 4
4 5 6 7 8 9 10 8 9 10 11 12 13 14 5 6 7 8 9 10 11
11 12 13 14 15 16 17 15 16 17 18 19 20 21 12 13 14 15 16 17 18
18 19 20 21 22 23 24 22 23 24 25 26 27 28 19 20 21 22 23 24 25
25 26 27 28 29 30 31 29 30 31 26 27 28
五、压缩与打包类
21. zip / unzip 指令
语法
bash
zip 压缩文件.zip 目录或文件
功能:将目录或文件压缩成 zip 格式。
常用选项
-r:递归处理,将指定目录下的所有文件和子目录一并处理
举例
bash
# 将 test2 目录压缩
zip test2.zip test2/*
# 解压到 /tmp 目录
unzip test2.zip -d /tmp
22. 关于 rzsz
这个工具用于 Windows 机器和远端的 Linux 机器通过 XShell 传输文件。安装完毕之后可以通过拖拽的方式将文件上传过去。
bash
sudo yum/apt install -y lrzsz
演示场景:Windows 和 Linux 如何互传文件。
23. tar 指令(重要)
打包 / 解包,不打开它,直接看内容。
语法
bash
tar [-cxtzjvf] 文件与目录 ....
参数
| 参数 | 说明 |
|---|---|
-c |
建立一个压缩文件的参数指令(create 的意思) |
-x |
解开一个压缩文件的参数指令 |
-t |
查看 tarfile 里面的文件 |
-z |
是否同时具有 gzip 的属性,亦即是否需要用 gzip 压缩 |
-j |
是否同时具有 bzip2 的属性,亦即是否需要用 bzip2 压缩 |
-v |
压缩的过程中显示文件。这个常用,但不建议用在背景执行过程 |
-f |
使用档名,请留意,在 f 之后要立即接档名,不要再加参数 |
-C |
解压到指定目录 |
案例
范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar
bash
[root@linux ~]$ tar -cvf /tmp/etc.tar /etc # <==仅打包,不压缩!
[root@linux ~]$ tar -zcvf /tmp/etc.tar.gz /etc # <==打包后,以 gzip 压缩
[root@linux ~]$ tar -jcvf /tmp/etc.tar.bz2 /etc # <==打包后,以 bzip2 压缩
特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识:
- 如果加
z参数,则以.tar.gz或.tgz来代表 gzip 压缩过的 tar file - 如果加
j参数,则以.tar.bz2来作为附档名
上述指令在执行的时候,会显示一个警告讯息:
text
tar: Removing leading `/' from member names
那是关于绝对路径的特殊设定。
范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?
bash
[root@linux ~]$ tar -ztvf /tmp/etc.tar.gz
由于我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,就得要加上 z 这个参数了!这很重要的!
范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下
bash
[root@linux ~]$ cd /usr/local/src
[root@linux src]$ tar -zxvf /tmp/etc.tar.gz
在预设的情况下,我们可以将压缩档在任何地方解开的。以这个范例来说,我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz,则解开的目录会在 /usr/local/src/etc。另外,如果您进入 /usr/local/src/etc,则会发现该目录下的文件属性与 /etc/ 可能会有所不同。
范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已
bash
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -zxvf /tmp/etc.tar.gz etc/passwd
我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果只要一个文件,就可以透过这个方式来下达!注意到,etc.tar.gz 内的根目录 / 是被拿掉了。
范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限
bash
[root@linux ~]$ tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!
范例六:在 /home 当中,比 2005/06/01 新的文件才备份
bash
[root@linux ~]$ tar -N "2005/06/01" -zcvf home.tar.gz /home
范例七:我要备份 /home、/etc,但不要 /home/dmtsai
bash
[root@linux ~]$ tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc
范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件
bash
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -cvf - /etc | tar -xvf -
这个动作有点像是 cp -r /etc /tmp,但依旧是有其用途的。要注意的地方在于输出档变成 -,而输入档也变成 -,又有一个 | 存在,这分别代表 standard output、standard input 与管线命令。
六、系统信息与常用工具
24. alias 指令
功能:设置命令的别名。
举例
bash
[whb@bite-alicloud test]$ alias hello='ls -a -l -n'
[whb@bite-alicloud test]$ which hello
alias hello='ls -a -l -n'
/usr/bin/ls
[whb@bite-alicloud test]$ hello
total 36
drwxrwxr-x 2 1003 1003 4096 Jan 11 17:59 .
drwx------ 22 1003 1003 4096 Jan 11 17:57 ..
-rw-rw-r-- 1 1003 1003 28667 Jan 11 18:29 temp.txt
25. top
bash
top -d 1 -n 5
-d:刷新的时间间隔-n:刷新的次数q:退出
26. bc 指令
bc 命令可以很方便的进行浮点运算。
27. uname 指令
语法
bash
uname [选项]
功能:uname 用来获取电脑和操作系统的相关信息。
补充说明:uname 可显示 Linux 主机所用的操作系统的版本、硬件的名称等基本信息。
常用选项
-a或--all:详细输出所有信息,依次为内核名称、主机名、内核版本号、内核版本、硬件名、处理器类型、硬件平台类型、操作系统名称lsb_release -a:查看操作系统版本
28. file 指令
功能说明:辨识文件类型。
语法
bash
file [选项] 文件或目录...
常用选项
-c:详细显示指令执行过程,便于排错或分析程序执行的情形-z:尝试去解读压缩文件的内容
29. 关机 shutdown
语法
bash
shutdown [选项]
常见选项
-h:将系统的服务停掉后,立即关机-r:在将系统的服务停掉之后就重新启动-t sec:-t后面加秒数,亦即"过几秒后关机"的意思
30. 重要的几个热键 Tab、Ctrl-c、Ctrl-d
[Tab]按键:具有『命令补全』和『档案补齐』的功能[Ctrl]-c按键:让当前的程序『停掉』[Ctrl]-d按键:通常代表着『键盘输入结束(End Of File, EOF 或 End Of Input)』的意思;另外,它也可以用来取代 exit
七、shell 命令以及运行原理
Linux 严格意义上说的是一个操作系统,我们称之为"核心(kernel)",但我们一般用户不能直接使用 kernel,而是通过 kernel 的"外壳"程序,也就是所谓的 shell,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel?
从技术角度,Shell 的最简单定义:命令行解释器(command Interpreter),主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
对比 Windows GUI,我们操作 Windows 不是直接操作 Windows 内核,而是通过图形接口点击,从而完成我们的操作(比如进入 D 盘的操作,我们通常是双击 D 盘盘符,或者运行起来一个应用程序)。
shell 对于 Linux 有相同的作用,主要是对我们的指令进行解析,解析指令给 Linux 内核。反馈结果再通过内核运行出结果,通过 shell 解析给用户。
八、Linux 权限管理
1. 权限的概念
Linux 下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以在 Linux 系统下做任何事情,不受限制
- 普通用户:在 Linux 下做有限的事情
- 超级用户的命令提示符是
#,普通用户的命令提示符是$
命令 :su [用户名]
功能:切换用户。
例如,要从 root 用户切换到普通用户 user,则使用 su user。要从普通用户 user 切换到 root 用户则使用 su root(root 可以省略),此时系统会提示输入 root 用户的口令。
2. 文件访问者的分类(人)
- 文件和文件目录的所有者:
u--- User - 文件和文件目录的所有者所在的组的用户:
g--- Group - 其它用户:
o--- Others
3. 文件类型和访问权限(事物属性)
文件类型
d:文件夹-:普通文件l:软链接(类似 Windows 的快捷方式)b:块设备文件(例如硬盘、光驱等)p:管道文件c:字符设备文件(例如屏幕等串口设备)s:接口文件
基本权限
- 读(
r/4):Read 对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限 - 写(
w/2):Write 对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限 - 执行(
x/1):execute 对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限 -表示不具有该项权限
4. 文件访问权限的相关设置方法
chmod
功能:设置文件的访问权限
格式 :chmod [参数] 权限 文件名
常用选项:
-R-> 递归修改目录文件的权限- 说明:只有文件的拥有者和 root 才可以改变文件的权限
chmod 命令权限值的格式
(1)用户表示符 +/-/= 权限字符
+:向权限范围增加权限代号所表示的权限-:向权限范围取消权限代号所表示的权限=:向权限范围赋予权限代号所表示的权限- 用户符号:
u:拥有者g:拥有者同组用户o:其它用户a:所有用户
实例:
bash
chmod u+w /home/abc.txt
chmod o-x /home/abc.txt
chmod a=x /home/abc.txt
(2)三位 8 进制数字
实例:
bash
chmod 664 /home/abc.txt
chmod 640 /home/abc.txt
chown
功能:修改文件的拥有者
格式 :chown [参数] 用户名 文件名
实例:
bash
chown user1 f1
chown -R user1 filegroup1
chgrp
功能:修改文件或目录的所属组
格式 :chgrp [参数] 用户组名 文件名
常用选项 :-R 递归修改文件或目录的所属组
实例:
bash
chgrp users /abc/f2
umask
功能
- 查看或修改文件掩码
- 新建文件夹默认权限 = 0666
- 新建目录默认权限 = 0777
- 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask 的影响。假设默认权限是 mask,则实际创建的出来的文件权限是:
mask & ~umask
格式 :umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为 0022,普通用户默认为 0002。
实例
bash
umask 755 # 设置
umask # 查看
umask 044 # 设置
5. 使用 sudo 分配权限
(1)修改 /etc/sudoers 文件分配权限
bash
# chmod 740 /etc/sudoers
# vi /etc/sudoers
格式:接受权限的用户登陆的主机 =(执行命令的用户) 命令
(2)使用 sudo 调用授权的命令
bash
$ sudo -u 用户名 命令
实例:
bash
$ sudo -u root /usr/sbin/useradd u2
6. 目录的权限
- 可执行权限:如果目录没有可执行权限,则无法
cd到目录中。 - 可读权限:如果目录没有可读权限,则无法用
ls等命令查看目录中的文件内容。 - 可写权限:如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件。
于是,问题来了。换句话来讲,就是只要用户具有目录的写权限,用户就可以删除目录中的文件,而不论这个用户是否有这个文件的写权限。
这好像不太科学啊,我张三创建的一个文件,凭什么被你李四可以删掉?我们用下面的过程印证一下。
bash
[root@localhost ~]$ chmod 0777 /home/
[root@localhost ~]$ ls /home/ -ld
drwxrwxrwx. 3 root root 4096 9月 19 15:58 /home/
[root@localhost ~]$ touch /home/root.c
[root@localhost ~]$ ls -l /home/
总用量 4
-rw-r--r--. 1 root root 0 9月 19 15:58 abc.c
drwxr-xr-x. 27 litao litao 4096 9月 19 15:53 litao
-rw-r--r--. 1 root root 0 9月 19 15:59 root.c
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/root.c # litao 可以删除 root 创建的文件
rm:是否删除有写保护的普通空文件 "/home/root.c"?y
[litao@localhost ~]$ exit
logout
为了解决这个不科学的问题,Linux 引入了粘滞位的概念。
7. 关于权限的总结
- 目录的可执行权限是表示你可否在目录下执行命令。
- 如果目录没有
-x权限,则无法对目录执行任何命令,甚至无法cd进入目录,即使目录仍然有-r读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)。 - 而如果目录具有
-x权限,但没有-r权限,则用户可以执行命令,可以cd进入目录。但由于没有目录的读权限,所以在目录下,即使可以执行ls命令,但仍然没有权限读出目录下的文档。
8. 粘滞位[选学]
bash
[root@localhost ~]$ chmod +t /home/ # 加上粘滞位
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9月 19 16:00 /home/
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/abc.c # litao 不能删除别人的文件
rm:是否删除有写保护的普通空文件 "/home/abc.c"?y
rm: 无法删除"/home/abc.c": 不允许的操作
当一个目录被设置为"粘滞位"(用 chmod +t),则该目录下的文件只能由:
- 超级管理员删除
- 该目录的所有者删除
- 该文件的所有者删除
九、扩展命令清单
以下命令作为扩展了解:
| 分类 | 命令 |
|---|---|
| 安装和登录命令 | login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last |
| 文件处理命令 | file、mkdir、grep、dd、find、mv、ls、diff、cat、ln |
| 系统管理相关命令 | df、top、free、quota、at、lp、adduser、groupadd、kill、crontab |
| 网络操作命令 | ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup |
| 系统安全相关命令 | passwd、su、umask、chgrp、chmod、chown、chattr、sudo、ps、who |
| 其它命令 | tar、unzip、gunzip、unarj、mtools、man、uudecode |
十、小结
这份速查表覆盖了 Linux 入门阶段最常用的 30 个左右命令,核心记忆线索是:
- 看 :
ls、pwd、cat、more、less、head、tail - 走 :
cd - 建 :
touch、mkdir、cp - 改 :
mv、chmod、chown、chgrp、umask - 删 :
rm、rmdir - 查 :
find、grep、which、whereis、man - 装 :
zip/unzip、tar
熟练之后,再配合 man 手册和 [Tab] 补全,命令行效率会提升得非常快。