@shenguotao
2018-02-16T15:07:45.000000Z
字数 11079
阅读 1248
身为一个程序员会用命令行来进行一些简单的操作,不是显得很装逼嘛!?嘿嘿~ ヾ(>∀<)
在学习 cmd
与 bash
之前,让我们先了解它们的相关背景,从而更好的认识以及学习它们。
首先,在说 cmd
之前,我们要先说一个操作系统 “DOS(Disk Operating System)”即“磁盘操作系统”。 DOS
是基于命令方式来进行工作的,从 1981年到 1995年这15年多的时间内在个人计算机操作系统中,可谓风靡一时,并占据着非常大的市场空间,也衍生了很多其它种类的 DOS
系统,但由于其基于命令的工作模式,对于使用者往往有着很高的专业要求,当 window
,Macos
等基于图形化界面的操作系统开始普及后,以其简单易用的操作模式, DOS
开始被迅速淘汰,虽然 DOS
已经被淘汰,但也并未完全消失,至今哪怕最新版的“window 10” 在其内部都依然保留着 DOS
。 只是这种被保留的DOS
是以一种独立的应用程序形式存在着,并且在功能上也被进行了精简,而这个应用程序也就是我们要学习的 “cmd”(命令提示符),在 cmd
中,通过执行特定的 DOS
命令,便可以让我们在 window
简单的使用场景中减少对鼠标以及图形化窗口的依赖。
而说到 bash
,则不得不提 shell
,shell是使用C语言编写的一个应用程序,它是用户使用 Unix/Linux 的桥梁,负责把用户的指令传递给内核并且把执行结果回显给用户。 shell
定义了一套自己的“命令集”,这些命令既可以在交互式的场景下等待用户输入命令然后解释执行,也可以在批处理的场景下,用户事先写一个“Shell脚本”(shell Script,通过很多的 shell命令组合成需要的功能)然后让 Shell一次性把这些命令执行完,而不必一条一条地敲命令。
说到这里,让我们重新梳理对 shell
认识的三个重点,首先 shell是一种应用程序,其次 shell中定义了一套 “shell命令集”,最后 shell命令是通过“shell解释器”解释执行,而重点中的重点就在于“shell解释器”,我们知道 shell 的种类有很多,比如 bash、csh、ksh 等等,那么是什么造成了如此多的种类差异呢?其根本原因就在于使用的解释器不同。而解释器的不同,则源于对功能的需要求不同,有的需求场景中需要很轻的解释器,而有的场景则需要更复杂的解释器。通常而言,在 Unix中默认的 shell是 sh
,在 linux中默认的 shell是 bash
,bash
是基于 Bourne shell,并吸收了 C shell和 K shell的一些特性。bash
完全兼容 sh
,也就是说,用 sh
写的脚本可以不加修改的在 bash
中执行。如果想知道你当前的 shell是哪一种的?可以在你的控制台执行这条命令 echo $SHELL
。
不论是 bash
还是 cmd
,我们也通常称它们为“命令行工具”或者是“命令行界面(CLI)”。
最后,为什么我们要学习它们?因为学习它们,(cmd)可以让我们可以在 windows
或者 (bash)linux
等简单使用场景中,脱离对鼠标与用户界面的依赖,从而提高编码效率。
当然!“装逼”也是根本原因嘛~
cd :进入指定的目录或者是显示当前的目录。
cd #C:\Users\gt\Desktop
cd dir/sub-dir # 进入到dir中的sub-dir目录。
d: # 直接进入d盘
dir :列出当前目录中的文件以及子目录
dir
dir
除了能默认显示当前目录的文件以及子目录,还可以显示指定目录下的文件以及子目录,同时也会统计目录下的文件以及目录的数量。
dir d:\fornt #显示D盘font目录中的资源
dir
默认不显示一些特殊属性的文件(例如被隐藏了的文件),如果想显示所有文件,可以使用 /a
参数。
dir /a
如果只是想显示具有特定属性的文件,可以为 /a
参数附加对应的属性。
dir /a [d|r|h|s] #显示具有指定属性的文件
dir /ad #只显示目录
dir /ar #只显示只读文件
dir /ah #只显示隐藏文件
dir /as #只显示系统文件
dir
还有一个 /o
的参数也会比较常用,使用它可以分类显示文件以及目录。
dir /o [n | s | e | d]
dir /on #按名称(字母)显示
dir /os #按大小(从小到大)
dir /oe #按扩展名(字母顺序)
dir /od #按日期/时间(从先到后)
mkdir | md :新建目录
mkdir dir # 新建一个dir目录
mkdir dir1\dir2\dir3 # 连续新建三个目录。
rmdir | rd :删除指定目录
md dirname
rd dirname
md dir1\dir2\dir3
rd dir1\dir2\
*如果目录中含有其它目录或者是文件,单纯使用 rd
将无法删除,必须要结合一些特殊的参数,例如 /s
强制删除/q
安静模式(不会询问)。
xcopy :将目录复制到指定的位置。
xcopy dir e:dir1 #将dir目录复制到 E盘,并重命名为dir1。
*使用这种方式复制目录,只能将目录以及目录中的文件复制到新的位置,但是并不能将目录中的子目录以及子目录中的所有文件也复制过去。
但可以通过附加一个参数 /e
从而实现将整个目录(所有的子目录以及文件)都复制到新的位置中。
xcopy dir e:dir1 /e
move :将指定的目录移动到新的目录中
move C:\Users\gt\Desktop\test distDir #将指定的目录移动到新的目录中
move dir1 dir2 #将dir1目录移动到dir2目录中
rename | ren :重命名文件或目录名。
ren dirName newDirName
tree : 显示目录的树形图。
tree #当前目录的树形图
tree C:\Users\gt\Desktop\ #指定目录的树形图
PS:感觉此命令在我们写项目文档时很有用,使用它可以帮我们生成项目目录的树形结构。
notepad : 打开window的记事本程序新建文件。
notepad filename.ext
notepad 1.txt
notepad index.js
*notepad 是调用window中的记事本程序来新建文件。
del :删除指定的文件或者是清空指定目录中的文件。
del filename #删除指定的文件
del file1 file2 .. #删除多个文件
del dir #清空指定目录下的所有文件
del dir1 dir2 dir3 .. #清空多个目录下的文件。
当使用 del
清空指定目录下的所有文件时,默认会有一个询问,如果想忽略询问,只需要加一个参数/q
即可。
del dir /q
出此之外,使用 del
还可以删除特定属性的文件
del /AR #可以删除只读文件
del /AH #可以删除隐藏文件
del /AS #可以删除系统文件
最后,del
还可以结合通配符来删除匹配到文件。
copy :复制一个或者是多个文件
copy file.txt file_copy.txt #在当前目录由file.txt 复制为一个名为file_copy.txt的新文件。
copy C:\Users\Admin\Desktop\index.js index_copy.js #将桌面上的index.js文件复制到当前目录,并命名为index_copy.js
copy file1 dir\file2 #相对目录进行复制。
copy file1+file2 dir\file3 #将当前目录的file1与file2文件复制到dir目录中并合成一个新的file3文件。
copy C:\Users\Admin\Desktop\ #将桌面上的所有文件复制到当前目录。
copy
命令还具有两个不是太常用的参数:
copy file /A #复制一个ASCII文件。
copy file /B #复制一个二进制文件。
copy
命令只能复制指定目录中的文件,而不能复制指定目录中的子目录和文件。
如果想复制目标目录下的所有文件和文件夹,可以使用 xcopy
命令,它相当于 copy
命令的扩展版。
move :将指定的文件移动到新的位置。
move file.txt dir/file.txt #将指定的文件移动到指定的目录中。
move file.txt dir/newfile.txt #移动的同时,重新命名。
ren :重命名文件
ren oldfilename newfilename
fc :在指定的文件集中比较文件的内容
fc file1 file2 file3
type :在命令行工具中打印文件内容。
type file #打印文件file的内容。
type dir\file #打印指定目录中file文件的内容。
type
命令还可以结合通配符一起使用,打印多个文件的内容。
type dir\* #打印指定目录dir中所有文件的内容。
我们知道 dir
是用于列出指定目录中所有的文件或子目录,实际上 dir
后面还可以跟上文件名目录名或者是通配符来设置只列出匹配到的文件以及目录。
dir index.js #列出该目录下的index.js
dir *.js #列出该目录下扩展名为js的所有文件。
dir * #列出所有文件
与查找文件相同,dir
也可以查找指定的目录
dir dirname
find :根据文件内容查找文件,不确定文件名称或者是扩展名时可结合通配符使用。
find "function handle" index.js #确定文件查找
find "function handle" *.js #根据文件名模糊查找
find "function handle" ?.js #查找文件名只有一个字符的js文件。
find "function handle" /* #查找所有文件
find
命令还具有一些其它有用的参数:/i
忽略大小写 , /v
只显示匹配到的文件,/n
显示行号。
注意,如果想在window中设置永久的环境变量,只能通过 “我的电脑” - “属性” - “高级” - “环境变量”。
使用命令行来设置环境变量只对当前窗口有效,窗口关闭时,将会自动失效。
set : 通过set
命令我们即可以查看指定的环境变量,也可以设置一个新的环境变量。
set #查看当前的所有环境变量
set PATH #查看环境变量PATH的值。
set key = value #设置一个新的环境变量并赋值。
set key = value2 #重新对指定的环境变量赋值。
*path这个环境变量是用于设置可执行文件(程序)的搜索路径,是非常常用的一个环境变量。
在CMD中,如果想引用某个环境变量,则使用 %env%
的格式。
echo %PATH%
set name=usrname
echo %name%
下面我们通过一个非常小的例子来理解通过命令设置环境变量 PATH
值的作用。
假设我们有一个可执行的程序,名字叫做 main.exe
保存在 D:\install\main
目录中。 一般,我们想执行某个程序的方法有两种:
而上面的方法,不论哪一种,都无法解决在命令行窗口中,输入 main
便可以执行 main.exe
的需求。
然而通过设置环境变量 PATH
的值便可以做到这一点。
set main_exc=D:\install\main
set PATH=%PATH%;%main_exc%
main #执行main
其实设置环境变量PATH
的值,可以直接使用 path
命令,而无需通过 set
来声明要修改的环境变量。
path %PATH%;%main_exc%
另外,在环境变量 PATH
中如果设置多个值,每个值之间使用 ;
分号隔开。
cls #清除屏幕。
cmd #进入MS-DOS
echo #显示消息,或将命令回显打开或关闭。
exit #退出 CMD.EXE 程序(命令解释程序)。
start #启动单独的窗口以运行指定的程序或命令。
calc #启动计算器
explorer #打开资源管理器
notepad #打开记事本
dxdiag #检查DirectX信息
regedt32 #注册表编辑器
Msconfig #系统配置实用程序
taskmgr #打开任务管理器
help #查看MS-DOS命令帮助。
command /? #查看指定命令详细帮助文档。
wmic #进入wmic(Windows Management Instrumentation),它是windows管理工具命令行版,使用wmic我们可以对整个系统进行管理,例如远程连接、硬件管理、进程管理、账号管理、服务管理、目录管理、共享管理等等,可说它是一个增强版的CMD。
bash
有些命令与 cmd
中非常相像,比如 cd
,再比如 mkdir
等。因此学会了 cmd
对于学习 bash
也非常有帮助。
关于bash
与cmd
的区别,我个人认为最大的不同有两点,一是目录路径的表示上, bash
使用我们常见的斜杠 cd dir1/dir2/dir3
,而 cmd
则使用反斜杠 cd dir1\dir2\dir3
,虽然 cmd
也可以使用斜杠,但是在某些情况下使用斜杠将会行不通,例如 copy
命令,所以我们建议对 cmd
保持统一的目录风格,即“反斜杠”。最后一点则在于命令的附加参数,cmd
中是通过斜杠来附加参数 /params
而 bash
则是通过横杠 -params
。
cd :进入指定的目录。
cd #进入个人目录
cd / #进入根目录
cd - #返回上次的目录
如果不确定自己当前的目录位置,可以结合 pwd
命令,便会在命令行中打印出当前目录路径。
pwd
ls :列出当前目录中的文件以及子目录
ls
ls
除了能默认显示当前目录的资源以及子目录,还可以显示指定目录下的文件以及子目录
ls ../ #列出上级目录下的资源和子目录
ls / #列出根目录下的资源和子目录。
ls /home #列出home目录下的资源和子目录。
ls
默认不显示具有特殊属性的文件(例如被隐藏了的文件),如果想显示所有文件,可以使用 -a
参数
ls -a
如果要查看资源或目录更详细的信息,可以附加 -l
属性
ls -l
mkdir :创建目录。
mkdir dir #创建一个目录dir
mkdir dir1 dir2 dir3.. #同时创建多个同级目录
如果想创建一个目录树,可以附加一个 -p
参数。
mkdir -p a/b/c/d
rmdir :删除空目录
rm -rf :强制删除目录(包括非空目录)。
rmdir emptyDir #删除一个空目录
如果想删除一个非空目录,则需要使用 rm
命令,并使用 -rf
参数。
rm -rf dir #删除一个非空目录。
rm -rf dir1 dir2 dir3 #同时删除多个非空目录。
rm -rf pattern #删除按照特定模式匹配到的目录。
cp -a :复制目录到指定的位置。
cp -a dir ../dir #将当期目录复制一份到上级目录中。
cp -a dir dir2 #复制目录并重命名。
mv :移动目录到指定位置。
mv file file2 #同级移动,相当于重命名目录file为file2
mv file ../file2 #将目录移动到上级目录中并重命名。
sudo mv /home/user/file /home/ #将指定位置的目录移动到指定位置中。
另外,mv
也可以结合通配符进行使用。
mv * ../ #将所有的目录与文件都复制到上级目录中。
利用 mv
命令同级移动功能,并结合重命名的特点,就可以做到目录的重命名。
mv file newfile2 #同级移动,相当于重命名目录file为newfile2
tree :显示目录的树形图。
tree #当前目录的树形图
tree / #根目录下的树形图
PS:感觉此命令在我们写项目文档时很有用,使用它可以帮我们生成项目目录的树形图。
/ #根目录
/bin #命令保存目录
/boot #启动目录
/dev #设备文件命令
/etc #配置文件保存目录
/home #家目录
/lib #系统库保存命令
/mnt #系统挂载目录
touch :新建文件
touch filename #新建一个文件。
touch file1 file2 file3... #同时新建多个文件。
touch dir/file #在指定的位置中新建一个文件。
如果终端已经附加了 vi
编辑器,也可以使用 vi filename
的形式来创建文件,与 cmd
中的 notepad
命令功能类似。
rm :删除文件。
rm file #删除文件
rm dir/file #删除指定目录中的文件
rm dir/* #删除指定目录中的所有文件。
cp :复制文件到指定的位置
cp file file1 #将文件复制一份并重新命名。
cp file ../ #将文件复制一份到上级目录中。
sudo cp file / #将文件复制到根目录中。
cp
还可以结合通配符一起使用,将匹配到的文件复制到指定的位置中。
cp dir/* ./ #指定目录中的所有文件复制到当前目录中。
mv :移动文件到指定的位置
mv file ../ #将文件移动到上级目录中。
mv ../file ./ #将上级的文件移动到当前目录中。
sudo mv file / #将文件移动到根目录中。
mv
不仅可以移动文件,还可以在移动后重命名文件。
mv filename1 ../filename2
mv
还可以结合通配符使用。
mv na?.txt ../nbc.txt
利用 mv
命令同级移动的功能再结合其可以重命名的特点,从而实现文件的重命名。
mv file file2 #同级移动,相当于重命名文件file为file2
diff :比较多个文件内容的不同
diff file1 file2 ...
cat :在命令行工具中打印文件的内容
cat filename #打印指定文件的内容
cat file1 file2 #同时打印多个文件的内容
cat
命令除了能打印文件的内容,还可以合并多个文件的内容保存到一个新的文件中。
cat file1 file2 > newfile
除此之外,还可以结合通配符来打印匹配到的所有文件内容。
cat a*
cat *.txt
如果查看的文件内容很多,还可以使用 less
命令
less file
然后使用 space
便可以向下一页一页的翻动,或者 pgup
向上翻页 , pgdn
向下翻页,q
则可以退出 less
命令。
find :可以根绝名称、大小、修改时间来查找指定的文件。
find -name httpd.conf #在当前目录下查找httpd.conf文件。
find -name *.js #在当前目录下查找所有js文件。
find -empty #查找所有为空的目录。
find -size -1000 #查找小于1000KB的文件。
find -size +1000 #查找大于1000KB的文件。
find
命令默认在当前目录进行查找,你也可以指定一个目录进行查找。
find / -name *.txt #在根目录下查找所有的txt文件。
find /etc -name httpd.conf #在etc目录下查找httpd.conf文件。
与根据文件名查找文件相同,也可以使用 find
按照目录名来查找目录。
find -name dirname
grep :可以根据指定的内容来查找含有这些内容的文件。
grep pattern * #查找当前目录含有指定匹配模式的文件。pattren可以是一个正则表达式。
grep c * #查找当前目录含有单词c的文件。
如果想忽略内容的大小写可以附加一个 -i
的参数。
显示匹配行及行号附加 -n
如果只显示文件名,不显示具体匹配到的内容,则附加 -l
参数
gzip :单独压缩指定的文件,压缩后删除被压缩文件,只保留压缩后的文件,并且不能压缩目录。
gzip file #压缩指定的文件
gzip file1 file2 file3... #同时压缩多个文件
gzip
还可以与通配符结合使用,压缩匹配到的文件。
gzip *.*
gzip ?.?.*
若想列出某个 .gz
压缩文件中的内容,可以附加一个 -l
参数。
gzip -l file.gz
解压某个.gz
文件,则使用 gunzip
命令。
gunzip file.gz
zip :与 gzip
相比 zip
可以压缩目录还可以将多个文件压缩在一起,并保留被压缩的文件。
zip filename.zip file1 file2 ... #将指定的文件压缩到一个新创建的压缩文件中。
zip
也可以结合通配符使用,压缩匹配到的文件。
zip filename.zip *.txt
更强的是 zip
还可以一次性压缩一个目录
zip filename.zip dir
同样的,若想列出某个 .zip
压缩文件中的内容,可以附加一个 -l
参数。
unzip -l filename.zip
解压某个.zip
文件,则使用 unzip
命令。
unzip file.zip
tar :它是linux下的一个打包命令,它可以将一大堆松散的文件或者是目录打包在一起,从而保证资源的完整性。
tar -cvf package.tar file1 file2 file3 ...
如果要打包一个目录,则指定目录名:
tar -cvf package.tar dirname
如果想解包,则附加 -xvf
的参数即可。
tar -xvf package.tar
如果只是想列出某个包中含有的文件或目录,则附加 -tvf
参数即可。
tar tvf package.tar
tar
命令只能打包,而不能压缩,而 gzip
虽然可以压缩但是只能对文件进行单独压缩,并且只保留压缩后的文件,而不保留被压缩的文件,所以将 tar
+ gzip
结合使用,将会互补其短,产生更大的功效。
tar package.tar file1 file2 file3 ... #将多个文件打包在package.tar包文件中。
gzip package.tar.gz package.tar #将通过tar打包的文件再进行压缩。
解压缩解包也要依次进行。
gunzip package.tar.gz #解压缩
tar -xvf package.tar #解包
当然,你也可以通过附加参数的方式一次性的打包压缩。
tar -zcvf package.tar.gz
然后一次性的解压缩解包
tar -zxvf package.tar.gz
vi
是 Unix及 Linux系统下标准的文本编辑器,由美国加州大学伯克利分校的 Bill Joy所创立。
我们可以在支持 vi 编辑器的命令行工具中,直接调用“vi编辑器”来编辑文件。
vi
有三种模式,分别是“命令模式(Comand Mode)”、“插入模式(Inset Mode)””、“底行模式(last line mode)”。默认的模式则是“命令模式”。
在“命令模式”下我们可以移动光标,删除字符,单词,行,复制字符,单词,行等。通过按字母 a
便可以进入到“插入模式”,而通过 shift+;
组合键(目的是输入冒号:)则进入到“底行模式”。
在“插入模式”下才可以编辑文字,按 esc
键则可以返回“命令模式”。
在“底行模式”则可以执行一些命令动作,例如保存文件,设置编辑器环境,查找字符等等。
命令模式(Command Mode)
i、a、o
进入到“插入模式”。i
会在光标的当前位置输入,a
则会在光标所在的下一个位置输入,o
会插入新的一行,并从行首开始输入文字。shift+;
进入到“底行模式”按键 | 功能 |
---|---|
[num] | h | 向左移动一个字符,如果结合数字键,则向左移动指定数量的字符 |
[num] | l | 向右移动一个字符,如果结合数字键,则向右移动指定数量的字符 |
[num] | j | 向上移动一行,如果结合数字键,则向上移动指定数量的行 |
[num] | k | 向下移动一行,如果结合数字键,则向下移动指定数量的行 |
[num] | x | 向后删除当前光标所在的字符,类似于DEL键,结合数字键则向后删除指定数量的字符 |
[num] | X | 向前删除当前光标所在的字符,类似于BackSpace键,结合数字键则向前删除指定数量的字符 |
0 | 移动到行首 |
$ | 移动到行尾 |
dd | 删除光标所在行 |
yy | 复制当前行 |
J | 合并行 |
p | 将已复制的数据在光标下一行贴上 |
P | 将已复制的数据在光标上一行贴上 |
yyp | 复制光标所在的行再插入到下一行 |
H | 光标移至屏幕顶行 |
L | 光标移至屏幕最后行 |
num + G | 跳转到指定的行 |
[ctrl] + f | 屏幕『向下』移动一页,相当于 [Page Down]按键 |
[ctrl] + b | 屏幕『向上』移动一页,相当于 [Page Up] 按键 |
r[w] | 将当前光标所在的字符替换为指定的字符 |
~ | 该表当前光标所在字符的大小写转换 |
/word | 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! |
?word | 向光标之上寻找一个字符串名称为 word 的字符串。 |
n | 根据搜索结果继续向下查询 |
N | 根据搜索结果继续向上查询 |
插入模式(Inset Mode)
esc
进入到“命令模式”该模式下用于输入以及编辑内容。
底行模式(Last Line Mode)
esc
进入到“命令模式”底行模式又可以称之为“指令模式”,在这个模式下,可以通过输入制定来让“vi编辑器”完成特定的功能。
命令 | 功能 |
---|---|
:w | 保存文件 |
:q | 退出vi编辑器 |
:wq | 退出并保存 |
:q! | 退出vi编辑器,并不保存内容 |
:set nu | 显示行号 |
:set nonu | 隐藏行号 |
ctr+c #终止当前命令
ctr+l ##清屏 相当于 clear
ctr+a #光标移到行首
ctr+e #光标移到行尾
ctr+u #把光标所在位置删除到行首
ctr+d #删除光标前面的字符,一旦内容全部删除再按则会退出窗口。
ctr+h #删除光标后面的字符,
与 window
相同 linux
中通过命令行修改或者是创建的环境变量只对当前的命令窗口有效,关闭窗口则会消失。
如果想在 linux
设置永久的环境变量,如果是系统级的环境变量请使用“vi编辑器”编辑 /etc/profile
文件,如果是用户级别的环境变量,则进入到对应的用户目录修改 .profile
文件。
在 linux
,set
命令可以查看系统级以及用户级的所有环境变量,使用 env
则查看当前用户的环境变量。
set #查看所有环境变量
env #查看与当前用户有关的环境变量
如果想设置一个环境变量,则使用 export
命令
export key=value
同样的,如果想修改某个环境变量的值,再次执行上面的命令即可。
在 linux
中引用一个环境变量,则为环境变量附加 $
符,其形式如:$env
。
$PATH #引用环境变量PATH。
环境变量如果存在多个值,则通过使用 :
冒号进行分割。
export app=/home/app
export PATH=$PATH:%app
clear #清除屏幕。
echo #显示消息,或将命令回显打开或关闭。
whoami #返回当前登录用户名。
passwd #允许当前登录的用户更改其密码。
file #尝试判断指定文件的类型。
exit #退出命令行工具
users #显示当前登录系统地用户
last #查看用户的登录日志
cammand --help #查看相关命令的帮助文档。
ping #查看网络状态