终端常用命令

本内容出自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
  1. 安装ack程序

第二章中,介绍了Homebrew,我们将使用Homebrew来安装ack

brew install ack
  1. 使用ack进行搜索

按文件名搜索

ack -lg test.js <== 搜索文件名中包含test.js的文件

按字符串搜索

ack test <== 搜索出所有包含test字符串的地方

ack -l test <== 搜索所有包含test字符串的文件
  • ag(又名the_silver_searcher)
  1. 安装ag程序

使用brew安装ag

brew install the_silver_searcher
  1. 使用ag进行搜索

按文件名搜索

ag -g Dockerfile <== 搜索所有文件名中包含Dockerfile的文件

ag -g Dockerfile ./programFile <== 在目录./programFile下搜索文件名包含Dockerfile的文件

按字符串搜索

ag docker <== 搜索出所有包含docker字符串的地方

ag -l docker <== 搜索所有包含docker字符串的文件

9.Mac下常用开发软件推荐

文档相关

  1. Dash:API文档查看工具
  2. Quiver:程序员最好用的笔记软件

编辑器

  1. vscode:很好用的代码编辑器(很好的支持js,golang,python,ruby语言)
  2. Atom:很好用的轻量的代码编辑器
  3. Sublime Text:前端工程师的最爱
  4. TextMate:文本编辑器,可以替代系统原生的文本编辑器

工具软件

  1. SourceTree:免费的GIT GUI软件
  2. Studio 3T:The IDE for MongoDB
  3. Medis:Beautiful Management Application for Redis
  4. Sequel Pro:sql数据库的GUI管理软件
  5. Postman:请求模拟工具
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,287评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,346评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,277评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,132评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,147评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,106评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,019评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,862评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,301评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,521评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,682评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,405评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,996评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,651评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,803评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,674评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,563评论 2 352

推荐阅读更多精彩内容