这是一份写给非计算机专业但是将来会从事数据科学、数据挖掘、前端开发等工作的人们的一份Windows命令行以及环境配置说明文档,送给我的女朋友。
一、这份文档面向非计算机专业的同学阅读和练习,内容并不艰深繁杂,需要一点站在“我是计算机管理员”的角度思考的思维来面对你的计算机。编写这份文档也是为了让非计算机专业的同学们,在学习和使用数据分析、数据挖掘、机器学习或者前端开发的时候了解Windows操作系统本身对目录、文件以及命令和环境变量的一些机制。这篇文章不会介绍有关Linux操作系统以及命令的任何设计与思想,旨在让更多的数据、前端开发者以及科研人员能够熟悉自己手上的Windows,善用现有的工具帮助自己的工作,规避不熟悉一些操作系统的概念所可能带来的一些问题。另外,这并不是一份大全,而是一个速成路线,去掉底层难以理解、纷繁复杂且很多用不到的细节,以最快的方式投入使用和学习。
二、这份文档围绕着一些开源的工具的设计思想来简要介绍常用的文件、目录组织命令、输入输出、环境变量等等一些避之不开的内容,并且增加了对工程组织与文件系统的一些结合性的介绍,九浅一深……呃不,深入浅出。让R、Python、SAS、Matlab、Octave、Julia等等脚本语言使用者快速上手,灵活应变各种环境。
请注意:
正文文字当中,部分加粗的文本可以在附录:名词释义
中找到
在开始严肃的话题之前,我们先来讨论一点轻松愉快的东西。我们在启动Windows之后,我们看到的是蓝天白云……呃不,反正就是挺漂亮的桌面,桌面上有各种各样的图标和文件,双击计算机
,开启的窗口中左边的导航窗格里,有一个库
节点(Win7,Win10去掉了库,直接挂在此电脑
下),当中有文档
,还有视频
,还有音乐
和图片
,实际上这些都是映射了用户目录中的同名英文目录。而这些,分别存放于C:\Users\[Windows当前登录用户名]\
中,当你双击此电脑
->C:
->用户
->[你的当前登录Windows的用户名]
之后,你会发现一个熟悉的景象:里面许许多多文件和目录(即文件夹,下同),而且有几个有一些目录和左面窗格的目录相同,无论名字还是图标都相同,这就是用户文件夹
,而在你的现在所在的目录C:\Users\[Windows当前登录用户名]\
,就是用户的家目录
或者叫用户根目录
。用户根目录仅允许当前登录用户本身和系统管理员权限访问(存在特殊的畸形权限情况,在这里不予讨论)。而我们也看到了,它显而易见地在用户目录下所保存的数据将全部都保存在C盘。如果一味的将你的个人数据和各种老师的视频都保存在用户目录里,C盘空间将会不堪重负,Windows系统也会一天比一天卡顿,甚至不能运行(真实案例千千万,看你究竟算不算)。
在使用计算机完成自己的工作的时候,大多数人使用Windows操作系统来完成自己手边的工作,非开发者往往常常游走于Office套件之间。对于此人群来说,命令和一些目录管理机制对他们而言是透明的,因而对于他们来讲,会创建文件、创建目录以及删除文件即可。而对于有着更高要求的脚本语言开发者就不足以解决这些问题,而脚本语言使用者在开发过程中也会遇到各种目录管理有关的问题,这些问题不能隐藏于系统机制当中,所以需要拿出来做一些必要的介绍。本章将会介绍、目录和文件、分区和盘符、命令提示符(或简称命令行)、一些常用命令。
我们在日常使用Windows上网时,时常会下载一些视频、软件、游戏,而且很多动辄都是好几个G大小的文件,我们不可能一一都存放在系统的下载目录,因为一般来说,浏览器默认下载的目录是存在于C:\Users\[Windows当前登录用户名]\Downloads
目录中(Vista以上操作系统),因此,都会放在其它的分区里(这不是废话么),所以我们要了解一下,为什么会有C盘、D盘、E盘。
我们在安装操作系统时,会给硬盘做分区,这个分区就是一段索引代码,告诉操作系统,从1~60000是C盘的区域,60001~200000是D盘的区域……等等,这些带有起始和终点的值围起来的区域就叫做分区
。这只是举一个例子不代表真实的值,仅仅用来理解分区这个概念,实际上的分区要复杂一些,但是大体原理是这样。
由此一来,我们每个分区都有一个默认的名字,叫做C:、D:、E:……而这个C:(字母C带一英文冒号),就被统称为盘符
。这个区域的起始位置会限定这个盘分区的大小,写入数据时就会给这些数据架起一道围栏,防止跑到别的盘的地盘上去。
当然,每个分区本身是有一些额外的必要的数据的,每个分区本身记录了一个序列号和一个卷标
。序列号用来标记这个分区是一个唯一的分区,相当于这个分区的身份证号。而卷标是用户可以设置分区名称的一个预留位置,比如给你的D盘分区写上日本老师资料这类名字也可以。
分区
、卷标
、区域起始位置以及序列号都属于一个硬盘分区的元数据
,他们是实实在在躺在你硬盘中的数据,用来描述一个分区的信息。
但是一定要注意:盘符不属于元数据!盘符不属于元数据!盘符不属于元数据!重要的事情说三遍。盘符不存在于硬盘分区中的元数据中,而是由Windows操作系统的磁盘控制器的逻辑来分配谁是哪个盘符。
我们的硬盘分区,剥离分区信息和分区元数据以后,就是数据区了,数据区中包含文件目录树和文件数据,这里就是真正你存放各个老师们的文件的地方,比如杨超老师、李永乐老师、汤家凤老师……等等。而数据会在上面所说的数据区域中老老实实的在这里躺着,不会越过这个起始和终止位置围栏的。而我们接下来要聊的,是怎么操作这些文件目录和文件。
命令提示符,又称为命令行(Command Line)、CMD、控制台(Console)、终端(Terminal,Linux用户的习惯称法)、Shell(Linux用户的习惯称法)、DOS(这是废弃名称)、等。
只要上述叫法在Windows上出现,指的都是命令提示符。
-
什么是命令提示符?
命令提示符是操作系统提供的一个用户通过命令,而非鼠标、用户控件界面来控制操作系统和应用程序来完成自己的工作的Windows系统工具。
他的原型是微软早期的DOS操作系统演变而来,DOS系统启动后只有命令提示符界面,全屏黑漆漆的铺展着灰白色的字符,白字黑底儿的来工作。
-
命令提示符能干嘛?
有时候有一些工作需要一些复杂的界面和步骤来完成的工作实际上通过命令行可以轻松搞定,有时候有一些重复性的工作可以通过编写命令行批量脚本来执行,让重复性的数据或文件处理的工作可以一次编写,每次用批处理脚本来处理完成。当然,还有很多现代应用程序不依赖应用程序界面(GUI)来运行,也需要依托命令行来获取输入字符和输出用户提示,通过原始文本的人机交互来执行一些各类规模的任务。
下面我们有80%的工作都在**命令提示符(下面可能会出现:命令行、控制台、CMD等,说的都是它)**中操作。
当我们打开命令提示符的时候,可以看到黑漆漆的一片,只有几行字符如下:
Microsoft Windows [版本 10.0.17134.345]
(c) 2018 Microsoft Corporation。保留所有权利。
C:\Users\Liang>_
光标在上图的最后一个位置,那一行所表示的C:\Users\Liang>
即我当前登录Windows用户的家目录,我当前登录用户名为Liang,所以这个目录显示为C:\Users\Liang>
,如果当前登录用户名是gao
,那就是C:\Users\gao>
。而当前行显示的目录,即我当前要操作文件的工作目录
。工作目录
是一个通用的相对性的工程概念,后面还会多次提到,每次提到时切记不要混淆,说的是哪个程序的工作目录。(这里不用查下面的附录,只为了强调)。
请注意这个>
,这个是输入提示符,是提示你现在可以输入命令的屏幕上的位置,>
并不包含于目录名的任何部分。
注:后面的扩展演练当中会介绍>
在自己输入的命令中是什么作用。
目录(Directory),即我们操作的黄黄的文件夹(Folder),他们没有区别,在Windows中,只要记得Folder = Directory。我们通常说的目录,即一个层级的目录,下面还可以有许许多多的目录和文件,当这些目录中的子目录和文件组成一个大大的树,我们称为目录树。我们可以看到目录树长什么模样:
执行开始菜单->运行,输入cmd,回车后我们启动了命令提示符(下称命令行或控制台)
找一个文件较少的目录,或者分区,输入tree
后回车。
卷 blog 的文件夹 PATH 列表
卷序列号为 A296-0767
G:.
├─Android
├─Hadoop
├─IM
├─MediaStream
├─resource
│ ├─3
│ └─ms1
│ └─1
├─Windows
└─Xposed
可以看到我们的目录树。不过这个命令默认不显示目录下的文件,因此,要看文件要加一个开关参数
tree /f
执行后的效果:(为了节省空间,我切换到了上面演示的目录中resource目录,实操时可能会看到各种刷屏)
卷 blog 的文件夹 PATH 列表
卷序列号为 A296-0767
G:.
├─3
│ hadoop2x-eclipse-plugin.zip
│
└─ms1
└─1
cqsc1-egg.jpg
cqsc1.png
我们可以清晰地看到一个目录的层级以及文件。
我们如何用一堆简单的字符最少的文字来描述一个文件保存在磁盘上的目录位置?答案是绝对路径
。如何表示一个绝对路径呢?绝对路径包含两个部分或者三个部分。
用于表示目录时,包含的部分是两部分:盘符+目录路径
用于表示文件时,包含的部分是:盘符+目录路径+文件名
盘符就是:C、D、E后面跟一个英文冒号
路径则是每一层级的目录名不停的往后面跟,连接目录之间的是\
反斜杠。记住只有在Windows的文件路径里是反斜杠。其它类型的http请求、Linux连接目录名的全是/
斜杠或者叫正斜杠。这里必须加以区分。
cd 命令的用法1:
在同一个盘符下,变更到目标
cd [绝对路径或相对路径目标目录]
例如:
cd G:\tools\adb\
G:\tools\adb>_
因此,对于文件来说,一个文件的全名(Full name),即这个文件的绝对路径(File path),且包含文件扩展名(Extension name)。
例如:
#这就是一个典型的目录名
G:\tools\adb\
#\tool是一级别目录,\adb是tools下一级别目录
#这就是一个典型的文件名
G:\tools\adb\adb.exe
#有不典型的不?有!
G:\tools\adb
#tools下的adb因为不存在扩展名,又没有后面的反斜杠暗示是目录,所以分不清它到底是目录还是文件。
#然而不幸的是,我们大多数遇到的目录都是这么写的,万一遇到这么一个文件,就无法切换到这个工作目录上了
#反之,需要这个路径的文件的时候,却遇到一个目录,也无法把这个目录作为文件来读写了
#例如执行:
D:\>type G:\tool\adb
拒绝访问。
#就返回了拒绝访问,本来是想当成文本文件打印的,奈何遇到了目录,只好返回个拒绝访问。
#或者把一个文件当作目录切换
G:\tools\adb
cd adb.exe
目录名称无效。
#当发现要打开的目录名不是真正的目录或者不存在的目录时,就返回了错误提示
绝对路径的好处就是:只要你这个文件存在,我就能用准确的路径名找到你。
小提示:上面的例子中出现了type命令将在下面介绍。现在只要知道是打印文本文件内容到控制台就可以了。
缺点是:换个电脑呢?唉?哪去了?FileNotFound?
- cd 命令的用法2:
在相同盘符下,cd 可以直接跟子目录名或者特殊目录符.
,..
搭配使用。
特殊目录符号中,.
表示当前目录,..
表示上级目录。
假如当前在G盘中,我想进入tools目录,执行cd tools
后回车:
G:\>cd tools
G:\tools>_
就切换到了tools目录中。
#如果我们执行:
cd .
#相当于切换到当前目录,等于没有切换,因为 . 指代当前目录。
#如果我们执行
cd ..
#那么会出现:
G:\tools\adb>cd ..
G:\tools>
#此时便切换到了上级目录。
#因此在
G:\tools\adb
#目录时,
..\fastboot
#这个目录相当于与adb同级别目录下的fastboot目录(或文件),假设它为目录,执行
G:\tools\adb>cd ..\fastboot
#会切换到当前上级目录的另一个下级目录fastboot,以下为执行结果
G:\tools\fastboot>_
- cd 命令的用法3:
在不同的盘符下,可以使用/d
开关直接变更到目标目录:
如果不使用/d
开关,要切换到与当前工作目录不同的盘符
下时,比如从D:\某个目录变更到G:,需要做如下操作:
#需要先输入目标目录所在盘符后回车
G:
cd tools\adb
或者分级别进入目标目录
G:
cd tools
cd adb
或者一次性进入目标目录
G:
cd .\tools\adb
我们可以使用相对目录路径去定位到子目录的位置。这种方式适合在相同盘符
下的目录和子目录操作。
小技巧:如果目录名或者外部命令名很长的时候,可以使用键盘上的Tab制表符按键去提示目录名或者外部命令名。关于外部命令,可以在下面的章节中了解。
而如果使用/d
开关,则可以跨分区盘符直接变更到目标目录为工作目录:
cd /d G:\tools\adb
这几种方式都非常常用,根据你的使用场景使用。
通过dir命令,我们可以浏览一个目录下的文件和目录列表。
用法1:
dir
回车后会把当前目录下的内容列举出来:
驱动器 G 中的卷是 blog
卷的序列号是 A296-0767
G:\tools 的目录
2018/11/09 11:02 <DIR> .
2018/11/09 11:02 <DIR> ..
2018/06/14 10:21 <DIR> adb
2018/11/09 10:08 <DIR> fastboot
0 个文件 0 字节
4 个目录 3,058,720,768 可用字节
我们可以看到,驱动器G,便是我们的G:,也就是G盘,卷标名为blog,以及序列号,这些上面介绍过。
但是明明tools目录中有两个目录adb 和fastboot,却出现了4个<DIR>标识,标记为4个目录。其实上面提到过,.
指代当前目录,..
指代上级目录。加上当前目录和上级目录,即有4个目录。
用法2:
dir /w
简化目录输出:执行后会省略目录和文件信息,只输出目录和文件名:
驱动器 G 中的卷是 blog 卷的序列号是 A296-0767
G:\tools 的目录
[.] [..] [adb] [fastboot] file.txt 1 个文件 0 字节 4 个目录 3,058,720,768 可用字节
我们可以看到,目录用方括号括起来了,文件没有用方括号括起来。
md
命令可以创建一个目录,在命令行中执行
D:
md 1st
如此一来我们就在D:根目录下创建了一个新的目录叫1st
rd fastboot
可以删除一个空的目录。
删除文件及所有子文件:
rd /s/q
1、使用tree /f | more
来查看D:盘根目录下的目录树。
命令:
D:
cd [你的某个子目录]
tree /f | more
解说:more命令可以分页查看文本内容,如果跟在管道命令符号“|”后面,可以将前面的命令分页输出,而不是哗啦啦啦的一下子刷到屏幕底部,以至于无法看清内容。关于管道命令符号“|”,Windows中最常用的连续两个命令的符号就两个,一个“|”另一个“&”,&符号没有管道控制功能,只负责顺序运行两个命令。
2、重定向输出文本流,tree /f > 导出目录树内容文件.txt
命令:
D:
cd [你的某个子目录]
tree /f > 导出目录树内容文件.txt
解说:> 符号是重定向屏幕输出文本流到目标文件。
3、创建一个3层目录树,然后回到第一层查看、切换到任意层你创建的目录。
- 1、查看文本文件内容:
type file.txt
file.txt就是要查看的文件
如果太长的话,不要忘记用"|"和more命令来分页显示
type file.txt|more
- 2、创建一个空白新文件
由于Windows没有一个命令是直接创建一个文件的,因此我们弯道超车,曲线救国
type nul> target.txt
target.txt就是要创建的文件,当然,如果这个命令嫌麻烦,太长可以用回显命令echo来创建
echo >target.txt
- 3、创建带有内容的文本文件
刚才提到了回显命令echo,这个命令很简单,就是把你输入的内容显示一下完事
echo 我是天才流川枫
我是天才流川枫
执行后就直接显示后面的内容,这跟创建文件有什么关系?
OK~ Show time.
执行:
echo 我是天才流川枫>me.txt
回车后什么也没有提示,不是要回显吗?
现在我们来看>
符号起了什么作用。
>
是流重定向符号,是将前面执行的命令的输出流重定向到后面的文件当中,因此”重定向“的流不走系统输出,
而是走指定的流,一般后面跟的都是文件。上面的命令执行完成后我们可以发现,当前目录多了一个me.txt文件,我们用type me.txt来查看这个文件内容,就是刚才我们写的”我是天才流川枫“。
如此一来,我们不就创建了一个带有我们特定内容的文本文件了吗。bingo~
如果我们希望继续在这个文件中追加内容怎么办呢?
echo 樱木花道是个白痴>>me.txt
此时我们再type me.txt的话,就能看到:
我是天才流川枫 樱木花道是个白痴
文本内容追加好了,而且还加好了回车符。
- 4、ren/rename 修改文件名
这个命令很简单:
ren me.txt 1.txt
OK,me.txt文件就改成了1.txt了,ren也可以用rename使用。
- 5、删除文件del
删除文件也很简单,执行:
del me.txt
介个文件就不见啦~
内部命令就是Windows自带的一些最简单的文件、目录操作命令以及其它的一些功能简单的命令,我们上面介绍的都是内部命令。但这些不是全部的命令,只是一部分简单的命令。
外部命令就是第三方控制台程序命令。比如python.exe,就属于外部命令。外部命令一般包含*.exe可执行文件,
*.bat和*.cmd等批处理脚本文件。exe文件我们都熟悉,任意exe都可以在命令行中执行,我们开发的软件exe,或者py脚本、或者其它类型的脚本或者字节码文件,都可以当作命令来执行。bat/cmd文件是Windows批处理脚本,在这个脚本当中会包含一系列的命令,执行它时会被顺序连续执行。
- 扩展演练
自己学习和搜索color命令的用法,修改控制台文字和背景颜色。
什么是环境变量?
如何组织脚本代码工程?
Windows操作系统: 微软出品的操作系统,用过电脑的中国人都用过。不用不是中国人。
Linux操作系统: 一款社区开发维护的操作系统,拥有众多的社区发行版和企业发行版,其操作系统内核被Google所开发的Android操作系统所采用,也广泛应用于各种大型网站的服务器操作系统,基本上你上过的网站背后都有它坚实的身影。
脚本语言: 无需编译的程序语言,可以通过安装一定的解释执行软件来执行脚本。比如Python、Julia
透明: 对用户无感知或弱感知
目录: 在Windows上即文件夹,全文用最原始设计的目录一词代替。
字节码文件: 有的编程语言编译成exe这种机器可以直接执行的二进制代码,有的类似Python、Julia这种是解释文本脚本文件来执行程序,还有一种,就是Java,他编译成的class字节码文件由于跨平台需求,也需要java命令来翻译执行,当然,python也可以编译成字节码来增加效率,不过这些都是后话,不在本文讨论范围内。