文件操作

head

显示文件的头部内容,如果不指定参数默认显示 10 行

# 显示前 10 行内容
head README.md
# 或者显示多个文件
head README.md package.json
# -n 指定显示行数
head -n 100 README.md

tail

显示文件的末尾部分

# 默认显示末尾10
tail README.md
# -n 指定显示末尾20
tail -n 20 README.md

ls

# 显示当前目录列表
ls
# 显示目录列表的详细信息
ls -l
# 显示指定目录
ls ./src
# 可读性地显示目录列表详细信息, h means human-readable
ls -lh
# 列出所有文件包括隐藏文件
ls -a
# -F 可以显示类型,用以区分是文件还是目录
ls -F # 后缀为 ”/“ 代表是目录,”*“ 为可执行文件,没有则为文件
# -i 查看 inode 编号, 每一个文件或目录都有一个唯一的编号,这个数字由内核分配给文件系统中的每一个对象
ls -i
# 过滤文件列表, * 代表 0 个或多个字符, ? 代表一个字符
ls READ*

pwd

显示当前路径

# pwd means pathname of the current working directory
pwd

wc

统计文件的行数、字数、字节数, 常见用于统计代码行数

# 统计行数
wc -l README.md
# 统计字数
wc -w README.md
# 统计字符数, 中文占两个字符, 英文占一个字符
wc -m README.md

find

指定某个目录下查找文件

# 在当前目录递归搜索文件名为 README.md 文件
find . -name README.md
# 通过通配符进行查找, 必须用引号括着, 这里查找所有后缀为 .md 文件
find . -name "*.md"
find . -iname "*.md" # 忽略文件大小写
# 排除文件,只要加 ! , 排除掉所有 .md 后缀的文件
find . ! -name "*.md"
# 根据类型进行过滤搜索
# f 普通文件 d 目录
find . -type f
# 限定目录递归深度
find . -maxdepth 3 # 最大为3个目录
find . -mindepth 3 # 最小为3个目录
# 查找文件大小大于 25k 文件
find . -size +25k
# 查找 10 天前文件 -mtime 修改时间、 -ctime 创建时间、 -atime 访问时间
find . -mtime +10

mkdir

# 在当前目录下创建 temp 目录
mkdir temp
# 创建多层目录, p means parent
mkdir -p temp/temp2/temp3
# 基于权限创建, m means mode
mkdir -m 777 temp

more

  • 空格 - 查看下一屏内容
  • B - 查看上一屏内容
  • 回车 - 查看下一行内容
  • Q - 退出
more README.md
# 从第 10 行开始显示
more +10 README.md

paste

合并 N 个文件的

并不是纵向合并, 而是横向合并。

# 1.txt 和 2.txt 合并输出
paste 1.txt 2.txt
# 1.txt 2.txt 合并后保存为 3.txt
paste 1.txt 2.txt > 3.txt

stat

用于显示文件或目录的状态信息

16777220 8702541224 -rw-r--r-- 1 mac staff 0 15857 "Nov 1 13:02:02 2020" "Nov 1 13:02:02 2020" "Nov 1 13:02:02 2020" "Oct 25 18:48:15 2020" 4096 32 0 README.md

grep

强大的文本搜索工具, 被称为 Linux 命令三剑客。

# 从 README.md 文件中搜索 linux 关键字
grep "linux" README.md
grep "linux" README.md README2.md # 多个文件搜索
# 输出时高亮显示
grep "linux" README.md --color
# -o 只输出匹配部分
grep -o "linux" README.md --color
# -n 输出到匹配的行数
grep -n "linux" README.md
# -c 输出到匹配次数
grep -c "linux" README.md
# -r 递归目录文件搜索
grep -r "linux" ./src
# 使用 glob 风格表达式搜索
egrep "[0-9]" # 等价于 grep -E "[0-9]" README.md

touch

创建一个空文件, 如果文件存在只会修改文件的创建时间

touch README.md

sed

sed 是一种功能强大的流式文本编辑器,它是文本处理中非常重要的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用 sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。sed 主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

sed 用法实例

替换操作: s 命令

替换文本中的字符串:

sed 's/book/books/' file

cd

进入指定目录

# 进入当前 src 目录
cd src
# 回到上一次目录
cd -
# 返回上一级目录
cd ..
cd ../../.. # 返回多级
# 进入 /root 目录
cd ~
cd # 或者不带任何参数
# 将上一个命令的参数作为cd参数使用
cd !$
# 模糊匹配目录,有时目录名很长一个一个敲效率就很低
# * 代表0个或多个字符, ? 代表一个字符
cd READ*

rm

删除指定目录或文件

使用此命令需要非常小心, 一但删除无法恢复

# 删除当前 1.txt 文件
rm 1.txt
# -i 删除前询问是否真的要删除,因为一旦删除无法恢复
rm -i README.md
# 这条命令比较常用, 强制删除目录或文件
# -r 如果是目录递归删除, -f 强制删除 不发出任何警告
rm -rf ./src

cp

拷贝文件或目录

# 将当前 README.md 文件拷贝到上一层
cp ./README.md ../README.md
# -a 将原文件属性一同拷贝, 修改时间、创建时间等
cp -a ./README.md ../README.md
# -r 用于递归拷贝目录
cp -r home ../home
# -i 如果目标文件存在会询问用户是否需要覆盖
cp -i README.md README.md

cat

查看指定整个文件内容

# 查看 README.md 文件所有内容
cat README.md
cat README.md README2.md # 或者一次性显示多个文件
# -n 每一行显示行号
cat -n README.md
# -b 只给有内容的行显示行号
cat -b README.md

mv

mv 有 2 个用途:

  • 将文件或目录移动到另一个位置
  • 将文件或目录重命名
# 将 README.md 重命名为 README-2.md, 如果 README-2.md 存在会直接覆盖。
mv README.md README-2.md
# 将 README.md 移动到上一层目录
mv README.md ../README.md
# -i 交互式操作,如果目标文件存在则进行询问是否覆盖
mv -i README.md ../README.md
# -f 如果出现同名直接覆盖
$ mv -f 1.txt 2.txt

open

open 命令可在 linux / mac 具有可视化界面下进行文本编辑、打开应用程序等功能。

# 在mac下用Finder打开当前目录
open .
# 用默认应用程序打开文件
open README.md
# 用默认编辑器打开文件
open -e README.md
# 如果是一个URL用默认浏览器打开页面
open https://github.com/MuYunyun/blog.git
# 指定某个应用程序打开某个文件, 如果不指定文件默认直接打开程序
open -a /Applications/Google\ Chrome.app README.md

source

在当前 Shell 环境中从指定文件读取和执行命令, 通常用于重新执行环境。

它有个别名 . 点操作符号。

# 等价 . ~/.bash_profile
source ~/.bash_profile

可以把它理解为编程语言中的 import, java/python/js 都有这个,就是用来导入文件。

下面演示 source 用于 shell 脚本中

util.sh

#!/bin/bash
getName() {
echo "Linux"
}

main.sh

#!/bin/bash
# 加载文件
source ./util.sh
# 这样就可以调用 util 文件中的函数了
echo $(getName)

tree

生成目录树结构, 通常用于描述项目结构。

# 递归当前目录下所有文件并生成目录树
tree
# 只显示目录
tree -d
# -I 忽略某些目录
tree -I "node_modules"
# 指定要递归的目录层级
tree -L 3

小建议:可以使用 tree -L 3 -I "node_modules" 来输出当前项目目录结构。

输出当前项目目录结构

ln

将某一个文件在另外一个位置建立并产生同步的链接。当不同的 2 个目录需要同时引用某一个文件时此命令就派上用场了。

这个命令的应用场景: 比如 yarn link

  • 软链接也可以叫符号链接:
    • 软链接,以路径的形式存在。类似于 Windows 操作系统中的快捷方式;
    • 软链接可以跨文件系统, 硬链接不可以;
    • 软链接可以对一个不存在的文件名进行链接;
    • 软链接可以对目录进行链接;
  • 硬链接:
    • 硬链接,以文件副本的形式存在。但不占用实际空间, 从根本上而言就是同一个文件;
    • 不允许给目录创建硬链接;
    • 硬链接只有在同一个文件系统中才能创建;

理解: 文件系统博主理解: 比如在 mac 系统中装了个虚拟机, 虚拟机里面跑了另外一个 window 系统, 那此时 mac 和虚拟机里面的系统就是两个不同的文件系统。

# 默认创建硬链接,修改 README.md 内容, a.md 也会同步修改, 修改 a.md, README.md 也会同步修改
ln README.md a.md
# -s 创建软链接
ln -s README.md a.md # 如果删除了 README.md a.md 将失效
# -f 强制执行
ln -f README.md ./src/a.md

file

查看文件类型, 比如文件、目录、二进制、符号链接等。

file README.md
README.md: HTML document text, UTF-8 Unicode text

tar

全称: tape archive

  • tar [-j|-z][cv] [-f 建立的档案名] filename... 打包与压缩
  • tar [-j|-z][tv] [-f 建立的档案名]  查看档案
  • tar [-j|-z][xv] [-f 建立的档案名][-C 目录]   解压缩

选项与参数:

  • -c: 建立打包档案,可搭配 -v 来观察过程中被打包的档案名 (filename)
  • -t: 查看打包档案的内容含有那些档案
  • -x: 解压缩的功能,可以搭配 -C 在特定的目录解开; -c、-t、-x 不能同时出现在一串指令列中。
  • -j: 透过 bzip2 的支持进行压缩/解压缩: 此时档案名最好为 *.tar.bz2
  • -z: 透过 gzip 的支持进行压缩/解压缩: 此时档案名最好为 *.tar.gz
  • -v: 在压缩/解压缩的过程中, 将正在处理文件名显示出来
  • -f filename: -f 后面要立刻接被处理的档案名! 建议 -f 单独写一个选项
  • -C 目录: 指定特定目录

系统管理

ping

测试目标地址是否可连接、延迟度

# 测试 github.com 连通性, 按 ctrl + C 停止
ping github.com
# ping 5 次后断开
ping -c 5 github.com
# 每 5 秒 ping 一次
ping -i 5 github.com

which

查找某个命令存储在哪个位置, 输出绝对路径, which 会在环境变量 $PATH 设置的目录里去查找。

注: 可以通过 echo $PATH 查看设置的目录.

which top # /usr/bin/top
# 打印多个命令
which ping top

shutdown

将系统关机或重启操作。

# 什么参数都不加,默认会在 1 分钟后关机
$ shutdown
# 在将系统的服务停掉之后就重新开机
$ shutdown -r now
# 关闭系统并切断电源
$ shutdown -h now # 立即关机, 实际上调用 init 0
# 把前一个关机或重启取消掉
$ shutdown -c
# 设定一个时间关机,"&" 符号表示后台模式,让出 CLI
$ shutdown -h 05:33 &
$ shutdown +5 "5分钟后关机" # 5 分钟后关机,同时送出警告信息给登入用户:

uptime

# 当前系统运行的天数,小时,分钟 (从上次开机起计算), 当前系统登录用户数。一分钟、5分钟、15分钟平均负载,3 个值不能大于 CPU 个数,如果大于了说明系统负载高,性能低。
uptime # 13:25 up 2 days, 18:57, 7 users, load averages: 2.06 2.06 2.15

uname

打印系统信息

# 不带任何参数打印当前操作系统内核名称
uname # Darwin , 等价于 uname -s
# 打印系统所有信息, cloud-2.local: 网络节点主机名称, x86_64: 主机的硬件架构名称
uname -a # Darwin cloud-2.local 19.4.0 Darwin Kernel Version 19.4.0: Wed Mar 4 22:28:40 PST 2020; root:xnu-6153.101.6~15/RELEASE_X86_64 x86_64
# 打印主机的硬件架构名称
uname -m # x86_64

ifconfig

配置或显示系统网卡的网络参数。

# 显示所有网络参数信息
ifconfig

chmod

修改文件或目录权限。

see https://github.com/xjh22222228/linux-manual#chmod.

lsof

列出当前系统打开文件的工具

## 打印所有打开文件的的列表
lsof
# 查看指定端口被占用情况,(i means IP)
lsof -i:8080

使用命令 lsof -i:8080 显示查询结果如下:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME

使用 lsof 命令后,常常配合 kill 命令一起使用来杀死占用端口。

比如杀死占用端口的进程(PID 为 [1] 命令查看到的占用端口)命令为:

kill -9 PID

alias

设置命令别名,用于简化较长的命令。

# 列出所有已设置的别名
alias
# 删除所有别名
unalias -a
# 设置别名
alias ll='ls -l'

系统进程

ps

ps 命令涵盖命令参数三大风格

  • Unix 风格, 前面加单破折线
  • BSD 风格, 全称伯克利软件发行版(Berkeley software distribution), 前面不加破折线
  • GNU 风格, 全称 "Gnu's Not Unix", 前面加双破折线
# 配合 grep 查询指定进程, -a means all, -f means full
ps -af | grep nginx

kill

结束程序,kill 命令只支持进程 id 杀死,不支持进程名称。

进程信号

信号名称描述
3QUIT结束运行
9KILL无条件终止
15TERM尽可能终止
# 杀死 pid 为88 进程,不带参数默认等价 kill -15
$ kill 88
# 无条件终止进程,以下是等价,可以用进程名称信号
$ kill -KILL 88
$ kill -9 88

用户管理

chsh

chsh 命令用于修改默认用户登录 shell。

修改后重新启动 Shell 即可生效(exit/logout)。

# 必须使用完整路径,不能使用shell名
chsh -s /bin/zsh

查看当前 Shell

echo $SHELL # /bin/zsh

列出当前所有已安装的Shell

cat /etc/shells
# /bin/bash
# /bin/csh
# /bin/dash
# /bin/ksh
# /bin/sh
# /bin/tcsh
# /bin/zsh

users

显示当前登录系统的所有用户的用户列表。

ubuntu@ubuntu:~$ users
ubuntu

last

显示用户最近登录信息。

last
# 指定显示条目数
last -n 1

su

切换到其他用户。

# 切换到 root 身份
sudo su

whoami

显示自身的用户名称

ubuntu@ubuntu:~$ whoami
ubuntu
root@ubuntu:/home/ubuntu# whoami
root

网络

curl

curl 是一个非常强大的网络传输工具,利用 URL 规则在命令行下工作。

参数描述
-H设置请求头
-X设置 HTTP 请求方法
--cookie指定发送 cookie
--retry请求重试

curl --help 查询 curl 后可跟随的参数信息。

包管理

apt-get

apt-get 命令是 Debian Linux 发行版中的 APT 软件包管理工具。所有基于 Debian 的发行都使用这个包管理系统。

# 安装一个docker软件
$ apt-get install docker
# 卸载软件,保留配置文件
$ apt-get remove docker
# 卸载软件并删除配置文件
$ apt-get –purge remove docker
# 更新所有已安装的软件包
$ apt-get upgrade
# 删除软件备份,主要用来释放空间
$ apt-get clean

其它

clear

用于清除当前终端所有信息,本质上只是向后翻了一页,往上滚动还能看到之前的操作信息

注:效果等用于 command + K 可以完全清除终端所有操作信息。

clear

link