Linux 笔记:核心思想、常用命令以及脚本语法
总结于 《鸟哥的 linux 私房菜 - 基础学习篇》 ,图片也来自于此。
核心思想
目录树结构(directory tree)
linux 系统是基于目录树结构的,这是它的核心思想。目录,即文件夹。linux 系统相当于一个文件夹,linux 系统的所有数据要么对应一个文件夹,要么就是一个文件。比如,你新建一个用户,其实就是新建了一个文件夹。一个用户对应一个文件夹。目录树结构:
上图中 长方形是文件夹, 波浪形是文件,根目录是 /
。这个 /
很巧妙,在 macos 中,假设你下载文件 test.md 到 /users/username/desktop/
,那么文件会下载到桌面,最前面这个 /
就是根目录。如果你写成 users/username/desktop/
,那么文件就会下载到currentderectory/users/username/desktop/
下。
linux 系统使用的是目录树架构,但其实数据是存放在 当中的,那么问题来了:目录树和磁盘分区是神马关系?这个时候就牵扯到一个叫「挂载(mount)」的概念了。
目录树和磁盘分区的关系
挂载其实就是建立目录树和磁盘分区之间的关系。目录只是一个标识,叫什么我们可以自定义,一个磁盘分区对应一个目录。
我们经常用 u 盘,假设一个 u 盘是一个磁盘分区,我们把一个假设叫 partition1 的 u 盘插到 windows 电脑上,可能电脑就多了个 f 盘,那么目录就是 f ,相当于将目录 f 挂载到了 u 盘上,访问 f 就可以访问 partition1 里的内容。如果再插一个假设叫 partition2 的 u 盘,系统应该就会多了一个 h 盘,相当于目录 h 就挂载到了 partition2 上。假设 f 盘下将会有一个存放很多视频的 moive 文件夹,我们可以直接将 movie 文件夹挂载到 partition2 上,这样 movie 里的视频就存到 partition2 里面了,就不占用 f 盘的空间了。
在 linux 系统中道理也是一样的,比如在搭建 linux 环境的时候,可以将 /home 单独挂载到一个磁盘分区上。
- 更多内容请看鸟哥 linux 安装模式下,磁碟分割的选择
常用命令
命令 | 含义 | 选项 | 示例 |
---|---|---|---|
--help |
ls --help |
||
man | manual | man man |
|
ls | list |
-a, --all -h, --human-readable -l, --long listing format
|
ls -ah :显示目录下所有文件夹,包括隐藏文件夹 ls -l == ll
|
cd | change directory |
cd 相当于 cd ~ ,~ 当前用户根目录cd / 根目录cd .. 上一层cd ../.. 上两层cd ../<directory> 上一层里面某个目录cd <directory>/<directory> 当前目录下的某个目录下的某个目录 |
|
rm | remove |
-d, --direcorty -r, --recursive -f, --force
|
rm <file> rm -d <directory> rm -rf <directory> rm *.pdf
|
cat | concatenate | cat <file> |
|
mkdir | make direcotry | mkdir <directory> |
|
touch | create a file | touch <file> |
|
mv | move |
move oldname name move <file>/<directory> <directory>
|
|
cp | copy | cp test test.bak |
|
zip | -r, --recurse |
zip -r test.zip test/ |
|
unzip | unzip test.zip |
||
tar | tape or archive |
-f, --file=archive -c, --create -t, --list -v, --verbose -x, --extract -z, --gzip, --gunzip, --ungzip
|
tar -cf archive.tar foo bar :将文件 foo 和 bar 创建为 archive.tartar -tvf archive.tar : 详细列出 archive.tar 中所有文件tar -xf archive.tar :从 archive.tar 中提取所有文件tar xvzf redis-stable.tar.gz :从 redis-stable.tar.gz 中详细提取所有文件 |
pwd | print working directory | pwd |
|
sh | run a script |
sh test.sh 相当于 ./test.sh
|
|
start |
start notepad++ <file> start typora <file>
|
||
vi | visual | vi <file> |
|
vim | vi improved | vim <file> |
vi/vim 的三种模式
vi <file>
和 vim <file>
都是修改 <file>
的命令,后者为前者的增强版,输入此命令后,会有三种模式修改 <file>
文件。
- 一般指令模式(command mode):你看不见你输入的内容
- 编辑模式(insert mode):直接修改文件内容
- 指令列命令模式(command-line mode):最下面一行,
:
或/
或?
开头
-
以下指令详细含义请看
常用指令
一般指令模式:
指令 | 含义 |
---|---|
i | 当前位置进入 insert 模式 |
i | 第一个字符 |
a | 下一个字符 |
a | 末尾 |
o | 下一列开头 |
o | 上一列开头 |
r | replace 模式,取代一次 |
r | 一直取代 |
u | 撤销 |
ctrl + r | 取消撤销,相当于 u? |
0 | 行首 |
end / $ | 行尾 |
g | 最后一列 |
gg | 1 g,第一列 |
n<enter>
|
向下移动 n 列 |
ctrl + f | fall,向下一页 |
ctrl + b | before,向上一页 |
x | 删除 |
x | 删除前一个 |
dd | 删除当前列 |
d$ | 删除从当前位置到列尾 |
yy | 复制当前列 |
- 编辑模式:
指令 | 含义 |
---|---|
esc | 退出编辑模式,进入一般指令模式 |
- 指令列命令模式:
指令 | 含义 |
---|---|
:w | 保存 |
:w! | 强制保证 |
:q | 退出 |
:q! | 强制退出 |
:wq | 退出并保存,相当于 zz
|
/word | 查找关键字 |
:set nu | 显示行号 |
:1,$s/word1/word2/gc | word1 替换为 word2 |
/word
查找时,可使用 n 跳转到下一个查找结果,n 跳转到上一个查找结果
脚本语法
- 遍历。示例:一个打印出当前路径下所有文件夹的目录的脚本,名叫
traverse.sh
,内容如下:
#!/bin/bash for i in $(ls $(pwd)) do if [ -d $i ];then cd $i pwd cd .. fi # if 反向,代表 if 结束 done
执行脚本: sh traverse.sh
- 更多内容请看 学习 shell scripts
其他常用命令
## 用户 passwd <username> # 修改用户的密码 whoami # 查看当前用户名 ## 日志 less <file> # 查看最新日志 tail -f <file> # 查看实时日志 grep -5 <key> <file> # 查看日志 <file> 关键字 key 上下五行 grep -5 <key> <file1> <file2> # 输出日志 <file1> 关键字 key 上下五行的内容到 <file2> 中 ## 进程 ps -ef|grep wechat # 查看进程名叫 wechat 的信息,最开头的数字为 id kill -9 6002(最开头的数字) # 杀死进程 id 为 6002 的进程 sed -i's/word1/werd2/g' <file> # 替换 <file> 的 word1 为 word2(sed -- stream editor) xclip -sel c < <file> # 不打开 <file> 的情况下复制其内容 df -h # 查看磁盘分区和目录信息(df -- display free disk space) echo $path# 输出 $path 的内容