Linux Command Line
正式开始工作了,尽管有很多需要提升的地方,其实一直没有找到一个合适的方向.
想来想去还是决定从 Linux 的命令行入手吧,这大概是学习和效用可以直接最大化的一种方式了.学习快捷键也是同理,提高生产效率,可以把更多的时间投入在思考上.
计划从 201803 起每日更新(争取 (:з」∠)
主要参考资料为
菜鸟教程 Linux 命令大全
每天一个 Linux 命令
以及其他互联网资料 lol
以下操作全部基于 mac, 使用命令行程序 iTerm2, 用的是 .zsh 插件为 oh-my-zsh
大部分操作 Linux 平台应该通用
文件目录操作命令
ls
最常见的一个命令了算是,就是 list (列举) 所有内容的意思1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16ls -a # 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出)
ls -l # 除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
ls -r # 将文件以相反次序显示(原定依英文字母次序)
ls -t # 将文件依修改时间之先后次序列出
ls -A # 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
ls -F # 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
ls -R # 若目录下有文件,则以下之文件亦皆依序列出
# 高级示例
ls -ltr s*
# 列出目前工作目录下所有名称是 s 开头的文件,越新的排越后面
# -l 是所有文件, -t 是按文件修改的时间顺序, -r 是相反时序
ls -lh
# 列出详细文件 大小是 -human readable 的, 也可以使用 ll 代替
cd & pwd
cd 也是简单的目录命令,就是 change directory 的缩写
一般用法就是 cd + [directory name]
pwd 就更简单了,只是显示当前的路径 printing the current working directory1
2
3
4
5
6
7cd ~/Desktop
cd - # 用于进入上一个目录
# 在 oh-my-zsh 的支撑下似乎直接用 '-' 也是可行的
# 一般也可以配合 pwd 使用
➜ demo pwd
~/Desktop/Jeremy/demo
mkdir
mkdir 对应的就是 make directory,也就是创建文件夹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
27mkdir folder_name # 创建目录
mkdir -p folder/sub_folder # 创建连续的目录
mkdir -m 777 folder # 创建权限为777的目录
# 这里有必要解释一下,ll 显示的结果
# 第一列 - 是文件,d 是目录
# 后面九位 rwx 代表的是权限等级,r = 4, w = 2, x = 1
# 因此 777 对应的就是 rwx,权限可以用 chmod 进行修改
mkdir -p scf/{lib/,bin/,doc/{info,product},logs/{info,product},service/deploy/{info,product}}
# 花式生成目录, 可以用 tree 进行目录树查看
➜ Linux-Command-Lines tree scf
scf/
├── bin
├── doc
│ ├── info
│ └── product
├── lib
├── logs
│ ├── info
│ └── product
└── service
└── deploy
├── info
└── product
rm & rmdir
rm 也就是 remove,删除
这是一个极其危险的命令,如果在错误的目录执行了,或者错误删除了文件,后果不但严重而且非常麻烦,根据过来人的意见,最后多使用 mv 命令,把要删除的内容移动到某个临时文件夹,再定期对该文件夹进行清理
rmdir 则是用于删除空目录1
2
3
4
5
6rm file
rmdir folder # rmdir 只能移除空的文件夹
rm -i folder # 交互式的删除, -i 即 interactive,输入 y -> yes, n -> no
rm -r folder # -r 即 recursive, 可以删除该 folder 下所有目录和文件,慎用!
rm -rf * # 删除所有内容, -f 即 force, 绝对慎用!!!!
mv
mv 即 move (rename) file, 可用于移动文件/文件夹 或者改名
1 | mv a b # 把文件夹 a 改名 为 b |
cp
cp 即 copy files, 是简单的复制命令
1 | cp a.txt b.txt # 在同目录下复制文件 a.txt 并将复制文件命名为 b.txt |
cat
cat – concatenate and print files, 本意为连接文件并打印到标准输出设备上
之前上 CC 的时候经常使用该命令, 坦白说效果挺强的哈哈
1 | cat 1.txt # 直接 cat 就是显示该文件的所有内容, 缺点在于不如 less 和 vi 可以翻阅甚至编辑, 只是单纯的列出所有内容 |
less
less 这个命令的解释很迷, 简单来说就是 less > more 也是很皮了
大概是因为 more 是之前一个看文件内容的命令
于是 less 就变成了 更强大的 看文件内容的命令 LOL
好处是 less 是分段读取的, 所以在面对大文件时比 vi 之类的更有优势 毕竟只读不写
1 | less a.txt # 展示 a.txt 的内容 |
head & tail
用于显示文件开头和结尾的内容
1 | head a.txt # 默认显示文件的前 10 行 |
文件查找命令
which, whereis
这两个命令都是用于搜索其他命令/执行文件的位置, 比如1
2
3
4
5which git # 显示 git 的位置
whereis git # 显示 git 的位置
/usr/local/bin/git
which -a git # 显示所有 git 的位置
这个是真的没啥用-.-
除了判断一下究竟执行了哪一个
find
find 基础
这个命令怕不是比较复杂了的, 尽管主要功能就是 查找
可以用来查找很多东西, 以及有很强大的扩张命令
语法:
1 | find path -option [ -print ] [ -exec -ok command ] {} ; |
options:
-name 按照文件名查找文件
-perm 按照文件权限来查找文件
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略
-user 按照文件属主来查找文件
-group 按照文件所属的组来查找文件
-mtime -n +n 按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前, 对应还有 -atime, -ctime. acm 分别表示 访问, 改变文件状态, 改变文件数据. 同时也可以有 -amin, -cmin, -mmin
-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计
-depth:在查找文件时, 首先查找当前目录中的文件, 然后再在其子目录中查找
-type 查找某一类型的文件, 诸如:
b - 块设备文件
d - 目录
c - 字符设备文件
p - 管道文件
l - 符号链接文件
f - 普通文件
更多参看看这里http://www.cnblogs.com/peida/archive/2012/11/16/2773289.html
1 | find . -name "a.txt" # 找出当前目录下所有的 a.txt 文件 (包括子目录下的) |
find exec
-exec 参数后面跟的是command命令,它的终止是以;为结束标志的,所以这句命令后面的分号是不可缺少的,考虑到各个系统中分号会有不同的意义,所以前面加反斜杠.
{} 花括号代表前面find查找出来的文件名.
使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的.在有些操作系统中只允许-exec选项执行诸如l s或ls -l这样的命令.大多数用户使用这一选项是为了查找旧文件并删除它们.建议在真正执行rm命令删除文件之前,最好先用ls命令看一下,确认它们是所要删除的文件. exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号.为了使用exec选项,必须要同时使用print选项.如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名.
1 | find . -type f -exec ls -l {} \; # 列出当前目录下所有普通文件 (其实此处不用 -exec 也无所谓) |
文件打包压缩解压命令
tar
首先先区分清打包和压缩的不同 -> 打包是把一堆文件变成一个文件, 压缩是把大文件变成小文件
一般用 tar 命令打包, 再用 gzip/其他压缩方式 进行压缩, tar 本身没有压缩功能
tar[必要参数][选择参数][文件]
注意参数的大小写有差别的
常用必要参数
-B 设置区块大小
-c 建立新的压缩文件 (单纯有 -c 似乎不能生成文件=.=)
-t 显示压缩文件的内容
-z 支持gzip解压文件
-j 支持bzip2解压文件
-Z 支持compress解压文件
-v 显示操作过程
常用可选参数
-b 设置区块数目
-C 切换到指定目录
-f 指定压缩文件 (讲真我觉得这个是必备的, 如果不置指定生成的文件, 压缩意义何在? 显示一下压缩结果搞笑吗???)
还有太多乱七八糟的就不附上了
详参此处
1 | tar cvf a.tar a # 把文件或者文件夹 a 打包, 此处名字可以任意, 习惯用 *.tar 进行命名 |
gzip
gzip 是典型的压缩命令, 一般结尾是 .gz
-a或–ascii 使用ASCII文字模式
-d或–decompress或—-uncompress 解开压缩文件
-f或–force 强行压缩文件 不理会文件名称或硬连接是否存在以及该文件是否为符号连接
-l或–list 列出压缩文件的相关信息
-n或–no-name 压缩文件时,不保存原来的文件名称及时间戳记
-N或–name 压缩文件时,保存原来的文件名称及时间戳记
-r或–recursive 递归处理,将指定目录下的所有文件及子目录一并处理
-S<压缩字尾字符串>或—-suffix<压缩字尾字符串> 更改压缩字尾字符串
-t或–test 测试压缩文件是否正确无误
-v或–verbose 显示指令执行过程
-V或–version 显示版本信息
-num 用指定的数字num调整压缩的速度 -1或–fast表示最快压缩方法(低压缩比)-9或–best表示最慢压缩方法(高压缩比),系统缺省值为6
1 | gzip * # 把当前目录下所有文件直接压缩, 注意会替换掉原文件 |
文件权限设置
chmod
要了解文件的访问权限, 先要理解对应的涵义
1 | drwxr-xr-x 10 admin staff 320 Apr 12 21:40 a |
如上, 第一位的 d 和 - 代表的是目录或者文件
后面 9 位对于三个用户组: 文件所有者, 同组用户, 其他用户
每组里面的 3 位分别对应 只读(read) 只写(write) 可执行(execute) 权限
可选参数并不多, 主要有以下几个:
-c 当发生改变时,报告处理信息
-f 错误信息不输出
-R 处理指定目录以及其子目录下的所有文件 (注意不是 -r)
-v 运行时显示详细处理信息
对应的修改方式有两种, 数字/字母的方式:
数字: r=4, w=2, x=1
对应把相应的数字和赋值给文件即可 比如1
2
3chmod 763 a
drwxrw--wx 10 admin staff 320B Apr 12 21:40 a
可以看到 7 对应的文件所有者权限为 rwx, 同组用户为 rw, 而其他用户只是 wx
字母: 三个用户组分别写作 u g o, 还有 a 用于所有用户
写的时候用 + - = 符号对应权限1
2
3chmod u+x a # 给文件 a 的所有者加上可执行的权限
chmod ug+w, o-x a # 给文件 a 的所有者和同组用户加上写权限, 取消其他用户的可执行权限
chmod ug=wx a # 把文件 a 的所有者和其他用户的权限设为写 + 可执行权限
其他权限相关的命令感觉一时之间用不上… 先略过了
磁盘储存相关
df & du
df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息
-a 全部文件系统列表
-h 方便阅读方式显示 -H 等于“-h” 但是计算式 1K=1000 而不是1K=1024
-k 区块为1024字节 -m 区块为1048576字节 (默认是512k 的 block)
-l 只显示本地文件系统 (可能有联网的)
-P 输出格式为POSIX
1 | ➜ Linux-Command-Lines df -Plh |
du 针对的不是整个磁盘, 而是对某个文件或目录的查看
1 | du -h # 以可读方式显示当前目录下所有目录级别的大小 |
性能监控命令
top
top 用于查看系统的运行情况 类似于 windows 里面的任务管理器
参考资料里面很多都不 work, 建议直接看 man top 学习即可
或者更简单的方式是 按下 top 之后直接 tab, 装了 oh-my-zsh 之后就有超级多方便的提示 lol
1 | top -o mem # 以占用内存排序 |
查了一下资料发现 Mac 下的 top 和一般 Linux 长得还不一样
推荐用 htop 彩色界面, 更加酷炫😂

1 | brew install htop |
lsof
list open files 是一个列出当前系统打开文件的工具, 这和 Linux 的机制相关 -> 所有程序都是打开的文件, 所以直接 lsof 会出现很多 乱七八糟的东西 并不能看懂
这个算是比较冷门的命令 但特殊情况下很好用 仅举几个例子1
2lsof -i :4000 # 查看正在使用端口号 4000 的程序
lsof -p 2333 # 查看 进程号 2333 对应的文件信息
ping
看是看完了, 但是临时有个想法是, 这样子抱着字典学, 其实意义不是特别大 -> 就像念书不必每个字都认识一样, 需要的时候才查, 也许是更好的一种方式
学字典固然有进步, 但却不是效率最高的一种
多看一些工作中会常用的小技巧 会比较重要 比如 zgrep, vim 操作等等
ping 的具体内容就略过啦哈哈哈哈
scp
代表 secure copy
scp [参数] [原路径] [目标路径]
scp 是加密传输, 所以可能会慢一些
-r 递归复制目录
-i 指定秘钥文件
1 | # 复制文件例子如下 |
其他命令
ln
意为链接 link, 看上去和 cp 有点类似, 但实际上是功能非常强大的命令
首先分两种 软链接 (类似于指针的指向而已, 几乎不占空间)和 硬链接 (类似于真的拷贝文件, 但两者绑定)
1 | ➜ z ln -s z.txt softlink-z # softlink |
可以看出 hardlink 的文件大小一致, 而 softlink 的很小
据说 hardlink 的文件时不占用实际空间的, 但我对此表示怀疑😂
hardlink 只能对文件不能对目录 而 softlink 两者都行
diff
这个命令感觉现在比较鸡肋了 直接 git diff 功能怕不是更强
diff 的normal 显示格式有三种提示:
a - add
c - change
d - delete
“|”表示前后2个文件内容有不同
“<”表示后面文件比前面文件少了1行内容
“>”表示后面文件比前面文件多了1行内容
diff fileA fileB # 显示两个文件的不同之处
date & cal
分别代表日期和日历
我个人觉得极其废铁… 有兴趣的自己试试好了
grep
超级强大的文本搜索工具 grep全称是Global Regular Expression Print
grep [option] pattern file
支持所有正则表达式的处理方式
-c 计算符合样式的行数
-n 显示行数
-r recursive 常见递归用法
^a 以 a 开头的内容
z$ 以 z 结尾的内容
1 | grep -n 'linux' a.txt b.txt # 显示 a.txt, b.txt 中所有包含 linux 的行数, 并标明行号 |
wc
word count 统计各种数目
-c 字节数
-l 行数
-m 字符数(不能和 -c 同时使用)
-w 统计字数(一个字是空白 跳格 换行字符分隔的字符串)
可结合管道线做更多 fancy 的东西1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18➜ a wc a.txt
57 86 498 a.txt
➜ a wc -c a.txt
498 a.txt
➜ a wc -m a.txt
498 a.txt
➜ a wc -w a.txt
86 a.txt
➜ a wc -l a.txt
57 a.txt
ls -l | wc -l # 统计文件个数 + 1, 因为 ls -l 有一行 total
```
#### ps
即 process status, 查看进程的情况
有特定需求还是应该翻字典, 一般不太用的上 也就是看看进程 id 而已
ps -A # 显示所有进程
ps -ef # 显示所有进程信息
ps -u root # 显示 root 用户的所有进程
ps -ef | grep ssh # 结合 | 和 grep 查找特定进程`
更新了快一个月, 四周时间也算是告一段路了
感谢自己的坚持哈哈 我觉得还是学习到了很多有趣的东西
不过更重要的恐怕是学以致用
还是多看看同事都怎么操作的 grep less 的各种技巧
以及 vim 的操作 感觉可以学习一波?