Linux 命令大全
Ubuntu的图形界面使用起来非常方便,但是要想对Linux熟练掌握,就必须学会它的操作命令。虽然可能会花费一些时间,不过从长远的角度来说,这的确是一件事半功倍的事情,它会让我们更了解Linux,更灵活地去使用Linux。
Ubuntu提供了很多命令,不过在本章中不做全部介绍,只是先介绍一些常用命令,其他则分散到各个章节中。初学Linux一定要特别注意,学习命令并不意味着要掌握全部命令和每个命令的全部选项,这并不是必要的。先掌握最常用命令的最常用选项就好,下面就让我们来体会一下Ubuntu命令的强大功能。
7.1 基本命令
Ubuntu的命令较多,但是对于一些常用的系统操作,无非就是一些创建、查看、移动、复制等,本小节先熟悉一下这些基本命令。在学习这些基本命令之前,应该先了解一下Linux的一些特性和在Linux中命令的执行方式。
在Linux中,所有设备都是用文件名来表示的,就像我们在分区时所了解的那样,这与我们所熟悉的Windows系统有很大不同,Linux中并没有所谓C盘、D盘之类的说法,并且在Linux中只有文件和目录(相当于Windows中的文件夹),所有文件和目录都以倒树状结构挂载在“/”(读做根目录)目录下,也正是因此Linux系统的管理员称为root(树根),如图7-1所示。这稍后在第12章“文件系统管理”一章还会详细介绍,现在大家只是有个概念即可。
图7-1 Linux文件系统结构 |
当使用命令行进行操作时,首先要知道命令行的环境所代表的含义,如下所示:
[root@localhost: /etc # |
需要说明的一点是,对于普通用户来说,提示符“#”显示为“$”。在Linux中如果要执行一个命令则可以通过如下方式:
# 命令名 [-选项] 参数 |
需要注意的是,命令名、选项或者参数之间都是至少要有一个空格,多个空格没有关系,选项不是必需的。当有多个选项时,可以写在一起。因为Linux基本是由C语言编写的,所以无论命令名或选项,Linux都是严格区分大小写的。
在了解了以上基本的内容后,下面就来详细地介绍Linux的基本命令
7.1.1 列出文件清单命令:ls
ls命令能够列出当前目录下的所有内容。ls 命令的执行方式为:
# ls [-选项] [文件名或者目录名] |
进入到Linux命令行中后,我们至少要知道当前所处的位置有哪些内容,这些信息就可以使用ls命令来获得。它有很多的命令选项,并且选项之间可以互相组合使用,我们只列出其中常见的一些,见表7-1。
表7-1 ls命令的选项说明
在Linux中,ls命令是最常使用的命令之一,因为在命令行下要随时查看目录内容。如果不加任何选项的话,ls命令仅列出当前目录下的文件和目录名,例如,想要查看/etc目录下的内容,可以使用下列命令:
# ls /etc |
如果想要列出当前目录下所有文件,则可以使用下列命令:
# ls -a |
结果图7-2所示。
图7-2 ls -a命令执行结果 |
读者可能会发现里面有很多以“.”为开头的文件或者目录,在Linux中,如果一个文件名(目录名)以“.”开头则表示它是隐藏文件(目录)。并且在默认情况下,蓝色代表一个目录,白色代表一个普通文件。
提示:
在Ubuntu中,在默认情况下蓝色代表目录,白色代表普通文件,红色代表压缩文件或者软件包,绿色代表可执行文件,浅蓝色代表链接文件,黄色代表设备文件等。但是这并不是在所有情况下都是有效的,之所以能以颜色区分,是因为在执行命令“ls -l”时,实际上是执行了“ls --color=auto”命令,可以使用alias命令进行查看,这种设置命令别名的方式在第9章会详细介绍。如果要想确切地知道到底是文件还是目录,可以通过ls –l命令,首行字母为“d”则为目录,首行字母为“-”的即为文件,首行字母为“l”的为软链接文件
7.1.2 改变当前路径命令:cd
cd命令能够改变当前用户所处的位置。cd命令比较简单,其命令执行的方式为:
# cd 路径 |
使用cd命令之前,先来了解一下绝对路径和相对路径的概念。
我们知道,Ubuntu中所有文件或者目录都挂载在“/”目录下,所以如果一个文件或者目录的详细位置是从“/”开始的话,这样的路径称为绝对路径,如/etc/init.d/lvm。如果路径不是从根写起,则称之为相对路径,例如,现在所处的位置为/etc目录中,如果现在要进入init.d目录中,则可以执行如下命令:
# cd init.d |
这种不是从根目录写起的路径称为相对路径。
其实这两种路径的写法都能达到同样的效果,相对路径的写法有时候更加快速、方便一些,例如,进入很深的一个目录结构中时,而绝对路径能够确保路径一定正确。
例如,现在想从/root目录中进入到/etc目录中,可以下达命令:
# cd /etc |
使用cd命令时,有几个特殊格式的目录表示方式需要我们了解一下,参见表7-2。
表7-2 特殊目录的表示方法及含义
特殊目录的表示方法 |
含 义 |
. |
代表当前目录 |
.. |
代表上层目录 |
~ |
代表当然登录用户的宿主目录 |
~用户名 |
代表进入~后用户的宿主目录 |
- |
代表前一目录,即进入当前目录之前操作的目录 |
上述目录操作方式如图7-3所示。
(点击查看大图)图7-3 特殊目录的使用方法 |
提示:
直接在命令行中输入cd命令而不加任何参数,可以马上回到用户的主目录(home),这一点与DOS中cd命令显示当前路径不同,请一定注意。在Linux中,很多与用户自身相关的配置文件、属于自己的文档、程序、脚本和安装包等都存放在用户自己的home目录中,这个目录就相当于Microsoft Windows中的“我的文档”。所以能用cd命令直接“回家”,真的很方便
7.1.3 查看当前路径命令:pwd
pwd命令能够显示当前所处的路径。
这个命令比较简单,如果有时在操作过程中忘记了当前的路径,则可以通过此命令来查看路径,其执行方式为:
# pwd |
第一行为运行的命令,第二行的内容为运行pwd命令后显示的信息,即显示用户当前所在的工作目录的路径为/home/samlee。
提示:
应该经常使用pwd命令。Linux的目录结构非常复杂,一个小小的分支就可能会有十几层目录,就好像是个森林,所以Linux不会像Windows那样把全路径写在提示符里,那样太长了。
在目录用cd钻来钻去,很容易记不清自己到底身在何处,这时候执行命令可是有点危险的,例如,想删除一个文件,不搞清楚当前目录,可能会误删除同名的有用文件,而且没那么容易恢复。还有很多其他的情况需要使用pwd,尤其是在执行“rm –rf”这种对目录直接删除的操作时,更需要用pwd确定一下,可能每执行十几个命令就会输入一回。我们应该感谢Jim Meyering先生,他是pwd的创作者。
7.1.4 改变文件创建时间及创建空文件命令:touch
touch命令能够创建一个空白文件,或者改变文件的创建时间。
touch命令的执行方式为:
# touch 文件名 |
一般来说,建立一个文件都会使用一个文本编辑器(如第8章要介绍的vi编辑器),但是也可以使用touch命令来创建一个空白的文件。
例如,现在要在/home目录下创建一个名为test的空白文件,可以执行命令:
# touch /home/test |
实际上,对于touch命令来说,其最主要的功能是改变文件的时间,那么一个文件拥有哪些时间属性呢?对于一个文件来说,主要有三种时间属性,分别为:
(1)mtime:这个时间记录的是文件内容被修改的时间。
(2)ctime:这个时间记录的是文件的属性(所有者、所属组、文件名)或者权限被修改的时间。
(3)atime:这个时间记录的是文件的内容被读取的时间。
下面我们举个例子来说明,现在我们在/home目录下创建了一个文件file,然后分别查看其三个时间,命令操作如图7-4所示。
(点击查看大图)图7-4 显示文件的三种时间状态 |
通过图7-4我们可以看到,在刚开始创建文件时候三种时间是相同的,在默认情况下使用ls –l命令查看到的是文件内容修改的时间(即mtime),如果在不同时间内分别对其进行编辑内容,修改文件所有者和读取内容操作后,三个时间即会发生变化,具体命令以后会详细讲解,在此只需要观察一下命令结果即可,如图7-5所示。
(点击查看大图)图7-5 文件的三种时间状态发生变化后效果 |
通过图7-5可以看到,我们通过不同时间内的不同操作后,file文件的三种时间分别发生了变化,如果现在我们想让其变成与当前时间相同,则可以使用touch命令,执行结果如图7-6所示。
(点击查看大图)图7-6 使用touch命令改变时间状态 |
这样就将file文件的时间变成了当前的时间。
touch 命令的参数不多,常见的有以下几个,见表7-3。
表7-3 touch命令选项
7.1.5 创建目录命令:mkdir
mkdir 命令能够创建一个目录。mkdir 命令的执行方式为:
# mkdir 目录名 |
其实一个目录就是一个特殊类型的文件,就如同Windows中的文件夹一样,目录里面既可以有文件,也可以有子目录,就是因为有目录的存在,Linux才能够以一种目录树的结构对文件系统进行管理。
例如现在要建立一个directory目录,则可以执行命令:
# mkdir directory |
创建完目录后可以使用ls –l命令去查看目录是否建立成功。如果directory所在行的第一个字母为d,则说明建立成功。
有时候我们需要一次性地建立多级目录,则可以使用-p参数:
# mkdir -p /home/dir1/dir2/dir3 |
7.1.6 删除空目录命令:rmdir
rmdir命令能够删除一个空目录。rmdir命令的执行方式为:
# rmdir 目录名 |
对于目录来说,如果里面为空的时候可以使用rmdir命令来删除,并且此命令只能用来删除空目录,如果是非空目录,则需要使用下面要介绍的rm 命令。
例如我们要删除/home/directory这个空目录,则可以执行命令:
# rmdir /home/directory |
提示:
rmdir可以删除的是非空目录,被删的目录下不能有文件或子目录。如果只是有子目录存在,还可以用-p来删除;如果含有文件,那么-p选项也无能为力了。只有使用“rm –rf”大法,才能“连根拔起”。
7.1.7 除文件(目录)命令:rm
rm命令能够删除一个文件或者目录。rm命令的执行方式为:
# rm [-选项] 文件名或者目录名 |
对于Ubuntu来说,这个命令是比较危险的一个命令,因为一旦使用了这个命令删除的文件如果再进行了磁盘写操作后将无法再恢复。在其他版本的一些Linux中,默认情况下给rm命令加上了一个i选项,可以在删除前对操作进行确认,建议当学习完Shell一节后也利用命令别名使其拥有这一特性。
刚才介绍的rmdir命令只能删除一个空目录,而rm命令不但能删除任何目录,而且可以删除文件。
例如,现在在/home目录下分别建立一个文件file和一个目录directory,并且在目录directory下建立file1文件,操作如下:
# touch /home/file |
现在分别将file文件和directory目录删除,操作如下:
# rm /home/file |
现在就可以将file文件和directory目录删除了,注意,当使用rm命令删除目录时,应该加上-r选项,否则系统会显示不能删除目录的信息。rm命令选项如表7-4所示。
如果我们要在每一次执行此命令前都要进行确认操作是否进行,则可以加上-i 选项:
# rm -i /home/file |
表7-4 rm命令选项
7.1.8 复制命令:cp
cp命令能够复制一个文件或者生成一个不同名但是内容相同的文件。
cp命令的执行方式:
如果是复制文件,则执行方式为:
# cp源文件名 目标路径 |
如果是生成不同名但是内容相同的文件,则下达方式为:
# cp源文件名 目标文件名 |
例如,现在需要将/etc/passwd文件复制到/home目录中,可以执行如下操作:
# cp /etc/passwd /home |
这时在/home目录中即有一个文件passwd,现在想生成一个passwd_new文件,要求内容与passwd文件内容相同,则可以执行命令:
# cp passwd passwd_new |
这样就生成了一个passwd_new文件,其内容与passwd文件内容相同。以后当配置DNS服务器的时候,就可以采用同样的方法生成不同的区域数据文件,然后只需要对每个文件里面的不同部分进行修改就可以了,避免了每生成一个文件都要重新写一遍的麻烦。
cp命令的选项非常多,表7-5将其常用的一些列出。
表7-5 cp命令选项
7.1.9 移动文件(目录)命令:mv
mv命令用来移动一个文件(目录)或者是给文件(目录)改名。
mv命令的执行方式为:
如果是移动文件,则执行方式为:
# mv要移动的文件 目标路径 |
如果是给文件改名,则执行方式为:
# mv原文件名 新文件名 |
例如,在/目录下有一个文件为test,要将其移动到/home目录中,可以执行如下操作:
# mv /test /home |
此时就将test文件移动到/home目录中了,现在需要将其改名为test_new,则可以执行如下操作:
# mv /home/test /home/test_new |
这样就将test文件成功改名为test_new。
7.1.10 显示文件内容命令:cat
cat命令能够显示一个文件的内容。
cat命令的执行方式为:
# cat 文件名 |
cat命令的常见用法是查看一个文件的内容,例如,现在想查看一下/etc/passwd文件的内容,可以执行命令:
# cat /etc/passwd |
这样不用打开文件就可以看到passwd文件的内容了,但是cat命令的一个缺点是它在显示文件内容时不能做任何停留,所以如果遇到了一个文件内容超过整个屏幕的时候我们只能看到其最后部分,解决的办法是使用管道符(见第9章)和分屏显示命令:
# cat /etc/passwd | more |
还可以通过cat命令和输出重定向命令将一个文件的内容输出到另一个文件中去,即我们常说的将两个文件进行合并:
# cat /etc/passwd >> /home/passwd_bak |
这样passwd文件的内容就会追加到passwd_bak文件中,从而达到两个文件合并的目的。
7.1.11 从头开始查看文件内容命令:head
head命令能够从头开始显示文件内容,并且能够设定查看的行数。
head命令的执行方式为:
# head [-n] 文件名 |
n为数字,即设定的行数。
head命令能够从文件开始处查看一个文件的指定的行数,如想要查看/etc/passwd文件的前五行,可以执行命令:
# head -5 /etc/passwd |
如果没有指定行数的话,默认是显示前十行。
7.1.12 tail命令
tail命令能够从文件结尾开始显示文件内容,并且指定查看的行数。
tail命令的执行方式:
# tail [-n] 文件名 |
tail命令能够从一个文件的结尾处向上查看一个文件的指定的行数,它正好与head命令相反,是倒序进行查看的,如想要查看/etc/passwd文件的后面5行,可以执行命令:
# tail -5 /etc/passwd |
与head命令一样,如果没有指定行数的,默认是显示后面十行。
7.1.13 分屏显示文件命令:more(less)
more命令能够对文件内容或者查询结果进行分屏显示。more命令的执行方式为:
# more 文件名 |
more命令可以单独使用,也可以和配合管道符使用。它的主要作用是能够将屏幕输出的结果分屏显示。例如使用cat命令查看/etc/passwd文件时,只能看到最后的内容,为了能够看到文件所有内容,可以执行命令:
# more /etc/passwd |
或者是配合管道符命令:
# cat /etc/passwd | more |
这时就可以分屏来查看文件内容了,可以通过回车键向下一行行滚动,但是它的缺点是不能够进行向上滚动,如果想向上翻屏,需要使用less命令,less命令的用法与more命令完全相同,唯一不同点是less命令能够向上翻屏。可以通过上下箭头进行上下一行行滚动,也可以通过page up/page down命令向上/向下进行一屏一屏滚动。
7.2 文件处理命令
Linux提供了一些用于处理文件的命令,使用它们,能够完成很多只有高级文本编辑器才能完成的功能,本节对其常用的一些进行介绍。
7.2.1 文件比较命令:diff
diff命令能够比较两个文件的差异,diff命令的执行方式为:
# diff [-选项] 文件一 文件二 |
如果想比较出两个文件内容的不同,使用diff命令非常方便。例如,现在将/etc/passwd文件复制到/home目录下,并且将其复制生成文件passwd_new,再将passwd_new文件进行修改,然后使用diff命令比较出两个文件的不同,操作如下:
# cp /etc/passwd |
这样就很容易看到两个文件的不同了。
diff命令后还可以加一个目录名和文件名或者两个都是文件名,换句话说,如果上述命令执行方式处的文件一(或者是文件二)是目录,文件二(或者是文件一)不是目录,这样diff就会在目录中找到与文件名相匹配的文件进行比较,例如:
# diff /home file |
这样diff会在/home目录中找到是否有file文件,然后与后面的file文件进行内容比较。
7.2.2 排序命令:sort
sort命令能够对文件内容或者查询结果进行排序。
sort命令的执行方式为:
# sort [-选项] 文件名 |
sort命令可以对指定文件中的所有行进行排序,它的排序是根据从指定的行抽取的一个或者多个关键字来进行排序的。
例如,现在想根据/etc/passwd文件中的第三列来将passwd文件进行排序后输出,应该下达如下命令:
# sort -t “:” -k 3 /etc/passwd |
其中-t选项指定了每列的分割符,-k选项指定了以第几列进行排序。
sort命令选项很多,表7-6列出了其常用选项:
表7-6 sort命令选项
7.2.3 统计命令: wc
wc命令可以对文件的行数、单词数和字符数进行统计。
wc命令执行方式为:
# wc [-选项] 文件名 |
wc命令是一个对文件进行统计的非常好的命令,例如,现在需要统计当前系统内有多少用户,因为/etc/passwd文件中保存了所有的用户,并且每个用户的信息为一行,所以可以执行命令:
# wc -l /etc/passwd |
这样就能够得到当前Ubuntu系统中的用户数,wc命令还经常和管道符进行联合使用,对前一个命令的查询结果进行统计。
sort命令的常用选项如表7-7所示。
表7-7 wc命令选项
7.3 设置权限命令
在Linux中,一个用户对一个文件(目录)是否有权利去使用,是根据此文件(目录)设置的权限所决定的。Ubuntu中的每个用户都至少属于一个组。
现以一个班级为例说明用户与组的关系。我们可以把班级里的每个学生看成是Ubuntu里的一个用户,现班级规定,每个人必须参加一个兴趣小组,甲同学参加了科技小组,那么他就是科技小组这个“组”里的成员,乙同学参加了书法小组,那么他就是书法小组这个“组”里成员,对于科技小组来说,组里的自己的私有物品也只有自己能够使用,如果书法小组的人想使用科技小组里成员的物品的话,需要科技小组的成员的物品所有者同意才可,但是由于科技小组里的成员都是一个小组,所以可能他们互相之间的使用物品的权限要比外组的成员要大一些。可以用图7-7表示。
图7-7 用户与组的关系 |
可以看到,一个用户既可以属于一个组,也可以属于多个组,而每个组里成员的各自物品都可以根据自己的规定来让同组的成员和不在此组里的成员使用,实际上,这就是Linux最基本的权限模型。
Linux中的一个文件在正常情况下是属于一个用户所有,将此用户称为文件的所有者(也可以称为属主),而将一些用户统一分在一个组里,设定此组对文件操作的权限,这个组为文件的所属组,既不是文件的所有者,也不是文件的所属组里的用户我们统一称为其他人。
了解了这些基本概念后,我们就来学习一下设定权限的相关命令。需要说明的是,对于超级用户(UID为0)来说,它拥有所有权限
7.3.1 设定权限命令 chmod(1)
chmod命令能够对文件设定权限。
在Linux中,文件(目录)的权限分为可读、可写、可执行三类权限,其中可读用字母r表示,可写用字母w表示,可执行用字母x表示。
1.对于文件来说
可读是指可以查看文件内容,例如,使用vi或者cat命令能够查看文件内容。
可写是指可以修改文件内容并且保存修改后的结果,如使用vi命令能够修改文件内容后保存。
可执行指的是能够运行此文件,在Linux中,一个是否能够执行不决定于其扩展名,而是看其是否被设定了可执行权限,当然前提是本身一定是个二进制文件或者脚本文件。例如普通文本文件即使设定了可执行权限后也无法执行。
2.对于目录来说
可读是指能使用ls命令显示目录下的内容。
可写指的是能够在此目录下建立和删除文件。在Linux中,一个文件是否能够被删除,是决定于其所在目录是否对命令执行者设定可写权限,而与文件本身权限无关,文件本身权限只是对文件本身内容或者是否能执行进行限制。
可执行指的是能够在目录下运行命令,所以如果想让一个用户能够进入此目录,必须对此目录在相应的权限位上设定可执行权限。
在对文件和目录设定之前,来看一下如何查看文件的权限。
在Linux中,使用ls -l命令查看权限属性。对于/etc/passwd文件,使用ls -l命令后结果如图7-8所示。
(点击查看大图)图7-8 /etc/passwd文件权限 |
下面介绍每列含义:
(1)第一列:文件类型和权限,这部分稍后重点介绍。
(2)第二列:i节点,即硬链接数,在文件系统部分还会介绍。
(3)第三列:文件的属主,即文件的所有者,有时候我们将一个文件复制给另一用户,要记得将文件的属主也要改变,否则可能会发生文件权限不对的错误。
(4)第四列:文件的属组,即文件的所属组,即在此组里的用户对文件有拥有不同的权限。
(5)第五列:文件的大小,大小以字节显示。
(6)第六列:最近一次文件内容的修改时间,即mtime。
(7)第七列:文件或者目录名。
现在重点来解释第一列,/etc/passwd文件使用ls -l命令后,查询结果的第一列如下:
-rw-r--r-- |
可以看到,这部分还可以细分为十列,实际上可以将这十列分为两部分,第一列为第一部分,代表了文件的类型,文件的类型主要有以下几种:
(1)-表示是普通文件
(2)d表示是目录
(3)l表示是链接文件
(4)b表示是块设备文件,例如硬盘的存储设备等
(5)c表示是字符设备文件,如键盘等
(6)s表示是套接字文件,此主要跟网络程序有关
(7)p表示是管道文件
这样根据文件类型就可以判断一个文件到底是文件还是目录,或者是哪种类型的文件,即使文件不以颜色显示也没有关系了。
第二列至第十列为第二部分,这部分一共9列,每三列为一组,共分为三组,由左至右分别代表了属主的权限,属组的权限,其他人的权限。如对于刚才我们查询的结果来说,/etc/passwd文件属主为root,属于root组,各部分权限分别为:
属主的权限为:rw-
属组的权限为:r--
其他人的权限为:r--
我们发现,每组正好由三列组成,依次代表了可读权限、可写权限、可执行权限。也就是说,如果属主对文件拥有可读权限,则在属主权限位上的第一列就用r表示,而“-”代表没有相关的权限。由此我们可以得到/etc/passwd文件的权限:
root(属主)用户对passwd文件拥有可读(r)可写(w)权限。
root(属组)组里的用户对passwd文件拥有可读权限。
既不是root用户也不属于root组的用户对文件拥有可读权限。
下面我们使用chmod命令来设定文件的权限。
chmod 命令的格式为:
chmod [选项] 权限 文件名(目录名) |
使用chmod命令设定权限的方法有两种:数字和字符。
1.数字方式设定权限
文件的权限共有三种:可读(r)、可写(w)、可执行(x),使用数字4代表读权限;2代表写权限;1代表可执行权限;0表示没有相应的权限,所以,如果用户拥有哪个权限,就将其代表的数字相加,最后相加的和即为用户的权限。比如说,还是以passwd文件为例,我们知道root(属主)用户对文件拥有的权限为rw-,所以使用数字来代表即为:
4(r) + 2(w) + 0(-)= 6 |
依此类推,能够得到属组和其他人的权限;
属组的权限:4(r) + 0(-) + 0(-) = 4 |
即644为此文件的权限,其中第一个数字是代表属主所拥有的全部权限,第二个数字是代表属组里的用户所拥有的权限,第三个数字代表其他人所拥有的权限。下面举例说明如何使用chmod命令进行设定权限,使用Ubuntu用户创建一个文件file,因为在默认情况下在Ubuntu中创建的用户都是属于users组的,所以我们希望此文件权限为:
ubuntu(属主)用户可读可写 |
由上面的方法我们能够得到此文件的权限数字为
属主:4(读) + 2 (写) + 0(执行) = 6 |
命令执行结果如图7-9所示。
(点击查看大图)图7-9 使用chmod设定权限 |
使用chmod命令以数字方式设定文件或者目录的权限,设定后以前的权限无论是什么都会以后设定的为准。
7.3.1 设定权限命令 chmod(2)
2.字符方式设定权限
还可以使用字符方式设定权限,使用字符方式能够很方便地对文件的权限进行修改和设定。字符方式各符见表7-8。
表7-8 字符方式设定权限
使用字符方式设定权限,有时可以在原来的权限基础上进行修改,现在举例说明:使用Ubuntu用户创建文件file,然后执行以下操作:
(1)将其权限设定为所有人都只读
(2)将文件属主增加可写权限
(3)将其他人的可读权限去除
执行结果如图7-10所示。
(点击查看大图)图7-10 使用字符方式设定权限 |
也可以将第二个要求和第三个要求同时完成,两个设定之间只需用“,”隔开。即可以如下操作:
# chmod u+w,o-r file |
可以使用-R选项进行多级目录的权限设定。例如:
# chmod -R 755 /home |
这样就可以将/home目录以及其目录下的所有文件和目录权限都设定为755。
7.3.2 更改属主(属组)命令:chown
chown命令可以更改一个文件(目录)的属主或者属组。
chown命令的执行方式为:
# chown [选项] 属主[.属组] 文件名 |
使用chown命令,能够将一个文件的属主或者属组进行或者同时进行改变。同时改变时,属主和属组之间使用“.”隔开,还可以使用-R选项同时将目录下的所有文件和目录的属主和属组进行修改。
例如,现在使用root用户创建一个文件,然后执行下列操作:
(1)将其文件属主改为ubuntu用户
(2)将其属组改为users组
(3)将属主和属组同时改为root
执行命令结果见图7-11。
(点击查看大图)图7-11 使用chown命令 |
在本例中使用root账号进行操作,防止来回在不一样的用户间进行切换,由上面的命令可知,单独改变文件的属组时,需要在属组组名前面加上“.”。对于root用户来说,一般情况下,文件的权限对其不起作用,特殊情况会在高级权限设定时讲解。
7.3.3 更改文件属组命令:chgrp
chgrp命令能够改变文件(目录)的属组。
chgrp命令的执行方式为:
# chgrp [选项] 属组 文件名 |
chgrp命令只是单纯的修改文件的属组,例如:
# chgrp users file |
此命令的执行结果是将file文件的属组改为了users。
提示:
chgrp与chown命令的用法基本是一致的,用法也比较简单。可以用-R参数把一个目录下的所有内容都改变用户和组。
7.4 文件查找命令
相信每个人都有过在计算机查找一些文件的经历,对于记忆力不是很好的笔者更是经常如此,相信大家对Windows的搜索功能还是记忆犹新,其实Ubuntu也提供了功能非常强大的查找命令,下面我们就来体会一下。
7.4.1 按路径进行查找的命令:which
which命令能够按PATH变量所规定的路径进行查找。
which命令的执行方式为:
# which 命令名 |
系统默认是有很多系统变量存在的,其中有一个变量PATH,它定义了执行命令时命令所要查找的路径,例如,执行passwd命令给用户改密码时,系统会自动去PATH变量所规定的路径下去搜寻是否有此命令,如果有,则执行,否则将提示命令不存在,这也是为什么有些Linux初学者明明在当前目录下执行此目录里的命令而出现系统提示命令不存在(此时若要执行可以下达命令./命令名)。
这点与Windows有很大不同,其实Windows也是有PATH变量存在的,当初笔者曾经在工作的时候安装UG软件,结果安装完成后总是无法运行UG程序,最后将UG程序的路径给放到PATH变量里才正常运行。
由上可以看出,PATH变量是存放命令的,而which是按PATH变量规定的路径来找,所以which主要是用来查找命令的,并且查找到后将命令的绝对路径给显示出来。
例如,现在想知道which命令本身的绝对路径,可以下达命令:
# which which |
这样查询到的结果为:
/usr/bin/which |
Which命令一般只查询到第一个匹配的结果,如果想将所有匹配的结果全部显示出来可以加上-a参数。
7.4.2 按资料库查找的命令:whereis
whereis命令能够将不但能查询出命令,还能查询出Ubuntu资料库里记载的文件。
whereis命令的下达方式为:
#whereis [选项]文件名 |
与which不同的是,whereis不但能够找到可执行的命令,而且将所有包含文件名字符串的文件全部查找出来,而且速度非常快,远远快于我们将要介绍的虽然强大但速度却有些慢的find命令。这是因为Ubuntu会将它里面所有的资料都记录在一个资料库里,而whereis命令查找时并不会在整个磁盘上进行查找,而只在此资料库里进行查找。
例如使用whereis命令来执行搜寻passwd,得到的结果如图7-12所示。
(点击查看大图)图7-12 使用whereis命令 |
可以看到,不但找到了passwd命令,连passwd文件等也找到了。
whereis命令常见选项如表7-9所列。
表7-9 whereis命令选项
7.4.3 查找所有匹配的文件的命令:locate
locate命令能够将所有与被查询的文件名相同的文件查询出来。
locate命令的执行方式为:
# locate 文件名 |
locate命令的下达方式比较简单,直接加上要查询的文件名即可,因为它也是从资料库进行查询,所以速度也比较快,但是因为资料库的信息由crond进程控制更新,所以有时会发生刚安装完的软件查询不到的现象。
7.4.4 功能强大的查找命令:find
find命令能够按多种方式指定查询条件,然后进行查询出指定的文件。
说明:因为find命令功能强大,而且能够设定查询条件,里面涉及的权限和文件类型的相关知识,所以大家可以在学完相应的章节后再来学习find命令。
find命令的执行方式:
# find 查找的路径 [选项] [对查询到结果执行的命令] |
find命令能够按照用户给定的条件进行查找,并且可以指定查找的路径,它甚至可以在整个文件系统内或者在具有网络文件系统(NFS)的情况下进行查找。
为了方便起见,我们将根据find 命令的选项进行分类说明。
1.根据文件时间状态进行查找
大家还记得介绍touch命令时提到的与文件有关的三个时间吧,所以根据文件时间状态进行查找主要有以下几项:
-atime(+ | -)n:此选项代表查找出n天以前被读取过的文件。 |
说明:
n为数字,如果前面没有+或者-号,代表的是查找出n天以前的,但是只是一天之内的范围内发生变化的文件。
如果n前面有+号,则代表查找距离n天之前的发生变化的文件。如果是减号,则代表查找距离n天之内的所有发生变化的文件。
-newer file1 ! –newer file2中的!是逻辑非运算符。
下面举例说明,现在想查询一下所有在最近三天之内内容发生变化的文件,可以执行:
# find / -mtime -3 |
如果想查找在/home目录下查找比file1新但是没有file2新的文件,则执行命令:
#find /home -newer file1 ! –newer file2 |
2.根据用户或者组进行查找
系统记录一个用户实际上记录的是它的UID号,而记录组则是记录的GID号,所以根据用户或者组进行查找的选项为:
-user 用户名:根据文件的属主名查找文件。 |
说明:
关于用户的UID和GID的说明请查阅用户管理一章。
有时我们可能使用一个用户建立了一些文件,当此用户被删除后,他所建立的文件就成了无属主的文件了,所以我们应该用-nouser来查询,-nogroup与之相同。
下面举例说明,现在想查找所有在/home目录中属主是Ubuntu用户的文件,应执行命令:
# find /home -user ubuntu |
查找出/etc/下所有不属于任何人的文件,应执行命令:
# find /etc -nouser |
3.根据文件的权限或者大小名字类型进行查找
Linux里的文件是否能够执行与它的扩展名无关,主要是看它是否设置了可执行权限。所以根据文件权限我们也可以设定查找条件:
-name文件名:按找文件名进行查找。 |
说明:
文件类型可以通过ls -l命令进行查询,“-”代表普通文件,“d”代表目录。“b”代表设备文件,“c”代表字符设备文件,具体每部分的含义详见文件系统一章。
按文件大小进行查询时,默认的单位是块,因为绝大多数人习惯使用字节或者K等单位,所以我们用“c”表示字节,用“k”表示1024字节。前面如果有“+”号代表大于n所指定的大小,“-”代表小于n所指定的大小,没有的话表示正好等于n所指定的大小。
关于文件的权限设定请参照文件系统章节中权限设定部分,在此不再详述。但需要注意的是此权限应该是4位,即加上了特殊权限位的部分。如果文件权限前面有“+”号,则表示所查找的文件的权限中有前面权限条件的任意一个即可,如果是“-”号,则表示所查找的文件的权限中至少要包含前面权限的所有,比权限条件多没有关系,但一定不能少于权限条件。
下面举例说明,现在想找出/etc目录内所有的文件大小超过1MB的文件,则执行命令:
# find /etc -size +1000000c |
在此处1000000c也可以用1000K来表示。
如果想要找出系统内所有具有SUID位的文件,则执行命令:
# find / -perm -4000 |
因为找到的文件必须要具有SUID位,所以要用”-4000”,如果是用“+4000”的话,意思是一个文件只要拥有上述任意一个条件就会被显示出来。
如果想查系统内所有具有SUID,SGID或者黏滞位的文件找出来,可以执行命令:
# find / -perm +7000 |
这条命令将会把系统内的任意一个只要具有SUID或者SGID或黏滞位的文件都列出来。
4.多个查找选项的应用
有时候需要查找同时符合两个条件,这时需要-a或者-o选项:
-o:逻辑或,两个条件只要满足一个即可。 |
在/etc目录下查找大于1MB小于10MB的文件。
# find /etc -name inittab -o -name grub.conf |
查找/etc目录下文件名为inittab或文件名为grub.conf的文件。
5.对查找到结果的处理
有时候我们对于查找到的结果需要对其进行进一步的操作,这就需要使用-exec或者-ok选项,或者使用-print选项。其使用的格式为:
# find 查找的路径 [选项] [对结果处理的命令] |
前三部分就是在前面三节介绍的设定不同的条件,而对结果进行处理的格式为:
-exec shell命令 {} ; |
其中-exec就是代表要执行shell命令,后面加的是shell指令,再后面的“{}”表示的是要对前面查询到的结果进行查询,最后的“;”表示命令结束。需要注意的是“{}”和“”之间是要有空格的。而-ok选项与-exec的唯一区别就是它在执行shell命令的时候会事先进行询问,-print选项是将结果显示在标准输入上。
例如现在我们想查找系统内所有具有SUID位的文件,并且将结果保存在/root/SUID_file中,则执行命令:
# find / -perm -4000 -exec ls –l > /root/SUID_file {} ; |
这样就能够保存结果了,其中的“>”命令是输出重定向,可参考shell基础一章。
其实对于find命令来说它的选项非常多,在此并没有完全列出,另外find命令也可以与通配符进行配合使用,例如,下面的命令就查找/home目录下所有以“.txt“为结尾的文件:
# find /home -name “*.txt” -ok rm {} ; |
7.5 压缩解压命令
经常在工作中使用U盘的朋友可能总会遇到U盘空间不足的情况,或者有时候我们要在一个网络带宽一般的网络里发送邮件的话,可能一两兆的大小会让我们付出漫长的等待代价,这样就必须要学会一些文件的压缩命令来解决以上的这些问题。Linux也为提供了很多的压缩和解压的命令。
7.5.1 压缩命令:gzip
gzip命令能够压缩和解压以.gz为结尾的文件。
gzip命令的执行方式为:
# gzip [-选项] 文件名 |
gzip命令是Linux比较常见的压缩命令之一,它能够产生以.gz为后缀名的压缩文件。
例如现在我们要对/home/file文件进行压缩,执行命令:
# gzip /home/file |
压缩完成后会发现原来的file文件已经变成了file.gz文件,原文件已经消失。
还可以在压缩过程中指定压缩的百分比,gzip命令提供了1-9级的压缩比,1的压缩比最差,但是压缩速度比较快,而9的压缩比最好,但是速度比较慢,默认的级别是6,例如:
# gzip -1 file |
gzip命令不但能够压缩文件,还可以将压缩的文件(.gz)解开,例如:
# gzip -d file.gz |
gzip命令的常见选项见表7-10。
表7-10 gzip命令选项
gzip命令选项 |
选项说明 |
-d |
解压 |
-n(n=1-9) |
指定压缩级别 |
提示:
严格来说,gzip是一个程序,对于Ubuntu本身来说,扩展名是毫无意义的,例如一个文件的扩展名为.exe不一定就是一个可执行的程序,但是对于某些特定的程序来说,这些程序要通过指定的扩展名来打开指定的文件,而这些与Ubuntu系统本身并无关系。
7.5.2 查看压缩文件内容命令:zcat
zcat命令能够不用将.gz的压缩文件解压就能查看里面的内容。
zcat命令执行方式为:
# zcat 压缩文件名 |
例如,现在不想使用gzip命令将file.gz文件解压,但是想查看其中的内容,可以执行命令:
# zcat file.gz |
7.5.3 解压.zip文件命令:unzip
unzip命令能够将被winzip压缩的文件解压。
unzip命令的执行方式为:
# unzip [-选项] 压缩文件名.zip |
例如想将file1.zip文件在当前目录下解压,则执行命令为:
# unzip file1.zip |
如果只想查看压缩文件里的文件目录,但是并不想解压,则执行命令为:
# unzip -v file1.zip |
将file1.zip文件在/home/zip目录中进行解压,但是如有相同的文件则并不覆盖原文件,执行命令为:
#unzip -n file1.zip -d /home/zip |
unzip命令的选项见表7-11。
表7-11 unzip命令选项
unzip命令的选项 |
参数说明 |
-v |
查看文件目录列表,但不解压 |
-d |
将文件解压到指定目录中 |
-n |
不覆盖原来已经存在的文件 |
-o |
覆盖已存在的文件并且不需要用户确认 |
7.5.4 压缩命令:bzip2
bzip2命令能够压缩和解压以.bz2结尾的文件。
bzip2命令的执行方式为:
# bzip2 [-选项] 文件名 |
bzip2命令生成的压缩的文件的扩展名为.bz2。
例如现在想将/home/file1进行压缩,则执行命令为:
# bzip2 file1 |
这样就生成了一个file1.bz2文件,原文件已经消失,与gzip命令一样,bzip2命令也可以在压缩前选择压缩比的操作,其常见选项与gzip相同,在此不再累述。
7.5.5 查看压缩文件内容命令:bzcat
bzcat命令也比较简单,不对.bz2文件进行解压就能查看里面内容。
命令执行方式为:
# bzcat 压缩文件名 |
7.5.6 打包并压缩命令:tar
tar命令能够对一个文件或者目录内容进行打包压缩后备份。
tar命令的执行方式为:
# tar [-选项] [要打包的文件名或者目录名] [要解压或解包的文件或者目录名] |
tar命令常常用来对文件或者目录做备份。无论是刚才的gzip命令,还是bzip2命令,都会发现它们只能对单一文件进行压缩,而即使是同时输入两个文件名,也只能是生成两个单独的压缩文件,而我们经常需要对很多文件或者目录同时进行压缩并且希望生成同一个文件,这样就得先通过tar命令将需要同时进行备份的内容放到同一文件里,称之为“.tar”文件,但是此时仅仅是相当于把不同文件放到了一个大文件中,并没有压缩,当然可以将打包和压缩的动作一次性完成。并且利用tar命令还可以在压缩文件中增加新文件或者改变文件。tar命令选项众多,最常用的请见表7-12。
表7-12 tar命令选项列表
tar命令的选项 |
选项说明 |
-c |
创建新的打包文件 |
-x |
将.tar文件解包 |
续表
tar命令的选项 |
选项说明 |
-z |
打包后直接用gzip命令进行压缩,或者解压文件。 |
-j |
打包后直接用bzip2命令进行压缩,或者解压文件 |
-t |
查看一个打包文件里的文件目录 |
-f |
使用文件或者设备(这个选项基本上是必选的) |
-k |
如果在还原时有相同的文件存在则不进行覆盖 |
-v |
在打包压缩或者解包解压后将文件的详细清单是否显示出来 |
-N |
在此选项后加日期,如果文件日期比-N选项后面 |
例如,现在想将/etc/passwd文件和/etc/shadow文件打包后压缩成user.tar.gz文件,可以执行如下操作:
# tar czvf /home/user.tar.gz /etc/passwd /etc/shadow |
这时发现/etc/passwd文件和/etc/shadow文件还存在,并没有像gzip命令一样压缩后原文件就没有了,同时会看到由于使用v选项,在打包压缩后将压缩的文件清单也显示在了屏幕上,还可以使用-t选项进行查看包里文件,如图7-13所示。
(点击查看大图)图7-13 使用tar命令查看打包文件内容 |
如果想对其进行解压解包的话,就可以使用如下命令:
#tar czvf /home/user.tar.gz /etc/passwd /etc/shadow |
这样就可以恢复压缩文件里的文件了。
通过以上的例子可以看出,如果要是创建文件的话,一般是cvf三个参数。如果压缩的话,一般再加上z或者j参数即可,但是后面的文件的扩展名也要相应地变成.tar.gz或者是.tar.bz2。而如果解包的话一般用xvf三个参数,同时还解压就需要加上z或者j参数了。
如果只想备份/usr/src目录下的比2007/1/1还新的文件,那么就执行如下命令:
# tar -N ‘2007/1/1’ czvf usr.tar.gz /usr/src |
7.6 关机重启命令
相信读者在前几个小节里大量命令的“洗礼”下,可能需要关闭计算机休息一下了,不过先别急,因为Ubuntu可不是随便就能关机的。我们知道,Ubuntu是一个多人多工的操作系统,这就意味着可能同一时间不止一个人在系统上操作,而且在Ubuntu后台还在默默地运行着很多的工作,关机很可能造成其他人工作的丢失,所以需要好好了解一下关机的命令。
7.6.1 关闭计算机命令:shutdown
shutdown命令能够安全地关闭计算机。
shutdown命令执行方式为:
# shutdown [选项] [时间] [警告信息] |
shutdown命令其实就是向系统发出一个信号,这个信号能够通知init进程改变运行级别,(系统一共有7个运行级别,具体见第14章“Ubuntu引导流程”一章),而init根据传来的信号的不同就切换到相应的级别中。
例如,现在想让系统在5分钟后关机,可以执行命令:
# shutdown -h +5 |
想让系统在晚上6点准时关机,则可以执行命令:
# shutdown -h 18:00 |
如果想让系统在10分钟后重启,并且通知所有当前登录用户,以使其能够保存工作,可执行命令:
# shutdown -r +10 “this system will be reboot after 10minutes” |
shudown的选项很多,表7-13列出了其常用选项:
表7-13 shutdown命令选项
shutdown命令的选项 |
选项说明 |
-r |
将系统服务停掉然后重启 |
-h |
将系统服务停掉,然后关机 |
-c |
取消已经在运行的shutdown命令内容 |
7.6.2 系统关机命令:halt
halt命令能够关闭计算机。
halt命令的执行方式为:
# halt [选项] |
halt命令其实就是相当于执行了shutdown -h一样,它也是停掉系统服务后然后关机。
例如使用halt命令关机:
# halt |
另外可以执行-f选项不调用shutdown命令来使其强行关机。
7.6.3 切换启动级别命令:init
init命令能够切换Ubuntu的运行级别。
init命令的执行方式为:
# init 运行级别 |
Ubuntu一共有7个运行级别,其中0级别为关机,6级别为重启,具体可以通过/etc/inittab文件查询,所以如果想使用init命令来关机,只需要下达命令:
# init 0 |
7.6.4 关机命令:poweroff
poweroff命令比较简单,它也是能够关闭计算,执行方式为:
# poweroff |
7.6.5 重启系统命令:reboot
reboot命令能够重新启动系统。
reboot命令的执行方式为:
# reboot |