Linux.Shell编程笔记-文件和文件系统


第六章 文件和文件系统

LINUX下存在5种文件类型,分别是:

》普通文件

》日录

》字符设备文件

》块设备文件

》符号链接文件

文件

ls 命令参看文件

-a 列出目录下的所有文件,包括以 . 开头的隐含文件。//常用

-l 列出文件的详细信息。

-t 以时间排序。

参考:http://linux.chinaunix.net/techdoc/system/2009/06/08/1117450.shtml

文件类型

六种:

1. 普通文件:

第一个符号是 - ,这样的文件在Linux中就是普通文件。这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具... .... 或 cp工具等。

2. 目录

目录在Linux是一个比较特殊的文件。注意它的第一个字符是d。创建目录的命令可以用 mkdir 命令,或cp命令,cp可以把一个目录复制为另一个目录。删除用rm 或rmdir命令。

3. 字符设备

第一个字符是 c ,这表示字符设备文件。比如内存、终端、黑洞

4. 块设备文件

第一个字符是b,这表示块设备,比如硬盘,光驱等设备;这个种类的文件,是用mknode来创建,用rm来删除。

5. 符号链接文件

第一个字符是l,这类文件是链接文件。

6. 套接口文件

第一个字符是 s.还有一种是p字符。这种类型很少用。

文件的权限

在Linux中的每一个文件或目录都包含有访问权限,这终访问权限决定了谁能访问和如何访问这些文件和目录。

用户分组

对于一个文件来说,可以针对3种不同的用户类型设置不同的访问权限。这3种用户类型是:

owner所有者,指创建文件的用户。

Group用户组,用户组是指一组相似用户。用户组中的单个用户能够设置其所在的用户

组访问该用户文件的权限口例如,某一类或某一项目中的所有用户都能被系统管理员归为一个用户组,一个组成员能够授予项目组中其他成员所创建的文件的访问权限。

other其他用户,用户也将自己的文件向系统内的所有用户开放。在这种情况下,系统

内的所有用户都能够访问用户的目录或文件。在这种意义上,系统内的其他所有用户就是other用户类。

可以从以下3种访问方式限制访问权限:只允许用户自己(owner)访问;允许一个预先指定

的用户组中的用户(group)访问;允许系统中的任何用户(other)访问。

[houchangren@ebsdi-23260-oozie data]$ cat /etc/passwd|head -2
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin

在/etc/passwd每个记录都有7个字段组成,分别是
用户名、

加密格式的口令、

数字的user id、

数字的group id、

全名或账户的其他说明、

家目录、

登录shell(登录时运行的程序)。

[houchangren@ebsdi-23260-oozie data]$ cat /etc/group | grep root
root:x:0:root,huanghu,dyw
bin:x:1:root,bin,daemon
daemon:x:2:root,bin,daemon
sys:x:3:root,bin,adm
adm:x:4:root,adm,daemon
disk:x:6:root
wheel:x:10:root

在用户分组文件/etc/group 中写着那个用户属于那个组,那个组有那几个用户的信息。

如果想把某一个用户写到root组下,直接在最后一列中加入即可。

Chmod 改变文件权限的命令

Chown 改变文件所有者的命令

Chgrp 改变文件所属分组的命令

文件访问权限

用户能够控制一个给定的文件或目录的被访问程度。一个文件或目录可能有读、写及执行权限。当创建一个文件时,系统会自动赋予文件所有者读和写的权限,这样可以允许所有者显示文件内容和修改文件。文件所有者可以将这些权限改变为任何他想指定的权限。一个文件也许只有读权限,禁止任何修改。也可能只有执行权限,允许它像个程序一样执行。

对于每个文件来说,文件所有者或超级用户可以设置该文件的可读、可写和可执行权限,它们分别是r,w, x。

r( Read读取)对文件而言,具有读取文件内容的权限;对n录来说,具有浏览目录的权限。

w(Write,写入)对文件而言,具有新增、修改文件内容的权限;对目录来说,具有删除、移动目录内文件的权限。

x(exeute,执行)对文件而言,具有执行文件的权限;对日录来说,该用户具有进入目录的权限。

Umask 命令

此外,默认的权限可用umask命令修改,用法非常简单,只需执行umask 777命令,便代表屏蔽所有的权限,因而之后建立的文件或目录,其权限都变成000,依次类推。通常root账号搭配umask命令的数值为022,027,077等,普通用户则是采用002,这样所产生的权限依次为755,750, 700. 775等。

文件权限数字表示法

文件和目录的权限表示,是用rwx这3个字符来代表所有者、用户组和其他用户的权限。有时候,字符似乎过于麻烦,因此还有另外一种方法是以数字来表示权限,而且仅需3个数字。

r对应数值4

w对应数值2

x 对应数值1

-对应数值0

上边对应的值的组合就是权限的数字

比如: 777 就是任何人都有rwx都有 4+2+1……4+2+1…… 4+2+1

700就是只有用户所有者能rwx

其实对应的原型是二进制的

比如–rw-rw-xw- 只要有值就对应的是1,没值对应的是0 那么对应的二进制就是-110110110

特殊权限

由于特殊权限会拥有一些“特权”,因而用户若无特殊需求,不应该启用这些权限。以避免安全方而出现严重的漏洞,造成黑客入侵,其至摧毁系统!

具体内容参考http://www.cnblogs.com/huangzhen/archive/2011/08/22/2149300.html

文件的修改时间

touch命令可以修改创建时间,如果不指定-c的参数,不存在则创建。

寻找文件

在UNIX、linux下寻找文件的机制很强大,使用find命令与其他工具结合时,你就能:

(1)找到符合某种规则的文件;

(2)对这类文件依次执行某命令。

Find 命令

公式: 用法:find [路径...] [表达式]

find命令的一般格式为:

find [pathname][-options][-print -exec -ok ...]

在命令中的参数解释如下:

pathname find命令所查找的日录路径。例如用来表示当前目录,用徕表示系统根目录。

-print find命令将匹配的文件输出到标准输出.

-exec find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command'{} \;,注意{}和\;之间的空格.

-ok和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

实例:

[houchangren@ebsdi-23260-ooziedata]$ find ../ -iname "*.sh" -print
../checkUserIsExist.sh
../if.sh
../testwhile.sh
../add.sh
../testfor.sh
../testalg.sh
../user_login.sh
../whileexample.sh
../a.sh
../testcase.sh
../whileexample2.sh
 
[houchangren@ebsdi-23260-ooziedata]$ mkdir ../../tmp
[houchangren@ebsdi-23260-ooziedata]$ find ../ -iname "*.sh" -exec cp {} ../../tmp/ \;
[houchangren@ebsdi-23260-ooziedata]$ ll ../../tmp/
总计 44
-rw-rw-r-- 1houchangren houchangren  51 01-20 16:14add.sh
-rw-rw-r-- 1houchangren houchangren 337 01-20 16:14 a.sh
-rw-rw-r-- 1houchangren houchangren  85 01-20 16:14checkUserIsExist.sh
-rw-rw-r-- 1houchangren houchangren  55 01-20 16:14if.sh
-rwxrwxr-x 1houchangren houchangren 284 01-20 16:14 testalg.sh
-rw-rw-r-- 1houchangren houchangren 206 01-20 16:14 testcase.sh
-rw-rw-r-- 1houchangren houchangren  42 01-20 16:14testfor.sh
-rw-rw-r-- 1houchangren houchangren 319 01-20 16:14 testwhile.sh
-rw-rw-r-- 1houchangren houchangren 132 01-20 16:14 user_login.sh
-rw-rw-r-- 1houchangren houchangren 193 01-20 16:14 whileexample2.sh
-rw-rw-r-- 1houchangren houchangren 253 01-20 16:14 whileexample.sh
[houchangren@ebsdi-23260-ooziedata]$

还有很多的find的用法,参考:

http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html.

遍历文件

当find文件太多传入到下一个exec的时候,如果参数太多,就会报错。这个时候可以使用xargs命令来接受一批批处理.

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一鄙分文件而不是全部,不像–exe的选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理梅一个匹配到的文件发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多、系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数.还是分批取得参数,以及每一次获取参数的数目.都会根据该命令的选项及系统内核中相应的可调参数来确定。

查询当前目录的所有普通文件然后执行file命令

[houchangren@ebsdi-23260-ooziedata]$ find  . -type f |xargs file
./sort.txt:        ASCII text
./fruit.txt:       ASCII text
./ips.txt:         ASCII text
./stuff.txt:       ASCII text
./ips.txt.t:       ASCII text
./fruits.txt:      ASCII text
./fruit.txt.rep:   ASCII text
./fruit.txt.upper:ASCII text
./salary.txt:      ASCII text
./fruit.txt.rm:    ASCII text
 

查询当前目录下普通文件并且有包含apple字符的文件信息。

[houchangren@ebsdi-23260-oozie data]$find  . -type f |xargs grep 'apple'
./fruit.txt:apple
./fruit.txt:apple 
./fruits.txt:1:2:apple-2
./fruits.txt:1:2:apple-1

比较文件

在UNIX/Linux下比较文件差异的方法很多,最经典的就是使用comm, diff命令。此外,一些文木编辑器提供了交互式的比较文件的方法,并且使用更人性化的显示方式表现出来

使用comm比较排序后文件

comm这项指令会一行行地比较两个已排序文件的差异,并将其结果显示出来,如果没有指定任何参数,则会把结果分成3列显示;第1列仪是在第1个文件中出现过的行,第2列是仅在第2个文件中出现过的行,第3列则是在第1与第2个文件里都出现过的行。若给予的文件名称为“-num”,则comm指令会从标准输入设备读取数据口

comm用法

comm file1 file2

comm [-123] filefile2

-1 不显示只在第1个文件里出现过的列。

-2 不显示只在第2个文件里出现过的列。

-3 不显示只在第1个和第2个文件里出现过的列。

使用diff比较文件

diff命令的功能为逐行比较两个文木文件,列出其不同之处。它比comm命令更能完成复杂的检查。它对给出的文件进行系统的检查,并显示出两个文件中所有不同的行,不要求事先对文件进行排序。

Diff命令的输出格式
 

file1影响行

Action

file2影响行

Number1

a

Number2[,Number3]

Number1[,Number2]

d

Number3

Number1[,Number2]

c

Number3[,Number4]

这些行类似于edit子户命令将file1文件转换成f ile2文件。Action字母之前的数字指file1,后面的数字则指file2因此,通过将a替换成d,从右往左读,你就能知进如何将file2转换成file1。在edit命令下,相同的对(即Numbed =Nurnber2)会简略为单个数字。

下列每一行,diff命令显不以<:(小于符号,冒号)开始的第一个文件中的所有受形响行,然后显示以>(大于符号)开始的第二个文件中的所有受影响行。

实例:

[houchangren@ebsdi-23260-ooziedata]$ diff fruit.txt fruit1.txt
2c2
< banana  
---
>1banana  
5c5
<%%banae 
---
>1%%banae 
 
[houchangren@ebsdi-23260-ooziedata]$ diff fruit.txt fruit2.txt
8,9d7
< orange  
< persimmon
 
[houchangren@ebsdi-23260-ooziedata]$ diff fruit2.txt fruit.txt
7a8,9
> orange  
> presimmon

执行:diff –help或者下边

Diff参数参考:http://linux.chinaunix.net/techdoc/system/2007/08/01/964240.shtml

其他比较工具

Vimdiff工具-提供了GUI的文本比较方式

用法

[houchangren@ebsdi-23260-oozie data]$vimdiff fruit2.txt fruit.txt

网上参考:

http://blog.chinaunix.net/uid-361890-id-175414.html

http://www.ibm.com/developerworks/cn/linux/l-vimdiff/

文件系统

与Windows不同的是,UNIX/Linux支持多种文件系统(Windows只支持常见的Fat32和

NTFS ) ,简直可以称得上操作系统中的瑞士军刀。UNIX/Linux下常见的文件系统有ext3, ext4, reiserfs, ZFS等,UNIX/Linux在一些特殊场景下也有特殊文件系统,例如,用于挂载交换目录

(/tmp)的tmpfs,用于网络的NFS等。

什么是文件系统

尽管内核是Linux的核心,文件却是用户与操作系统交互所采用的主要工具。这对Linux来说尤其如此,这是因为在LINUX传统中,它使用文件I/O机制管理硬件设备和数据文件。

遗憾的是,新手通常会混淆介绍Linux文件系统概念的术语。术语文件系统可以在Linux文件编制中互换使用,用于指代几个不同但相关的概念。除磁盘分区的具体实例外,文件系统还指代数据结构,以及分区中文件的管理方法。

令新手更感困惑的是,该术语还用于指代系统中文件的整体组织形式:目录树,此外,该术语还可以指代目录树中的每个子目录,如在/home文件系统中.某些人认为,这些目录和目录不能称作真正意义上的文件系统,除非它们均驻留在各自的磁盘分区上。然而,其他人却将其称作文件系统,这无疑又增添了困惑。

Linux老手可以从上下文中理解这些术语的含义。新手却很难在一时半会儿就辨别出这样的上下文。

文件系统和磁盘分区

磁盘是一个可读可写的设备。在磁盘上,有许许多多的磁道,磁道的读取器(磁头)可以在磁盘飞转时读写磁盘。但是,很多时候,一块磁盘能够容纳的数据量很大,故为了方便管理,我们将磁盘的一条条磁道分为几个部分,每个部分对应用于一块磁盘分区。

我们通常将文件系统认为是磁盘分区。UNIX/Linux中的基本文件存储单元都是磁盘分区,即将一个或多个硬盘进行逻辑划分,操作系统将每个逻辑分区视为独立的磁盘。有时候,一块磁盘过于庞大,我们要合理地规划分区,才一能有效阻止在磁盘上的存储。

Linux将这些磁盘分区做为设备处理,进而通过/dev目录中的特殊文件使用文件I/0机制。有两种类型的设备文件:块设备和字符设备。两者之间的一个重要差别是,块设备被缓冲,而字符设备因为没有文件管理系统,所以不被缓冲。

操作系统为了有效地和磁盘打交道(检索、存储、读取磁盘等),将磁盘的存储方式按照一定的规则统一起来。这种规则规定了文件是怎样被映射(住)进磁盘的分区磁道中的;规定了当没有足够连续的磁道存储大文件时,是怎样通过多个不连续磁道拼接容纳文件的,等等。这个规则就叫做文件管理系统,或者叫做磁盘分区格式。

存储在磁盘最开始位置的分区表提供了该磁盘上分区的映射口可以使用fdisk命令查看系统的分区表:

[root@ebsdi-23260-oozie~]# fdisk –l
Disk /dev/sda:85.8 GB, 85899345920 bytes
255 heads, 63sectors/track, 10443 cylinders
Units =cylinders of 16065 * 512 = 8225280 bytes
 
   Device Boot      Start         End      Blocks  Id  System
/dev/sda1   *          1          13      104391  83  Linux
/dev/sda2              14       10443   83778975   8e  Linux LVM

\

这个例子显示了本台主机只有一块硬盘,sda.如果有两块以上的话,则是sdb,sdc等。如果是IDE驱动器的话,则是had.驭动器内的分区用数字指代,因此/dev/sda5是第一个SCSI驱动器上的第五个分区。

第一至第四个分区保留给主分区,第五个及随后的分区用于逻辑分区.因此,以上所示的分区表中有一个驱动器sda,它包含4个主分sda1到sda4、一个扩展分区sda5.

在Linux中,分区包括主分区、扩展分区和逻辑分区。术语主分区是先前x86系统上4个分区限制的遗留产物。与Dos和Windows不同,linux可以从主分区或逻辑分区启动。用作逻辑分区占位符的主分区称作扩展分区。扩展分区本身拥有指向个或多个逻辑分区(它们只是主分区的子分区)的分区表。在以上的fdisk列表中,sda4就是一个扩展分区。

fdisk除了能够查看分区表外,还能够修改分区表。事实上,fdisk就是个分区表修改器。例如,当我们要修改/dev/sda的分区表时,可以用fdisk操作. 

[root@ebsdi-23260-oozie~]# fdisk /dev/sda1
Device containsneither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a newDOS disklabel. Changes will remain in memory only,
until you decideto write them. After that, of course, the previous
content won't berecoverable.
 
Warning: invalidflag 0x0000 of partition table 4 will be corrected by w(rite)
 
Command (m forhelp): m
Command action
   a   togglea bootable flag
   b  edit bsd disklabel
   c  toggle the dos compatibility flag
   d  delete a partition
   l  list known partition types
   m  print this menu
   n  add a new partition
   o  create a new empty DOS partition table
   p  print the partition table
   q  quit without saving changes
   s  create a new empty Sun disklabel
   t  change a partition's system id
   u  change display/entry units
   v  verify the partition table
   w  write table to disk and exit
   x  extra functionality (experts only)
 
Command (m forhelp): 

在fdisk的交互命令行中,你可以完成分区、删除、修改、添加、格式化分区等操作。我们可以通过m命令查看fdisk的帮助文档。

如果你不喜欢问答式的分区方式,可以选择交互式的命令cfdisk,运行命令

cfdisk /dev/sda1

弹出交互式界面如下图

\

在这个界面中,可以通过上下左右键来移动光标,可以删除、新建分区,还可以规定分区格式。cfdisk其实就是fdisk的图形界面。

Linux分区格式的选择与安全性

UNIX/Linux号称文件系统(分区格式)的瑞士军刀,可以选择的分区格式也多种多样。除了

支持Windows 下的FAT32、NTFS分区格式外(支持读写,不支持作为根文件系统),常见于坊间的有ext2 ,ext3 , reiserfs等。此外,各个著名的操作系统往往有自己文件系统方面的杀手铜,例如,Solaris的ZFS文件系统,Apple的HFS+文件系统等。

Linux 下常用文件系统格式有ext2,ext3,swap,VFAT,reiserfs等。

Ext2:

Ext2是GNU/Linux系统中标准的文件系统。这是Linux中使用最多的一种文件系统,它是专门为Linux设计的,拥有极快的速度和极小的CPU占用率。Ext2既可以用于标准的块设备(如硬盘),也被应用在软盘等移动存储设备上。

Ext3:

Ext3是Ext2的下一代,也就是保有Ext2的格式之下再加上日志功能。Ext3是一种日志式文件系统(JournalFile System),最大的特点是:它会将整个磁盘的写入动作完整的记录在磁盘的某个区域上,以便有需要时回溯追踪。当在某个过程中断时,系统可以根据这些记录直接回溯并重整被中断的部分,重整速度相当快。该分区格式被广泛应用在Linux系统中。

Linux swap:

它是Linux中一种专门用于交换分区的swap文件系统。Linux是使用这一整个分区作为交换空间。一般这个swap格式的交换分区是主内存的2倍。在内存不够时,Linux会将部分数据写到交换分区上。

VFAT:

VFAT叫长文件名系统,这是一个与Windows系统兼容的Linux文件系统,支持长文件名,可以作为Windows与Linux交换文件的分区。

文件系统和目录树

参考:http://blog.csdn.net/ruishenh/article/details/18602117

文件系统的创建和挂载

当使用fdisk或者cfdisk将磁盘划分为多个区时,需要给划分后的磁盘的每个区制定分区格式。在Windows中,这个概念叫做磁盘格式化,命令是mkfs.

Mkfs创建命令参考:

http://blog.163.com/yi_yixinyiyi/blog/static/136286889201164102353634/

Mount挂载命令参考:
http://www.51ou.com/browse/linuxml/mount.html

umonut卸载命令参考:

http://www.51ou.com/browse/linuxml/umount.html

相关内容