文件综述.docx
《文件综述.docx》由会员分享,可在线阅读,更多相关《文件综述.docx(20页珍藏版)》请在冰豆网上搜索。
文件综述
目录
文件综述2
1Linux的文件类型2
1.1普通文件2
1.2目录文件2
1.3设备文件2
1.4套接口文件3
1.5链接文件3
1.6管道文件4
22Linux文件扩展名4
3二进制文件和文本文件5
3.1文本文件与二进制文件的定义5
3.2文本文件与二进制文件的存取5
3.3文本文件与二进制文件的优缺点6
3.4C的文本读写和二进制读写6
4linux文件命令7
4.1file7
4.4dd9
文件综述
1.组名:
第三组
2.组员:
李张杰,徐沛,魏国彬,孙立宁组长:
李张杰
3.报告人:
魏国彬
时间2010.7.24-2010.7.24
1Linux的文件类型
1.1普通文件
计算机用户和操作系统用于存放数据、程序等信息的文件。
一般都长期地存放在外存储器(磁盘等)中。
普通文件一般又分为文本文件和二进制文件。
我们用ls-lh来查看某个文件的属性,可以看到有类似-rw-r--r--,值得注意的是第一个符号是“-”,这样的文件在Linux中就是普通文件。
这些文件一般是用一些相关的应用程序创建,比如图像工具、文档工具、归档工具.......或cp工具等。
这类文件的删除方式是用rm命令。
[root@localhost~]#ls-lhinstall.log
-rw-r--r--1rootroot53K03-1608:
54install.log
1.2目录文件
目录文件是文件系统中一个目录所包含的目录项组成的文件。
目录文件只允许系统进行修改。
用户进程可以读取目录文件,但不能对它们进行修改。
[root@localhost~]#ls-lh
-rw-r--r--1rootroot203-2702:
00fonts.scale
-rw-r--r--1rootroot53K03-1608:
54install.log
-rw-r--r--1rootroot14M03-1607:
53kernel-2.6.15-1.2025_FC5.i686.rpm
drwxr-xr-x21000users4.0K04-0423:
30mkuml-2004.07.17
drwxr-xr-x2rootroot4.0K04-1910:
53mydir
drwxr-xr-x2rootroot4.0K03-1704:
25Public
当我们在某个目录下执行,看到有类似drwxr-xr-x,这样的文件就是目录,目录在Linux是一个比较特殊的文件。
注意它的第一个字符是d。
创建目录的命令可以用mkdir命令,或cp命令,cp可以把一个目录复制为另一个目录。
删除用rm或rmdir命令。
1.3设备文件
设备文件用于与I/O设备提供连接的一种文件,分为字符设备文件和块设备文件,对应于字符设备和块设备。
Linux把对设备的I/O做为普通文件的读取/写入操作内核提供了对设备处理和对文件处理的统一接口。
每一种I/O设备对应一个设备文件,存放在/dev目录中,如行式打印机对应/dev/lp。
如时您进入/dev目录,列一下文件,会看到类似如下的;
[root@localhost~]#ls-la/dev/tty
crw-rw-rw-1roottty5,004-1908:
29/dev/tty
[root@localhost~]#ls-la/dev/hda1
brw-r-----1rootdisk3,12006-04-19/dev/hda1
我们看到/dev/tty的属性是crw-rw-rw-,注意前面第一个字符是c,这表示字符设备文件,比如猫等串口设备。
我们看到/dev/hda1的属性是brw-r-----,注意前面的第一个字符是b,这表示块设备,比如硬盘,光驱等设备。
这个种类的文件,是用mknode来创建,用rm来删除。
目前在最新的Linux发行版本中,我们一般不用自己来创建设备文件。
因为这些文件是和内核相关联的。
1.4套接口文件
当我们启动MySQL服务器时,会产生一个mysql.sock的文件。
[root@localhost~]#ls-lh/var/lib/mysql/mysql.sock
srwxrwxrwx1mysqlmysql004-1911:
12/var/lib/mysql/mysql.sock
注意这个文件的属性的第一个字符是s。
我们了解一下就行了。
1.5链接文件
链接文件又称符号链接文件,它提供了共享文件的一种方法,在链接文件中不是通过文件名实现文件共享,是通过链接文件中含的指向文件的指针来实现对文件的访问。
普通用户可以建立链接文件,并通过其指针所指向的文件。
使用链接文件可以访问普通文件。
还可以访问目录文件和不具有普通文件实态的其它文件。
它可以在不同的文件系统之间建立链接关系。
[root@localhost~]#ls-lhsetup.log
lrwxrwxrwx1rootroot1104-1911:
18setup.log->install.log
当我们查看文件属性时,会看到有类似lrwxrwxrwx,注意第一个字符是l,这类文件是链接文件。
是通过ln-s源文件名新文件名。
上面是一个例子,表示setup.log是install.log的软链接文件。
怎么理解呢?
这和Windows操作系统中的快捷方式有点相似。
符号链接文件的创建方法举例;
[root@localhost~]#ls-lhkernel-2.6.15-1.2025_FC5.i686.rpm
-rw-r--r--1rootroot14M03-1607:
53kernel-2.6.15-1.2025_FC5.i686.rpm
[root@localhost~]#ln-skernel-2.6.15-1.2025_FC5.i686.rpmkernel.rpm
[root@localhost~]#ls-lhkernel*
-rw-r--r--1rootroot14M03-1607:
53kernel-2.6.15-1.2025_FC5.i686.rpm
lrwxrwxrwx1rootroot3304-1911:
27kernel.rpm->kernel-2.6.15-1.2025_FC5.i686.rpm
-rwsr-xr-x指明了myprog01是一个setUid的可执行文件,这是根据第四个字符”s”判断的。
-rwxr-sr-x指明了myprog03是一个setGid的可执行文件,这是根据第七个字符中的”s”判断的。
-rwsr-sr-x指明了myprog02是一个setUid加setGid的可执行文件,这是根据第四个和第七个字符中的”s”判断的。
drwxrwxrwt中的第一个”d”字指明了tmp文件是一个目录,最后一个字符”t”指明了该目录被设置了粘着位。
1.6管道文件
管道文件主要用于在进程间传递数据。
管道是进程间传递数据的“媒介”。
某进程数据写入管道的一端,另一个进程从管道另一端读取数据。
Linux对管道的操作与文件操作相同,它把管道作为文件进行处理。
管道文件以p命名又称先进先出(FIFO)文件。
22Linux文件扩展名
基本上,Linux文件是没有“扩展名”的,我们知道,Linux文件能否执行,与它第一列的10个属性有关,与文件名一点关系也没有。
这与Windows不同。
在Windows中,能执行的文件扩展名通常是.com、.exe、.bat等等,而在Linux中,只要属性中有x,例如[-rwx-r-xr-x]即表示这个文件可以执行。
不过,可以执行与可执行成功是不一样的。
举例来说,在root家目录下的install.log是一个纯文本文件,如果修改权限成为-rwxrwxrwx后,这个文件能执行吗?
当然不行。
因为它的内容根本就没有可执行的数据。
所以说,x表示这个文件具有可执行的能力,但能不能执行成功,当然就要看该文件的内容。
虽然扩展名没有什么实际的帮助,不过,由于我们仍然希望可以通过扩展名来了解该文件是什么,所以,通常还是会以适当的扩展名来表示该文件是什么类型。
下面有数种常用的扩展名:
i.*.sh:
批处理文件(scripts,脚本),因为批处理文件使用shell写成,所以扩展名就编成.sh。
ii.*Z,*.tar,*.tar.gz,*.zip,*.tgz:
经过打包的压缩文件。
这是因为压缩软件分别为gunzip、tar等等的,根据不同的压缩软件而取其相关的扩展名。
iii.*.html,*.php:
网页相关文件,分别表示HTML语法与PHP语法的网页文件。
.html的文件可使用网页浏览器来直接打开,.php的文件则可以通过客户端的浏览器来浏览服务器端,以得到运算后的网页结果。
另外,还有程序语言如Perl的文件,其扩展名也可能取成.pl。
基本上,Linux上面的文件名只是让你了解该文件可能的用途而已,真正的执行与否仍然需要属性的规范。
例如,虽然有一个文件为可执行文件,如有名的代理服务器软件squid,如果这个文件的属性被修改成无法执行,那么它就不能执行。
在文件传送的过程中常发生这种问题。
例如,你在网络上下载一个可执行文件,但是,偏偏在你的Linux系统中就是无法执行。
那就是可能文件的属性被改变了。
从网络上传送到你的Linux系统中,文件的属性确实是会被改变的。
3二进制文件和文本文件
3.1文本文件与二进制文件的定义
大家都知道计算机的存储在物理上是二进制的,所以文本文件与二进制文件的区
别并不是物理上的,而是逻辑上的。
这两者只是在编码层次上有差异。
简单来说,文本文件是基于字符编码的文件,常见的编码有ASCII编码,UNICOD
E编码等等。
二进制文件是基于值编码的文件,你可以根据具体应用,指定某个值是什么
意思(这样一个过程,可以看作是自定义编码)。
从上面可以看出文本文件基本上是定长编码的,基于字符嘛,每个字符在具体编
码中是固定的,ASCII码是8个比特的编码,UNICODE一般占16个比特。
而二进制文件可看
成是变长编码的,因为是值编码嘛,多少个比特代表一个值,完全由你决定。
大家可能
对BMP文件比较熟悉,就拿它举例子吧,其头部是较为固定长度的文件头畔ⅲ?
字节
用来记录文件为BMP格式,接下来的8个字节用来记录文件长度,再接下来的4字节用来记
录bmp文件头的长度。
。
。
大家可以看出来了吧,其编码是基于值的(不定长的,2、4、
8字节长的值都有),所以BMP是二进制文件。
3.2文本文件与二进制文件的存取
文本工具打开一个文件的过程是怎样的呢?
拿记事本来说,它首先读取文件物理
上所对应的二进制比特流(前面已经说了,存储都是二进制的),然后按照你所选择的
解码方式来解释这个流,然后将解释结果显示出来。
一般来说,你选取的解码方式会是
ASCII码形式(ASCII码的一个字符是8个比特),接下来,它8个比特8个比特地来解释
这个文件流。
例如对于这么一个文件流"01000000_01000001_01000010_01000011"(下划
线''_'',是我为了增强可读性,而手动添加的),第一个8比特''01000000''按ASCII码来解
码的话,所对应的字符是字符''A'',同理其它3个8比特可分别解码为''BCD'',即这个文件
流可解释成“ABCD”,然后记事本就将这个“ABCD”显示在屏幕上。
事实上,世界上任何东西要与其他东西通信会话,都存在一个既定的协议,既
定的编码。
人与人之间通过文字联络,汉字“妈”代表生你的那个人,这就是一种既定
的编码。
但注意到这样一种情况,汉字“妈”在日本文字里有可能是你生下的那个人,
所以当一个中国人A与日本B之间用“妈”这个字进行交流,出现误解就很正常的。
用
记事本打开二进制文件与上面的情况类似。
记事本无论打开什么文件都按既定的字符编
码工作(如ASCII码),所以当他打开二进制文件时,出现乱码也是很必然的一件事情了
,解码和译码不对应嘛。
例如文件流''00000000_00000000_00000000_00000001''可能在二
进制文件中对应的是一个四字节的整数int1,在记事本里解释就变成了"NULL_NULL_NU
LL_SOH"这四个控制符。
3.3文本文件与二进制文件的优缺点
因为文本文件与二进制文件的区别仅仅是编码上不同,所以他们的优缺点就是编码
的优缺点,这个找本编码的书来看看就比较清楚了。
一般认为,文本文件编码基于字符
定长,译码容易些;二进制文件编码是变长的,所以它灵活,存储利用率要高些,译码
难一些(不同的二进制文件格式,有不同的译码方式)。
关于空间利用率,想想看,二
进制文件甚至可以用一个比特来代表一个意思(位操作),而文本文件任何一个意思至少
是一个字符.
很多书上还认为,文本文件的可读性要好些,存储要花费转换时间(读写要编译码)
,而二进制文件可读性差,存储不存在转换时间(读写不要编解码,直接写值).这里
的可读性是从软件使用者角度来说的,因为我们用通用的记事本工具就几乎可以浏览所
有文本文件,所以说文本文件可读性好;而读写一个具体的二进制文件需要一个具体的
文件解码器,所以说二进制文件可读性差,比如读BMP文件,必须用读图软件.而这里的
存储转换时间应该是从编程的角度来说的,因为有些操作系统如windows需要对回车换行
符进行转换(将''\n'',换成''\r\n'',所以文件读写时,操作系统需要一个一个字符的检查
当前字符是不是''\n''或''\r\n'').这个在存储转换在Linux操作系统中并不需要,当然,当
在两个不同的操作系统上共享文件时,这种存储转换又可能出来(如Linux系统和Window
s系统共享文本文件)。
关于这个转换怎样进行,我将在下一篇文章《Linux文本文件与W
indows文本文件间的转换》给出^_^
3.4C的文本读写和二进制读写
应该说C的文本读写与二进制的读写是一个编程层次上的问题,与具体的操作系统
有关,所以"用文本方式读写的文件一定是文本文件,用二进制读写的文件一定是二进
制文件"这类观点是错误的.下面的讲述非明确指出操作系统类型,都暗指windows.
C的文本方读写与二进制读写的差别仅仅体现在回车换行符的处理上.文本方式写
时,每遇到一个''\n''(0AH换行符),它将其换成''\r\n''(0D0AH,回车换行),然后再写入
文件;当文本读取时,它每遇到一个''\r\n''将其反变化为''\n'',然后送到读缓冲区.正
因为文本方式有''\n''--''\r\n''之间的转换,其存在转换耗时.二进制读写时,其不存
在任何转换,直接将写缓冲区中数据写入文件.
总地来说,从编程的角度来说,C中文本或二进制读写都是缓冲区与文件中二进
制流的交互,只是文本读写时有回车换行的转换.所以当写缓冲区中无换行符''\n''(0AH
),文本写与二进制写的结果是一样的,同理,当文件中不存在''\r\n''(0DH0AH)时,文本
读与二进制读的结果一样.
4linux文件命令
4.1file
1.作用
file通过探测文件内容判断文件类型,使用权限是所有用户。
2.格式
file[options]文件名
3.[options]主要参数
-v:
在标准输出后显示版本信息,并且退出。
-z:
探测压缩过的文件类型。
-L:
允许符合连接。
-fname:
从文件namefile中读取要分析的文件名列表。
4.简单说明
使用file命令能知道某个文件究竟是二进制(ELF格式)的可执行文件,还是ShellScript文件,或是其他的什么格式。
file能识别的文件类型有目录、Shell脚本、英文文本、二进制可执行文件、C语言源文件、文本文件、DOS的可执行文件。
5.应用实例
如果我们看到一个没有后缀的文件grap,能使用下面命令:
$filegrap
grap:
Englishtext
此时系统显示这是个英文文本文件。
需要说明的是,file命令不能探测包括图像、音频、视频等多媒体文件类型。
4.2mkdir
1.作用
mkdir命令的作用是建立名称为dirname的子目录,和MSDOS下的md命令类似,他的使用权限是所有用户。
2.格式
mkdir[options]目录名
3.[options]主要参数
-m,--mode=模式:
设定权限;,和chmod类似。
-p,--parents:
需要时创建上层目录;如果目录早已存在,则不当作错误。
-v,--verbose:
每次创建新目录都显示信息。
--version:
显示版本信息后离开。
4.应用实例
在进行目录创建时能设置目录的权限,此时使用的参数是“-m”。
假设要创建的目录名是“tsk”,让所有用户都有rwx(即读、写、执行的权限),那么能使用以下命令:
$mkdir-m777tsk
4.3grep
1.作用
grep命令能指定文件中搜索特定的内容,并将含有这些内容的行标准输出。
grep全称是GlobalRegularExpressionPrint,表示全局正则表达式版本,他的使用权限是所有用户。
2.格式
grep[options]
3.主要参数
[options]主要参数:
-c:
只输出匹配行的计数。
-I:
不区分大小写(只适用于单字符)。
-h:
查询多文件时不显示文件名。
-l:
查询多文件时只输出包含匹配字符的文件名。
-n:
显示匹配行及行号。
-s:
不显示不存在或无匹配文本的错误信息。
-v:
显示不包含匹配文本的所有行。
pattern正则表达式主要参数:
\:
忽略正则表达式中特别字符的原有含义。
^:
匹配正则表达式的开始行。
$:
匹配正则表达式的结束行。
\
\>;:
到匹配正则表达式的行结束。
[]:
单个字符,如[A]即A符合需求。
[-]:
范围,如[A-Z],即A、B、C一直到Z都符合需求。
。
:
所有的单个字符。
*:
有字符,长度能为0。
正则表达式是Linux/Unix系统中非常重要的概念。
正则表达式(也称为“regex”或“regexp”)是个能描述一类字符串的模式(Pattern)。
如果一个字符串能用某个正则表达式来描述,我们就说这个字符和该正则表达式匹配(Match)。
这和DOS中用户能使用通配符“*”代表任意字符类似。
在Linux系统上,正则表达式通常被用来查找文本的模式,及对文本执行“搜索-替换”操作和其他功能。
4.应用实例
查询DNS服务是日常工作之一,这意味着要维护覆盖不同网络的大量IP地址。
有时IP地址会超过2000个。
如果要查看nnn.nnn网络地址,不过却忘了第二部分中的其余部分,只知到有两个句点,例如nnnnn..。
要抽取其中所有nnn.nnnIP地址,使用[0-9]\{3\}\.[0-0\{3\}\。
含义是任意数字出现3次,后跟句点,接着是任意数字出现3次,后跟句点。
$grep’[0-9]\{3\}\.[0-0\{3\}\’ipfile
补充说明,grep家族还包括fgrep和egrep。
fgrep是fixgrep,允许查找字符串而不是个模式;egrep是扩展grep,支持基本及扩展的正则表达式,但不支持\q模式范围的应用及和之相对应的一些更加规范的模式。
4.4dd
1.作用
dd命令用来复制文件,并根据参数将数据转换和格式化。
2.格式
dd[options]
3.[opitions]主要参数
bs=字节:
强迫ibs=;及obs=;。
cbs=字节:
每次转换指定的;。
conv=关键字:
根据以逗号分隔的关键字表示的方式来转换文件。
count=块数目:
只复制指定;的输入数据。
ibs=字节:
每次读取指定的;。
if=文件:
读取;内容,而非标准输入的数据。
obs=字节:
每次写入指定的;。
of=文件:
将数据写入;,而不在标准输出显示。
seek=块数目:
先略过以obs为单位的指定;的输出数据。
skip=块数目:
先略过以ibs为单位的指定;的输入数据。
4.应用实例
dd命令常常用来制作Linux引导盘。
先找一个可引导内核,令他的根设备指向正确的根分区,然后使用dd命令将其写入软盘:
$rdevvmlinuz/dev/hda
$ddif=vmlinuzof=/dev/fd0
上面代码说明,使用rdev命令将可引导内核vmlinuz中的根设备指向/dev/hda,请把“hda”换成自己的根分区,接下来用dd命令将该内核写入软盘。
4.5find
1.作用
find命令的作用是在目录中搜索文件,他的使用权限是所有用户。
2.格式
find[path][options][expression]
path指定目录路径,系统从这里开始沿着目录树向下查找文件。
他是个路径列表,相互用空格分离,如果不写path,那么默认为当前目录。
3.主要参数
[options]参数:
-depth:
使用深度级别的查找过程方式,在某层指定目录中优先查找文件内容。
-maxdepthlevels:
表示至多查找到开始目录的第level层子目录。
level是个非负数,如果level是0的话表示仅在当前目录中查找。
-mindepthlevels:
表示至少查找到开始目录的第level层子目录。
-mount:
不在其他文件系统(如Msdos、Vfat等)的目录和文件中查找。
-version:
打印版本。
[expression]是匹配表达式,是find命令接受的表达式,find命令的所有操作都是针对表达式的。
他的参数非常多,这里只介绍一些常用的参数。
?
name:
支持统配符*和?
。
-atimen:
搜索在过去n天读取过的文件。
-ctimen:
搜索在过去n天修改过的文件。
-groupgrpoupname:
搜索所有组为grpoupname的文件。
-user用户名:
搜索所有文件属主为用户名(ID或名称)的文件。
-sizen:
搜索文件大小是n个block的文件。
-print:
输出搜索结果,并且打印。
4.应用技巧
find命令查找文件的几种方法:
(1)根据文件名查找
例如,我们想要查找一个文件名是lilo.conf的文件,能使用如下命令:
find/-namelilo.conf
find命令后的“/”表示搜索整个硬盘。
(2)快速查找文件
根据文件名查找文件会遇见一个实际问题,就是要花费相当长的一段时间,特别是大型Linux文件系统和大容量硬盘文件放在非常深的子目录中时。
如果我们知道了这个文件存放在某个目录中,那么只要在这个目录中往下寻找就能节省非常多时间。
比如smb.conf文件,从他的文件后缀“.conf”能判断这是个设置文件,那么他应该在