2.6 使用Linux文件系统
Linux文件系统是计算机上所有信息的储存结构。它使用目录层次结构来组织各个文件。每个目录都可以包含文件和其他目录。
如果画出Linux中的文件和目录,它看起来就像一颗倒置的树。顶部是根目录,这用一个斜线表示(/)。在根目录下面是一组Linux系统常用目录,例如bin、dev、home、lib和tmp。这些目录以及添加到根中的目录都可以包含子目录。
图2-1说明了如何以层次结构的方式组织Linux文件系统。为了阐明目录的连接方式,该图显示一个/home目录,它包含3个用户的子目录:chris、mary和tom。在chris目录中有子目录:briefs、memos和personal。要引用chris/memos目录中的inventory文件,可输入完整路径/home/chris/ memos/inventory。如果当前目录是/home/ chris/memos,那么输入inventory即可引用该文件。
一些有用的Linux目录包括:
· /bin:包含常用的Linux用户命令,例如ls、sort、date和chmod。
· /boot:包含可引导的Linux内核和引导装载(boot loader)配置文件(GRUB)。
· /dev:包含代表系统设备访问点的文件。这包括终端设备(tty*)、软盘(fd*)、硬盘(hd*)、RAM(ram*)和CD-ROM(cd*)(用户通常通过设备文件直接访问这些设备)。
· /etc:包含管理配置文件。
· /home:包含分配给每个拥有登录账号用户的目录。
· /media:提供挂载(mounting)和自动挂载设备的标准位置,如远程文件系统和可移动介质(目录名为cdrecorder、floppy等)。
· /mnt:在被标准的/media目录替代前,这是很多设备常用的挂载点。某些可引导的Linux系统仍旧使用该目录来挂载硬盘分区和远程文件系统。
· /proc:包含有关系统资源的信息。
· /root:表示根用户的主目录。
· /sbin:包含管理命令和守护进程。
· /sys:一个类似于/proc的文件系统,在Linux 2.6内核中最新出现的,包含的文件用于获得硬件状态并反映内核看到的系统设备树。它使用了/proc中的很多功能。
· /tmp:包含应用程序使用的临时文件。
· /usr:包含用户文档、游戏、图形文件(X11)、库(lib),以及各种其他用户和管理命令及文件。
· /var:包含不同应用程序使用的数据目录。特别要注意的是,这里放置作为FTP服务器(/var/ftp)或Web服务器(/var/www)共享的文件。它还包含所有系统日志文件(/var/log)。
DOS或Microsoft Windows操作系统中的文件系统结构与Linux的文件结构不同,正如选读内容“Linux文件系统与基于Windows的文件系统”中所述。
Linux文件系统与基于Windows的文件系统 |
尽管在很多方面相似,但是Linux文件系统与MS-DOS和Windows操作系统所用的文件系统还是有一些显著的差别。下面列出了其中的一些差别: · 在MS-DOS和Windows文件系统中,驱动器盘符表示不同的储存设备(例如,A: 是软驱,C: 是硬盘)。在Linux中,所有的储存设备都被置于文件系统层次结构中。因此所有/usr可能在单独的硬盘上,或者/mnt/reml是其他计算机上的文件系统,这对用户完全是隐藏的。 · 斜线(不是反斜线)用于分隔Linux中的目录名。所以,在MS系统中的C:/home/chris在Linux系统中是/home/chris。 · 在DOS中文件名几乎总是有后缀(如用于文本文件的.txt或者用于字处理文件的.doc)。虽然有时可以在Linux中使用该约定,但是3字符的后缀在Linux中已经没有所需的含义。识别文件类型时它们很有用。很多Linux应用程序和桌面环境都使用文件后缀来确定文件的内容。 · Linux系统中的所有文件和目录都有与之关联的许可和所有权。Microsoft各系统之间的安全性则有所不同。因为DOS和MS Windows开始是用作单用户的系统,所以设计这些系统时并没有在系统中内建文件所有权。后续的版本添加了一些功能(如文件和文件夹属性)来解决该问题。 |
2.6.1 创建文件和目录
作为Linux用户,保存和使用的大部分文件可能都位于用户的主目录中。表2-9显示了创建和使用文件及目录的命令。
表2-9 创建和使用文件的命令
命令 | 结果 |
cd | 改变到另一个当前工作目录 |
pwd | 打印当前工作目录的名字 |
mkdir | 创建一个目录 |
chmod | 改变文件或目录的许可 |
ls | 列出目录的内容 |
下面的步骤可在主目录中创建目录,并在各个目录间移动,还包括了如何设置相应的文件许可:
1.回到主目录。为此只需输入cd即可(如需了解引用主目录的其他方法,请参见选读部分“识别目录”)。
识别目录 |
需要在shell命令行中识别主目录时,可使用下列命令: · $HOME:该环境变量存储了主目录名。 · ~:波浪线代表命令行中的主目录。 也可以使用波浪线(~)来识别其他人的主目录。例如,可将~chris扩展为chris的主目录(可能是/home/chris)。 shell中的其他特殊目录识别方法如下: · 一点(.):指当前目录。 · 两点(..):指当前目录的上级目录。 · $PWD:该环境变量代表当前工作目录。 · $OLDPWD:该环境变量代表改变到当前目录之前的那个工作目录。 |
2.要确定已回到了主目录,可输入pwd。执行该命令后会得到下面的响应(您所获得响应会反映您的主目录):
$ pwd
/home/chris
3.在主目录中创建一个新目录test,方法如下:
$ mkdir test
4.检查该目录的许可。
$ ls -ld test
drwxr-xr-x 2 chris sales 1024 Jan 24 12:17 test
该列表显示test是一个目录(d)。d后面是许可(rwxr-xr-x),这在后面的“了解文件许可”一节中会加以解释。其余的信息指出拥有者是chris,组是sales,最后一次修改该目录中文件的日期(是在1月24日的下午12:17)。
| 在某些Linux系统中(如Fedora Core),添加一个新用户时,用户被分配给一个默认有相同名字的组。例如在前面的描述中,用户chris会被分配给chris组。这种组分配方法称为用户私有组方案。如需了解有关用户私有组的更多信息,请参见第4章。 |
现在输入下列内容:
$ chmod 700 test
该步骤将目录许可改为目录所有者可以完全访问,而其他人则根本不能访问(新的许可应该是:rwx------)。
5.将test目录作为当前目录,如下所示:
$ cd test
2.6.1.1 使用元字符和运算符
要想高效地使用shell,bash shell允许使用一些称为元字符和运算符的特殊字符。元字符可用于匹配一个或者更多文件,而无需完全输入每个文件。运算符可以将信息从一个命令或文件定向到另一个命令或文件。
2.6.1.2 使用文件匹配元字符
为了节省击键操作,并且能够轻松地引用一组文件,bash shell允许使用元字符。只要需要引用文件或者目录,例如列出、打开或者删除它,就可以使用元字符来匹配所需的文件。下面是用于文件名匹配的有用元字符:
· *:匹配任意多个字符。
· ?:匹配任一字符。
· […]:匹配括号中的任一字符,括号内可以包含用“-”来分开的字母或者数字范围。
首先到一个空目录(例如在上一节中介绍的test目录)并创建一些空文件,试用一些文件匹配元字符:
$ touch apple banana grape grapefruit watermelon
Touch命令创建空文件。下面的几行命令显示如何在ls命令中使用shell元字符来匹配文件名。尝试执行下列命令,查看是否获得相同的响应:
$ ls a*
apple
$ ls g*
grape
grapefruit
$ ls g*t
grapefruit
$ ls *e*
apple grape grapefruit watermelon
$ ls *n*
banana watermelon
第一个例子匹配所有以a(apple)开头的文件。第二个例子匹配所有以g(grape、grapefruit)开头的文件。下一个例子匹配以g开头并以t结束的文件(grapefruit)。第4个例子匹配文件名中包含e的所有文件(apple、grape、grapefruit、watermelon)。最后一个例子则匹配文件名中包含n的所有文件(banana和watermelon)。
下面是一些使用问号(?)进行匹配的例子:
$ ls ????e
apple grape
$ ls g???e*
grape grapefruit
第一个例子匹配所有以e(apple和grape)结尾的5字符文件。第二个例子匹配所有以g开头并且第5个字符是e的文件(grape和grapefruit)。
下面是一些使用括号进行匹配的例子:
$ ls [abw]*
apple banana watermelon
$ ls [agw]*[ne]
apple grape watermelon
第一个例子匹配所有以a、b、w开头的文件。第二个例子匹配所有以a、g或w开头并且以n或e结尾的文件。也可以用括号包括一个范围。例如:
$ ls [a-g]*
apple banana grape grapefruit
该例可匹配所有以字母a到g开头的文件名。
2.6.1.3 使用文件重定向元字符
命令从标准输入中接收数据,并且将它送到标准输出。使用管道(在前面描述过)可以将一个命令的标准输出定向到另一个命令的标准输入。对于文件,可以使用小于(<)和大于(>)号从文件定向数据或者将数据定向到文件。下面是这些文件重定向字符:
· <:将文件内容定向到命令。
· >:将命令的输出定向到文件,删除现有的文件。
· >>:将命令的输出定向到文件,并将输出添加到现有文件的末尾。
下面的示例命令行将信息定向到文件或从文件获得信息:
$ mail root < ~/.bashrc
$ man chmod | col -b > /tmp/chmod
$ echo "I finished the project on $(date)" >> ~/projects
在第一个例子中,将主目录内.bashrc文件的内容以邮件消息的方式发送给计算机的根用户。第二个命令行格式化chmod手册页(使用man命令),删除多余的退格(col -b),并将输出发送到文件/tmp/chmod中(如果存在/tmp/chmod文件,则删除以前的文件)。最后一个命令将下面的文本添加到用户的projects文件中:
I finished the project on Sat Jan 25 13:46:49 PST 2006
2.6.1.4 了解文件权限
使用Linux一段时间后,一定见过permission denied消息。在Linux中,与文件和目录关联的权限用来防止用户访问其他用户的私有文件,同时保护重要的系统文件。
为每个文件权限所分配的9位数据定义了所有者和其他用户对文件的访问权限。权限位显示为rwxrwxrwx。前三位适用于所有者的权限,接下来的三位适用于文件组,最后三位适用于所有用户。r代表读权限、w代表写权限、x代表执行权限。如果出现的是横线而不是字母,则表示与读、写或执行相关的权限被关闭。
因为文件和目录是不同的元素类型,所以文件和目录上的读、写和执行权限具有不同的含义。表2-10说明了每种权限的用途:
表2-10 设置读、写和执行权限
权限 | 文件 | 目录 |
读 | 查看文件的内容 | 查看其中包含的文件和子目录 |
写 | 改变文件内容、重命名文件或删除文件 | 向该目录中添加文件或子目录 |
执行 | 以程序的方式运行文件 | 将该目录改为当前目录、搜索该目录或执行该目录中的程序 |
输入ls -ld命令可以查看任何文件或目录的权限。在这个例子中,已命名的文件或目录如下所示:
$ ls -ld ch3 test
-rw-rw-r-- 1 chris sales 4983 Jan 18 22:13 ch3
drwxr-xr-x 2 chris sales 1024 Jan 24 13:47 test
第一行显示ch3文件对于所有者和组可读可写,而其他所有用户具有读权限,表示他们可以查看文件但不能修改文件内容或删除文件。第二行显示了test目录(由权限位前的字母d表示)。所有者具有读、写和执行权限,而组和其他用户只有读和执行权限。因此,所有者可以添加、修改或删除该目录中的文件,而其他人只能读取目录内容、改变到此目录和列出该目录的内容。
如果您拥有一个文件,就可以根据需要使用chmod命令改变它的权限。执行该操作的一种方法是:每个权限(读、写和执行)都赋予一个值(r=4、w=2、x=1),并且使用每个设置的总和来建立该权限。例如:为了让所有者具有全部权限,可以设置第一个值为7(4+2+1),要想只给组和其他用户读权限,可将第二和第三个值设置为4(4+0+0),这样最终值是744。任何权限组合都可从0(没有权限)~7(完全权限)中得到。
下面是一些如何修改文件(命名为file)权限以及所得到的权限示例:
# chmod 777 file rwxrwxrwx
# chmod 755 file rwxr-xr-x
# chmod 644 file rw-r--r-
# chmod 000 file ---------
也可以分别使用加号(+)和减号(-)来打开和关闭文件权限。可以为所有者用户(u)、所有者组(g)、其他用户(o)和所有用户(a)执行该操作。例如,在一个所有权限都打开(rwxrwxrwx)的文件上,使用减号选项运行chmod命令,得到的权限显示在每条命令的右边:
chmod a-w file r-xr-xr-x
chmod o-x file rwsrwsrw-
chmod go-rwx file rwx------
同样,下面的例子在所有权限都关闭(---------)的文件上,使用带有加号的chmod命令来打开权限:
chmod u+rw files rw-------
chmod a+x files --x--x--x
chmod ug+rx files r-xr-x---
创建文件时,该文件默认被赋予rw-r--r--权限。而目录则被赋予rwxr-xr-x权限。这些默认值取决于umask的值。输入umask可查看umask的值。例如:
$ umask
022
Umask值屏敝文件的666权限值和目录的777权限值。所以umask值022为目录生成755(rwxr-xr-x)权限,同样的umask值为文件生成644(rw-r--r--)权限(默认情况下,普通文件的执行权限被关闭)。
| 时间节省:使用chmod命令的-R选项可以在目录结构中一次性修改所有文件和目录的权限。例如,如果希望完全打开/tmp/test目录中的所有文件和目录的权限,可以输入: $ chmod -R 777 /tmp/test 该命令行对/tmp/test目录递归(-R)运行chmod,同时也为文件系统中该目录下的所有文件或目录(例如/tmp/test/hat、/tmp/test/hat/caps等)运行chmod。所有文件和目录都被设置成777(完全的读/写/执行权限)。不要在读/写文件系统上的重要目录中使用它。但是可以在CD-ROM上创建目录结构前使用它,这样日后使用该CD-ROM的其他用户具有完全可读和可执行的权力。 |
| 如果要完全打开权限或添加执行权限(以及适当的读/写权限),那么chmod的-R选项是最好的选择。原因是如果递归地关闭执行权限,那么就去掉了改变此结构中任何目录的能力。例如,chmod -R 644 /tmp/test关闭了/tmp/test目录的执行权限,从而无法改变其下的任何文件或目录。 |
2.6.2 移动、复制和删除文件
移动、复制和删除文件的命令相当简单。使用mv命令可以改变文件的位置。使用cp命令可以将文件从一个位置复制到另一个位置。使用rm命令则可以删除一个文件。下面是一些例子:
$ mv abc def
$ mv abc ~
$ cp abc def
$ cp abc ~
$ rm abc
$ rm *
上面的两个移动(mv)命令中,第一个命令是将文件abc移动到相同目录下的文件def中(本质上将它重命名了),而第二个命令将文件abc移动到主目录(~)中。第一个复制命令(cp)将文件abc复制为文件def,而第二个命令则将abc复制到主目录(~)中。第一个删除命令(rm)删除文件abc,第二个命令则删除当前目录下的所有文件(那些以点开始的文件除外)。
| 对于根用户,可通过mv、cp和rm别名设置命令与-i选项一起运行。这样会在每次移动、复制和删除文件时都会出现提示要求进行确认,一次一个文件,这样做是为了防止根用户因为错误操作而将大量文件搞乱。 利用mv的另一种方法是使用-b选项。有了-b选项,如果一个文件在目标文件夹有同名文件存在,那么在将新文件移动到该文件夹之前会为老文件生成一个备份副本。 |