Linux新手命令
给老婆写了一份速成培训教材——最常用的命令及解释。当然每个人工作内容不同,常用命令也不同,这只是我的个人经验,而且要考虑到接受者的基础。
ls:列出目录下的内容,类似于dos下的dir。
常用参数有:
ls –l,逐行显示详细内容;
ls –a, 显示隐藏的文件或目录;——linux下,前缀为.的文件名和目录名即被默认为是隐藏文件
参数也可以组合ls –al ,详细显示包含隐藏文件在内的内容。
当加上-a时,会看到两个特殊的目录. 和.. ,.表示当前目录;..表示父目录
cd :切换目录
那么可以想象,cd . 不会有任何变化,因为切换到当前目录等于没说对吧;cd .. 切换到父目录(此时可以看到命令提示符前面的路径是有变化的)
有关cd使用还有几个常见用法:
cd / 直接一步到“根”(linux文件系统里根就类似windows的c: d: 等等,只不过无论多少块硬盘和分区,linux只有唯一的根/),那么就不用一次一次的cd ..往上退了对么
cd ~ 一步到“家”目录。什么是家目录呢?在linux下,每创建一个用户会自动为这个用户安排一个家目录,用户对自己的家目录拥有完全的读写权限,用户登录之后的默认工作目录也是在自己的“家”里(windows也一样,不信你用一个新帐号登录,马上会看到c盘的“用户”文件夹下多出一个和这个帐号名相同的文件夹,里面是“我的文档”“我的图片”“我的视频”之类的东西)
普通用法就是cd a/b/c 这样了,当然此时的a/b/c三级目录是在当前目录下的,这就是相对路径;如果恰好不在当前目录下,那就找不到了。只能从“根”写起cd /xxx/a/b/c ,这就是绝对路径。
上面说了,无论有多少块硬盘多少个分区,都只有一个根,那么如果加一块硬盘,它会放到哪去呢?——答案是你爱放哪就放哪。操作是这样的,首先
mkdir : 创建目录
使用mkdir创建目录,用起来相当简单,很少加参数。mkdir xxx 就是在当前目录下创建一个xxx目录,如果不在当前目录下创建呢?一种方法是用cd切换过去;一种方法是用绝对路径mkdir /xxx/a/b/c/xxx
下一步:把这个新硬盘的某个分区“附加”到我们刚才创建的目录下去
mount:挂载设备
mount /dev/sdb1 /xxx/a/b/c/xxx (目录好深啊,还真不容易找呢),以后再进到这个目录cd /xxx/a/b/c/xxx ,ls看到的就是新硬盘的内容了。(当然此处我假定新硬盘的编号是/dev/sdb1,至于为什么是这个编号,由于复杂度问题在此就不解释了)
那么如果细点心,你会提出这样的疑问——假设我原来的目录/xxx/a/b/c/xxx 不是一个新目录,而且里面有内容。那么当我在这个目录下挂载新硬盘的时候,原来的东西怎么办呢?——答案是“确实看不见了”。不用吃惊,因为并没有丢,只是看不见了而已。当我们卸载这个设备,它们就又回来了
umount: 卸载设备
umount /dev/sdb1 ,卸载掉了,简单吧。
所以可以有这样一个加密小技巧,对要加密的目录挂载一个设备(不过为了加密一个目录买块硬盘,这个代价有点高。而且别人一但发现了,umount一下就暴露了)
也许有人说干嘛弄这么复杂,象windows那样自动识别,一块硬盘(分区)一个盘符不挺好的吗?事实上这种多根目录可能会更麻烦。Linux“继承”了unix的传统,多用于服务器上,在服务器上增加、替换(坏)、乃至交换硬盘都很平常。想像一下,如果在这台机器上是d:盘,拿到另外一台机器变e:盘了,很多程序跑不起来了,那怎么办?即便是我们个人电脑,如果你经常装机做系统的话,也不少有这些困扰呢。而挂载到目录下就容易多了,只要把目录树搞一致了,随便怎么增、删、换硬盘都没关系。
想象一下这个场景,/xxx/a/b/c/xxx目录是存放某数据库文件的,据观察增长很快,硬盘空间告急。不用担心,可以这样做,先把新硬盘mount到某个临时目录下mount /dev/sdb1 /temp ,拷贝或移动原有文件(当然为了保持数据一致性,这会儿停一下数据库)cp/xxx/a/b/c/xxx/* /temp –R ,拷贝完成后,把硬盘重新mount一个位置mount /dev/sdb1 /xxx/a/b/c/xxx ,启动数据库,喔,新硬盘用上了,而且对所有的程序、用户完全感知不到变化。如果是windows得折腾好久吧:)所以还是单根目录简单好用。君不见微软现在也提倡磁盘单分区了吗:)
提到拷贝和移动了——
cp:拷贝命令
cp a.sh /tmp 拷贝当前目录下的a.sh文件到/tmp目录下一份
cp /tmp/a.sh /xxx/a/b/c/c.sh 拷贝/tmp目录下的a.sh 到/xxx/a/b/c下,并且改名成c.sh
最常用的参数–R ,表示循环递归操作下面所有子目录,大写字母
mv: 移动命令
mv /tmp/a.sh /xxx/a/b/c 移动/tmp下的文件a.sh 到/xxx/a/b/c 目录下,不改名字
mv的另外用法,改名字:mv a.sh b.sh 把a.sh改名为b.sh
不变目录,那就是改名字(因为在同一个目录下移动嘛)
发现拷贝错了或者拷贝多了,删除呗
rm: 删除文件或目录
rm a.sh 删除当前目录下的文件a.sh
rm * -R 删除当前目录下所有内容,包括循环递归子目录(-R一定要慎用啊,否则悔之晚矣)
前面提到,别人很容易发现你新加载的硬盘,那么是如何发现的呢?df命令
df: 显示文件系统
df一下,看,哪块硬盘挂在哪个目录下,占用多少空间,剩余多少空间,一目了然。如果想细致了解倒底那个目录或文件占用了我们宝贵的磁盘空间呢,du命令
du: 查看文件磁盘空间
让我们cd / 来到根目录,du一下,哇,这哪看的清。逐级列出所有文件和目录,好敬业啊。但我们不需要看这么多,只需要知道某一级目录占了多少空间就行了,加个参数--max-depth=1 是显示1级,=2那就是显示两级了。再细致的用法就看帮助吧。顺便提一句,大部分命令后面加参数--help,就可以其帮助信息了。
这么多文件,如果想找其中某一个怎么办?find搜索
find: 查找文件
find查找可以按名称、按类型、按日期等等,总之强大到让人无法直视。同样,深入学习请看帮助。最常用的按名称查找:find–name xxx.sh ,当前目录及子目录下查找xxx.sh文件
为什么我一再拿.sh的文件作示例呢?因为按照习惯,xxx.sh的文件是一个shell文件(类似于dos里的批处理文件.bat)能够被执行。但它倒底是不是个真的sh文件呢?——等等,这话什么意思,难道还有假的shell文件吗?当然有可能。Linux里不是按照扩展名来区分文件类型的,甚至都不应该用扩展名这个概念。之所以写成xxx.xxx是为了迎合windows用户的表示方法(当然这种表示方法也确实不错)。系统是不限制你要不要“扩展名”、写什么字母的。当然,如果硬要把凤凰传奇.mp3 改名成haha.sh ,你肯定是执行不起来的。反过来说,如果把一个a.sh 改名成a.xxoo,一样是可以执行的。那么岂不是文件类型乱作一团?所以嘛,采用大家约定俗成的命名方法还是利人利己的。另外,还可以用命令file来查看其真实的文件类型。
file: 查看文件类型
file a.sh ,如果确实是一个shell文件,会显示类型为:ASCII text——是个文本文件(批处理本来就是文本文件,bat也一样)。那么可以用命令cat来查看文件内容
cat: 查看文件内容
cat a.sh 即可显示内容。如果是用凤凰传奇.mp3改名改成的a.sh,那肯定就乱码了。
当然我们还可以用编辑命令编辑它
vi: 编辑文件——vi实际上是个编辑软件,限于篇幅不详细介绍,自行google
好了,说了不少了,做个小例子吧
cd ~ ——来到自己的家目录
vi a.sh ——新建并编辑一个a.sh文件。按一下字母i,进入编辑状态。此时可以输入了。输入echo $PATH (注意大小写),好,加上空格就输入这10个字符就行。按ESC键,接着输入:wq
ls –l ——看看是否已经存在a.sh这个文件了,如果存在就对了,如果没有,把电脑砸了并大声质问它
这样,我们第一个shell脚本文件就写好了。试着运行一下,输入a.sh 显示“未找到命令”。这是怎么回事呢?明明在的嘛,先别急着砸电脑并质问它。这是因为在windows下,系统默认的情况是——先在当前目录下查找并执行文件,如果没有,那么就依次到path环境变量指定的目录去查找并执行。而linux因为安全的原因,不在当前目录下查找,仅到PATH环境变量指定的目录去查找。所以,眼看着在这里还显示“未找到命令”。现在我们要执行了,怎么办呢?当然第一种方法就是把当前目录加到PATH环境变量里,不过这也太麻烦了。第二种方法就是指定绝对路径(你找不到我就告诉你确切位置),可以这样 /home/xxx/a.sh ,xxx就是当前用户名对应的家目录了;还可以这样,~/a.sh,别忘了~就是我们的家目录;还可以这样./a.sh,别忘了.就是指当前目录(忘了往前翻翻)
这回提示不一样了,显示“权限不够”,至少说明找到文件了。但权限又是怎么回事呢?还是来看一下现有什么权限吧。Ls-l ,列出详细信息。注意看a.sh一行,最前面的字符
-rw-rw-r-- ,去除掉头一个-,剩下是9个,分三组来看分别是 rw- 、rw- 、r-- ,这表示针对三种角色的权限。三种角色是所有者、同组人、其他人(角色划分的确有点不够精细,但也基本够用,关键是角色多了老麻烦了,有兴趣参考windows的文件系统的各类角色)。r表示读,w表示写,x表示执行。那么综合来看,权限是这样划分的:所有者拥有读和写权限,同组人拥有读和写(rw-)权限,其他人拥有读权限(r--)。看看,大家都没有执行权限。那么怎么加上执行权限呢?命令chmod
chmod: 改变文件权限
执行chmod +x a.sh ,表示为a.sh文件加上执行权限。这次再看一下ls -l ,权限变成了rwxrwxr-x,分三组就是自己读、写、可执行,同组人读、写、可执行,其他人读、可执行。每个角色都加上可执行权限了。实际上这样不太安全,相当于所有人都可以执行它,如果想更精细的控制,那么看帮助了解chmod详细用法。
现在再来执行一下 ./a.sh ,应该可以显示一串字符了。我们输入的命令是echo $PATH,所以执行结果是显示PATH环境变量里的目录,注意是用:分隔的,windows里是;分隔的。可以检查一下,当前目录肯定不在里面,否则就不会“未找到命令”了
正在运行的程序在系统里叫做进程。查看有哪些程序在运行中呢?
ps: 查看进程
ps aux 详细显示所有用户进程,PID表示进程号。当某个进程占用资源太多或陷入失控,我们可以杀掉它,kill
kill: 杀死进程
kill PID
ps显示的资源信息是静态的,如果想实时观测一下系统资源占用情况,使用top命令监控
top: 监控系统资源,显示各进程cpu占用,内存占用等信息。默认5秒刷新一次,按q退出。
好了,这篇粗略+速成教程就到此为止了。之所以介绍的不很详细,命令也不多,而且没有按部就班,是希望看的人知其然更要知其所以然。至于命令的具体操作,其实帮助是最好的参考资料。何况还有这个更强大man命令,想看某个命令的详细解释和用法:man xxx 。