本内容出自https://github.com/fantasyKing/getting-started-for-mac
1.相对路径和绝对路径
绝对路径
路径的写法一定由根目录/发起,例如:/usr/share/doc
相对路径
路径的写法不是由/写起,例如由/usr/share/doc要到/usr/share/man下面时,可以写成"cd ../man",这就是相对路径的写法。相对路径意指相对于目前工作目录的路径。
相对路径和绝对路径的对比
相对路径提供了一种能够快速在各个路径之间跳转的方式。
绝对路径提供了一种精确的文件定位的方式。
2.目录的相关操作
大家可以想到哪些常用的目录的操作命令呢?例如创建目录,删除目录之类的。还有得先知道的,就是有哪些比较特殊的目录呢?举例来说,下面这些就是比较特殊的目录,要记下来:
. 代表此层目录
.. 代表上一层目录
- 代表前一个工作目录
~ 代表“目前用户身份”所在的主文件夹
~account 代表account这个用户的主文件夹(account是个账号名称)
需要注意的是,在所有的目录下面都存在两个目录,分别是"."和"..",分别代表此层和上层目录的意思。
根目录下"."和".."代表的是同一个目录
常见的处理目录的命令
- cd: 切换目录
- pwd: 显示当前目录
- mkdir: 新建一个新的目录
- rmdir: 删除一个空的目录
cd(切换目录)
- 当我们登录我们的Mac时,打开terminal后,所在的目录为当前用户的主目录。下面我们使用主目录下/tmp这个目录,演示cd的使用方法:
cd [相对路径或者绝对路径]
打开terminal执行下面的几条命令:
cd /tmp
进入根目录下/tmp目录
cd ~
回到主目录
cd -
回到/tmp目录
cd .
目录不变
cd ..
回到上层目录,这里的上层目录不再是当前用户主目录,而是系统的根目录,因为/tmp目录是整个系统的临时目录
cd ~
回到用户根目录
/tmp目录为系统临时目录,系统会定期的自动清空该文件夹。
我们使用的zsh,具有文件补齐的功能,你要经常利用[Tab]键快速完整的输入目录。这是一种好习惯,可以避免你按错键输入错字
- cd 是Change Directory的缩写,这是用来切换工作目录的命令。注意,目录名称与cd命令之间存在一个空格
pwd(显示目前所在的目录)
在根目录下执行:
cd ~
回到根目录
pwd
显示当前路径
cd /tmp
pwd
通过上面也可以发现/tmp并不在用户的根目录下
mkdir(新建新目录)
在用户根目录下执行
mkdir [-mp] 目录名称
参数:
-m: 配置文件的权限,直接设置不需要看默认权限(unmask)
-p: 帮助你直接将所需要的目录(包括上层目录)递归创建起来(常用)
范例:请到/tmp 下面尝试创建数个新目录看看:
cd /tmp
mkdir test <==创建一个名为test的新目录
mkdir test1/test2/test3/test4 <== 没有办法直接创建此目录
mkdir -p test1/test2/test3/test4 <== 目录创建成功
- 建议大家少使用-p这个参数来创建目录,因为担心你打错字,那么目录就变得乱七八糟的了
rmdir(删除"空"目录)
rmdir [-p] 目录名称
-p: 连同上层"空的"目录也一起删除
cd /tmp
ls -l <== 看看有多少目录存在
rmdir test <==可直接删除掉,没问题
rmdir test1 <== 因为尚有内容,所以无法删除
rmdir -p test1/test2/test3/test4
ls -l <== 显示结果中,test和test1不见了
# 利用-p 这个参数,立刻就可以将test1/test2/test3/test4 一次删除
# 不过要注意的是,这个rmdir仅能"删除空的目录"
- 如果要删除一个包含内容的目录要怎么办呢? 这个时候就需要使用"rm -r test"了
3. 查看文件与目录
ls [-aAdfFhilnRSt] 目录名称
ls [--color={never, auto, always}] 目录名称
ls [--full-time] 目录名称
参数:
-a: 全部的文件,连同隐藏文件(开头为`.`的文件)一起列出来(常用)
-A: 列出全部的文件(连同隐藏文件,但不包括`.`与`..`这两个目录)
-d: 仅列出目录本身,而不是列出目录内的文件数据(常用)
-f: 直接列出结果,而不是进行排序(ls默认会以文件名排序)
-F: 根据文件,目录等信息给予附加数据结构,例如:
*: 代表可执行文件;/:代表目录;=:代表socket文件;|:代表FIFO文件
-h: 将文件容量以人类易读的方式(例如 GB,KB等)列出来
-i: 列出inode号码(很少使用)
-l: 列出长数据串,包含文件的属性与权限等数据(常用)
-n: 列出UID与GID,而非用户与用户组的名称(很少使用)
-r: 将排序结果反向输出
-R: 连同子目录内容一起列出来,等于该目录下的所有文件都会显示出来
-S: 以文件容量大小排序,而不是文件名排序
-t: 依时间排序,而不是用文件名
在Mac和linux系统中,ls命令可能是最常被执行的命令。因为我们随时都要知道文件或者目录的相关信息。不过我们的系统中的文件所记录的信息实在是太多了,ls没有需要全部都列出来。所以当你执行ls时,默认显示的只有非隐藏文件的文件名,以文件名进行排序以及文件名代表的颜色显示。
范例一:将主文件夹下的所有文件列出来
ls -al ~
范例二:承上题,不显示颜色,但在文件名末显示出该文件名代表的类型(type)
ls -alF ~
范例三:将文件容量以人类易读的方式(例如 GB,KB等)列出来
ls -alh ~
无路如何,ls最常被使用的功能还是那个-l的参数。为此,很多系统在默认情况中,已经将ll
设置为ls -l
的意思了。也就是说,当你在终端中执行ll
,就等于是执行ls -l
。
ls -l 显示的格式如下:
-rw-r--r-- 1 zhangguojin wheel 58K 10 12 20:22 wifi.log
文件权限 | 连接数 | 文件所有者 | 文件所属用户组 | 文件大小 | 文件最后修改时间 | 文件名 |
---|---|---|---|---|---|---|
-rw-r--r-- | 1 | zhangguojin | wheel | 58K | 10 12 20:22 | wifi.log |
第一个字符代表这个文件是“目录,文件或链接文件等”
- 若是[d]则是目录
- 若是[-]则是文件
- 若是[l]则是软连接文件
cd /tmp
touch testln <== 创建一个名为testln的文件
ln -s testln testlnsoft <== 为testln文件创建软链接testlnsoft
ll
ln是一个很有意义的命令,它的功能是为某一个文件在另外一个位置建立一个同步的链接.当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。
我们通常使用软链接的形式,使用方式为:ln -s [源文件或目录] [目标文件或目录]
4. 复制,删除与移动
cp(复制文件或目录)
要复制文件,请使用cp(copy)
这个命令即可。不过,cp这个命令的用途还有很多。除了单纯复制之外,还可以创建连接文件(就是快捷方式),对比两文件的新旧而予以更新,以及复制整个目录等功能呢。但是,本书仅涉及了如何使用cp这个命令进行复制文件或者目录。
- cp(复制文件或目录)
cp [-adfilprsu] 源文件(source) 目标文件(destination)
cp [options] source1 source2 source3 .... directory
参数:
-a: 相当于`-pdr`的意思,保留文件的结构和属性(不包括文件夹)
-d: 若源文件为连接文件的属性(link file),则复制连接文件属性而非文件本身
-f: 为强制(force)的意思,若目标文件已经存在且无法开启,则删除后再尝试一次
-i: 若目标文件(destination)已经存在时,在覆盖时会先询问操作的进行(常用)
-l: 进行硬链接(hard link)的连接文件创建,而非复制文件本身
-p: 连同文件的属性一起复制过去,而非使用默认属性(备份常用)
-r: 递归持续复制,用于目录的复制行为(常用)
-s: 复制成为符号链接文件(symbolic link),即“快捷方式”文件
-u: 若destination比source旧才更新destination
最后需要注意的是,如果源文件有两个以上,则最后一个目的文件一定要是“目录”才行
# 范例一: 将主文件下的.bashrc文件复制到/tmp下,并更名为bashrc
cp ~/.bashrc /tmp/bashrc
cp -i ~/.bashrc /tmp/bashrc
# 重复做两次操作,由于/tmp下面已经存在bashrc了,加上-i参数后,
# 则在覆盖前会询问用户是否确定,可以按下n(否)或者y(是)来二次确认
# 范例二:在/tmp目录下创建/test/test1/test2/test3目录,将/test2目录复制到/tmp目录下
cd /tmp
mkdir -p ./test/test1/test2/test3
cp -r test/test1/test2 test2
ls
-r
参数在目录复制过程中经常使用,能够递归的将文件夹内部的内容复制到目标文件夹
- rm(移除文件或者目录)
rm [-fir] 文件或者目录
参数:
-f: 就是force的意思,忽略不存在的文件,不会出现警告信息
-i: 互动模式,在删除前会询问用户是否操作
-r: 递归删除,最常用在目录的删除了,`这是非常危险的参数!!!`
cd /tmp
rm -r test <== 将cp命令的范例二中的test目录删除
touch test.txt <== touch 命令能够创建一个空文件
ls <== 查看刚刚创建的文件
rm -i test.txt
# 输入n:不删除,y:删除
注意,删除任何文件的时候,一定要确认该文件是可以被删除的。误删文件对程序员来说是很致命
- mv (移动文件与目录,或重命名)
mv [-fiu] source destination
mv [options] source1 source2 source2 source3 .... directory
参数:
-f: force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖
-i: 若目标文件(destination)已经存在时,就会询问是否覆盖
-u: 若目标文件已经存在,且source比较新,才会更新(update)
# 范例一:将某个文件移动到某个目录中
cd /tmp
touch testmv.txt <== 创建名为testmv.txt的文件
mkdir mvtest
mv testmv.txt mvtest
# 将某个文件移动到某个目录去,就是这样做
# 范例二:将刚才的目录名称重命名为mvtest2
mv mvtest mvtest2
# 范例三:再创建两个文件,移动到/tmp/mvtest2
touch testmv1
touch testmv2
mv testmv1 testmv2 mvtest2
# 注意这边,如果有多个源文件或者目录,则最后一个目标文件一定是“目录”
# 意思是说,将所有的数据移动到该目录的意思
mv
就是move,移动的意思。当你要移动文件或者目录的时候,这个命令就很重要。同样,你也可以使用-u
(update)来测试新旧文件,看看是否需要移动。另外一个用途就是“更改文件名”,我们可以很轻易的使用mv来更改一个文件的文件名。
5. 文件的内容查阅
如果我们要查阅一个文件的内容时,该如何是好呢?下面给大家介绍几个常用的查看文件命令的命令。
- cat: 由第一行开始显示文件内容
- nl: 显示的时候顺便显示行号
- more: 一页一页的显示文件内容
- less: 与more类似
- head: 只看头几行
- tail: 只看结尾几行
直接查看文件内容
直接查看一个文件的内容可以使用cat, tac, nl这几个命令
- cat(concatenate[串联])
cat [-AbEnTv]
参数:
-A: 相当于-vET的整合参数,可列出一些特殊字符,而不是空白而已
-b: 列出行号,仅针对非空白行做行号显示,空白行不标行号
-E: 将结尾的断行字符$显示出来
-n: 打印出行号,连同空白行也会有行号,与-b的参数不同(常用)
-T: 将[Tab]按键以^I显示出来
-v: 列出一些看不出来的特殊字符
# 范例一:查看某个文件的内容
echo "一句话证明你是海迷" >> testcat <== 创建一个名为testcat的文件,同时,向文件写入内容
echo "我是要成为海贼王的男人" >> testcat <== 向该文件追加写入内容
cat testcat
一句话证明你是海迷
我是要成为海贼王的男人
# 承上,如果想打印行号呢
cat -n testcat
1 一句话证明你是海迷
2 我是要成为海贼王的男人
cat比较适合查看,大小较小的文件内容,像一些配置文件
- nl(添加行号打印)
nl [-bnw] 文件
参数:
-b: 指定行号指定的方式,主要有两种
-b a: 表示无论是否为空行,也同样列出行号(类似 cat -n)
-b t: 如果有空行,空的那一行不要列出行号(默认值)
-n: 列出行号的表示方法,主要有三种
-n ln: 行号在屏幕的最左方显示
-n rn: 行号在自己字段的最右方显示,且不加0
-n rz: 行号在自己字段的最右方显示,且加0
-w: 行号字段占用的位数
nl testcat
nl实际上很少使用,这里就不再赘述了
翻页查看文件内容
- more (一页一页的翻动)
cd /tmp
cp /var/log/wifi.log . <== 将wifi.log复制到/tmp目录下
more wifi.log
如果more后面的文件内容行数大于屏幕输出的行数时,就会以分页的形式显示文件内容。在more这个程序运行过程中,你有几个按键可以按的:
- 空格键(Space): 代表向下翻一页
- Enter: 代表向下滚动一行
- :f : 立即显示出文件名以及目前显示的行数
- q: 退出
- b或者ctrl-b : 代表往回翻页
- /字符串: 向下查询字符串这个关键字
输入了/之后,光标就会跑到最下面一行,并且等待你的输入,你输入了字符串并按下[Enter]后,more就会开始向下查询该字符串,而重复查询同一字符串,可以直接按下n即可。最后,不想要看了,就按下q即可离开more
- less (一页一页翻动)
功能与more几乎一样,就不再介绍了
数据选取
我们可以对输出的数据做一个简单的选取,那就是取出前面(head)与取出后面(tail)文字的功能。不过,要注意的是,head与tail都是以“行”为单位来进行选取的。
- head(取出前面几行)
head [-n number] 文件
参数:
-n: 后面接数字,代表显示几行的意思
# head默认显示文件的前10行,若要显示20行,就得指定参数n的值为20
cd /tmp
head three_days_to_see.txt <== 显示了文件前10行的内容
head -n 20 three_days_to_see.txt <== 显示文件的前20行的内容
- tail(取出后面几行)
tail [-n number] 文件
参数:
-n: 后面接数字,代表显示几行的意思(常用)
-f: 持续检测文件的内容变化(常用)
6. 文件的创建
前面大家已经学会如何利用mkdir创建文件夹,那么如何利用命令行创建一个文件呢?下面将会为大家介绍一个新命令touch
- touch(创建文件)
touch [-acdmt] 文件名
参数:
-a: 仅修改访问时间
-c: 仅修改文件的时间,若该文件不存在则不创建新文件
-d: 后面可以接欲修改的日期而不是目前的日期,也可以使用--data="日期或者时间"
-m: 仅修改mtime
-t: 后面可以接欲修改的时间而不用目前的时间,格式为[YYMMDDhhmm]
touch testtouch <== 创建一个名为testtouch的文件
7. 环境变量
在所有Unix
和类Unix
系统中,环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数,它包含了一个或者多个应用程序所将要使用到的信息。
ok,介绍了环境变量的概念,我们知道查看文件属性的命令ls的完整文件名为:/bin/ls(这是绝对路径),那你会不会觉得很奇快:“为什么我可以在任何地方执行ls这个命令呢?”这就是因为环境变量PATH的帮助。
当我们在执行一个命令的时候,举例来说“ls”好了,系统会按照PATH的设置去每个PATH定义的目录下查询文件名为ls的可执行文件,如果在PATH定义的目录中含有多个文件名为ls的可执行文件,那么先查询到的同名命令先被执行。
在Mac(以及Linux)下,环境变量是存储在PATH
的变量里面。可以通过在终端中输入echo $PATH
命令查看当前的环境变量
现在,让我们执行echo $PATH
这个命令查看本机的环境变量
echo $PATH
PATH
(一定是大写)这个变量的内容是由一堆目录所组成的,每个目录中间用冒号(:)来隔开,每个目录是有“顺序“之分的。
8. 命令与文件的查询
有时候,我需要快速的定位某个文件或者某个字符串的位置,以便我们能快速的对其进行编辑。此时,就得用到一些查询命令将要编辑的文件的路径找出来,这样才能修改或者查看
脚本文件名的查询
- which (寻找“执行文件”)
which [-a] command
参数:
-a: 将所有PATH目录中可以找到的命令均列出,而不只第一个被找到的命令名称
which ifconfig
这个命令时根据PATH
这个环境变量所规范的路径去查询“执行文件”的文件名。所以,重点是找出执行文件而已!且which后面接的是完整文件名。若加上-a参数,则可以列出所有的可以找到的同名执行文件,而非仅显示一个而已。
- whereis
whereis [-bmsu] 文件或目录名
参数:
-b: 只着二进制格式的文件
-m: 只找在说明文件manual路径下的文件
-s: 只找source源文件
-u: 查找不在上述三个选项当中的其他特殊文件
whereis ifconfig
whereis是一个很方便又快速的查找命令。常用在我们定位某些运行环境的安装目录中,例如:你想知道本机的java安装在哪个目录下了,你可以通过执行whereis java
找到
普通文件的查询
下面,我想给大家介绍一下如何在Mac系统下快速的查找文件。
虽然,系统原生提供了find
命令,用来给大家查询文件使用,但是find命令比较复杂而且效率低,速度慢。因此我推荐大家在Mac系统下使用ack
或者ag(the_silver_searcher)
进行文件搜索
- ack
- 安装ack程序
第二章中,介绍了Homebrew,我们将使用Homebrew来安装ack
brew install ack
- 使用ack进行搜索
按文件名搜索
ack -lg test.js <== 搜索文件名中包含test.js的文件
按字符串搜索
ack test <== 搜索出所有包含test字符串的地方
ack -l test <== 搜索所有包含test字符串的文件
- ag(又名the_silver_searcher)
- 安装ag程序
使用brew安装ag
brew install the_silver_searcher
- 使用ag进行搜索
按文件名搜索
ag -g Dockerfile <== 搜索所有文件名中包含Dockerfile的文件
ag -g Dockerfile ./programFile <== 在目录./programFile下搜索文件名包含Dockerfile的文件
按字符串搜索
ag docker <== 搜索出所有包含docker字符串的地方
ag -l docker <== 搜索所有包含docker字符串的文件
9.Mac下常用开发软件推荐
文档相关
编辑器
- vscode:很好用的代码编辑器(很好的支持js,golang,python,ruby语言)
- Atom:很好用的轻量的代码编辑器
- Sublime Text:前端工程师的最爱
- TextMate:文本编辑器,可以替代系统原生的文本编辑器
工具软件
- SourceTree:免费的GIT GUI软件
- Studio 3T:The IDE for MongoDB
- Medis:Beautiful Management Application for Redis
- Sequel Pro:sql数据库的GUI管理软件
- Postman:请求模拟工具