文件链接ln和文件查找.docx
《文件链接ln和文件查找.docx》由会员分享,可在线阅读,更多相关《文件链接ln和文件查找.docx(17页珍藏版)》请在冰豆网上搜索。
文件链接ln和文件查找
Linux的文件类型
Linux操作系统支持的文件类型有:
普通文件、目录文件、设备文件以及符号链接文件。
1)普通文件:
包括文本文件、数据文件、可执行的二进制程序等。
2)目录文件:
简称为目录,Linux中把目录看成一种特殊的文件,利用它构成文件系统的分层树型结构。
每个目录文件中至少包括两个文件:
“..”表示上一级目录,“.”表示该目录本身。
3)设备文件:
设备文件是一种特别文件,Linux系统用其标识各个设备驱动器,核心使用它们与硬件设备通信。
有两类特别设备文件:
字符设备文件和块设备文件。
4)符号链接:
一种特殊文件,存放的数据是文件系统中通向某个文件的路径。
当调用符号链接文件时,系统会自动访问保存在文件中的路径。
inode(indexnode)索引节点、文件指标
在Unix/Linux系统里,每个文件都有一个伴随它的inode(indentificationnode的缩写)。
这个inode的值必须是系统中独一无二的。
它的用途是作为存取文件的索引。
您可以用系统指令ls-i将现行工作目錄下的各个文件之inode內含值印出。
inode的內部储存了许多重要的信息,例如:
●文件所有人的识別码
●文件型态
●文件存取权限
●文件存取时间
●文件案有几个连接
●文件的大小
●文件的实际储存位址
从使用者的观点来看,用戶用文件名来辨识Unix/Linux的文件;但是以核心程式的立场观之,则是透过inode来使用文件。
inode有两种存在状态,在未被使用时,inode被放在磁碟中所谓的inode列表(inodelist):
当它要被参考时,核心程式会将它载入至主记忆內,此时的inode被称作in-coreinode,以下是inode以C语言的结构(structure)所表示的情形:
structinode
{
intimode;/*存取权限*/
chari_nlink;/*文件连接数*/
chari_uid;/*拥有者识別码*/
chari_gid;/*使用群识別码*/
longi_size;/*文件的长度*/
inti_addr{13);/*文件所在位置*/
inti_atime[2);/*最近一次存取时间*/
inti_mtime(2];/*最近一次修改时间*/
}
【参考】diskinode,in-coreinode,inodelist,kernel。
任何文件的inode都会对应到一个「inodetable」,而这个inodetable就是记录著这个文件的一些相关信息。
从上面的图例来看,「File1」的inode为「168」因此将168对应到inodetable时,里头就会记载著这个文件的相关內容,比如文件的拥有人、拥有群组信息,相关的文件权限、或者文件的最后更动日期…等等。
我们可以使用「ls-i」来查看文件的inode信息,加上「-i」参数代表显示inode的意思:
文件链接ln和文件查找
文件链接ln
Linux具有为一个文件起多个名字的功能,称为链接。
这样只要对一个文件修改,就可以完成对所有目录下相应链接文件的修改。
简单的来说,ln就像是各位在Windows系统中「创建捷径」的意思,但是又不像Windows创建捷径那樣的单纯容易!
ln命令用来创建链接,语法为:
ln 源文件 目标文件
ln 源文件1 [源文件2…] 目标文件
在第一种语法格式中,如果目标文件是到某一目录文件的路径,源文件会链接到此目录下,文件名不变;如果目标文件不是到某一目录文件的路径,源文件会链接到此目标文件,并覆盖已经存在的同名文件。
在第二种语法格式中,所有的源文件都被链接到目标文件——该目标文件必须是目录文件。
所有源文件的名字都不变。
文件链接有两种形式,即硬链接和符号链接。
●硬链接
默认情况下,ln命令创建硬链接。
一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件链接数为1。
ln命令会增加链接数,rm命令会减少链接数。
一个文件除非链接数为0,否则不会物理地从文件系统中被删除。
对硬链接有如下限制:
不能对目录文件作硬链接;不能在不同的文件系统之间作硬链接。
●符号链接
符号链接也称软链接,是将一个路径名链接到一个文件,事实上,它只是一个文本文件,其中包含它提供链接的另一个文件的路径名。
另一个文件是实际包含所有数据的文件。
所有读写文件内容的命令,当它们被用于符号链接时,将沿着链接方向前进去访问实际的文件。
如果给ln命令加上s选项,则建立符号链接。
例如:
ln -s source destination
符号链接没有硬链接的限制,可以对目录文件作符号链接,也可以在不同文件系统之间作符号链接。
文件类型file
如果你想要知道某个文件的基本资料,例如是属于ASCII或者是data文件,或者是binary,且其中有没有使用到动态函式库(sharelibrary)等等的信息,就可以利用file这个指令来查看
[root@linux~]#file~/.bashrc
/root/.bashrc:
ASCIItext <==告诉我们是ASCII的纯文字!
文件的查找
注意:
通常find不很常用的!
因为速度慢。
通常我们都是先使用whereis或者是locate来检查,如果真的找不到了,才以find来搜寻!
为什么呢?
因为whereis与locate是利用数据库来查找,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间。
find命令
find命令用来查找文件和目录的位置。
该命令的语法为:
find 路径名 [选项]
find[PATH][option][action]
参数∶
1.与时间有关的参数∶
-atimen∶n为数字,意义为在n天之前的『一天之内』被access过的文件;
-ctimen∶n为数字,意义为在n天之前的『一天之内』被change过状态的文件;
-mtimen∶n为数字,意义为在n天之前的『一天之内』被modification过的文件;
-newerfile∶file为一个存在的文件,意思是说,只要文件比file还要新,
就会被列出来~
2.与使用者或群组名称有关的参数∶
-uidn∶n为数字,这个数字是使用者的帐号ID,亦即UID,这个UID是记录在
/etc/passwd里面与帐号名称对应的数字。
这方面我们会在第四篇介绍。
-gidn∶n为数字,这个数字是群组名称的ID,亦即GID,这个GID记录在
/etc/group,相关的介绍我们会第四篇说明~
-username∶name为使用者帐号名称喔!
例如dmtsai
-groupname∶name为群组名称,例如users;
-nouser ∶寻找文件的拥有者不存在/etc/passwd的人!
-nogroup ∶寻找文件的拥有群组不存在于/etc/group的文件!
当您自行安装软体时,很可能该软体的属性当中并没有文件拥有者,
这是可能的!
在这个时候,就可以使用-nouser与-nogroup搜寻。
3.与文件权限及名称有关的参数∶
-namefilename∶搜寻文件名称为filename的文件;
-size[+-]SIZE∶搜寻比SIZE还要大(+)或小(-)的文件。
这个SIZE的规格有∶
c:
代表byte,k:
代表1024bytes。
所以,要找比50KB
还要大的文件,就是『-size+50k』
-typeTYPE ∶搜寻文件的类型为TYPE的,类型主要有∶一般正规文件(f),
装置文件(b,c),目录(d),连结档(l),socket(s),
及FIFO(p)等属性。
-permmode ∶搜寻文件属性『刚好等于』mode的文件,这个mode为类似chmod
的属性值,举例来说,-rwsr-xr-x的属性为4755!
-perm-mode∶搜寻文件属性『必须要全部囊括mode的属性』的文件,举例来说,
我们要搜寻-rwxr--r--,亦即0744的文件,使用-perm-0744,
当一个文件的属性为-rwsr-xr-x,亦即4755时,也会被列出来,
因为-rwsr-xr-x的属性已经囊括了-rwxr--r--的属性了。
-perm+mode∶搜寻文件属性『包含任一mode的属性』的文件,举例来说,我们搜寻
-rwxr-xr-x,亦即-perm+755时,但一个文件属性为-rw-------
也会被列出来,因为他有-rw....的属性存在!
4.额外可进行的动作∶
-execcommand∶command为其他指令,-exec后面可再接额外的指令来处理搜寻到
的结果。
-print ∶将结果列到萤幕上,这个动作是预设动作!
其中,常用的选项有:
-print:
显示输出查找到的结果。
如果未指定任何选项,则系统默认是-print。
如find命令的最基本的用法就是列出指定目录下的所有文件和子目录:
#find /usr -print
-name:
按文件名查找。
-size:
按文件大小查找。
例如,下面的命令将查找/usr目录下超过100k的文件:
#find/usr-size100k
-user:
按文件主查找。
-type:
按文件类型查找。
常见的类型有:
b
块特别文件
c
字符特别文件。
f
普通文件
l
符号链接文件
d
目录文件
###不指定匹配表达式,显示所有文件
############################################################
#递归显示当前目录的文件列表
$find
#递归显示/目录的文件列表
$find/
#递归显示/目录的文件列表(仅限于3层目录)
$find/-maxdepth3
#递归显示/目录的文件列表(仅限于/文件系统)
$find/-xdev
#递归显示/home、/www、/srv目录的文件列表
$find/home/www/srv
############################################################
###按文件名/路径名查找
############################################################
#查找特定的文件名
$find-namemyfile
$find-maxdepth2-namesymfony
#使用通配符查找特定的文件名
$find-name'd*'
$find-name'?
?
?
'
$find-name'[afd]*'
$find-iname'[a-z]*'
$find-name'ch[0-2][0-9].txt*'
#匹配文件路径名
$find-path'*server'
./vbird/server
./server
$find-path'*server[12]'
./server1
./server2
./server1/server2
./server2/server2
#以正则表达式匹配文件路径名
$find-regex'.*'
$find-regex'.*ch0.*'
./ch01
./ch00
./vbird/server/1000results/ch09-01.jpg
$find-regex'.*ch[0-9]+'
./ch01
./ch21
./ch00
./ch333
./ch1
./ch41
$find-regex'.*ch[0-9]+\.txt'
./ch1.txt
./ch24.txt
############################################################
###按文件属性查找
############################################################
#只查找普通文件
$find.-typef
#只查找符号链接文件
$find.-typel
#查找硬连接数大于1的文件或目录
$find/home-links+1
#查找/tmp目录下小于10M的文件
$find/tmp-size-10M
#查找/home目录下大于1G的文件
$find/home-size+1G
#查找系统中为空的文件或者目录
$find/-empty
#查找在/www中最后10分钟访问过的文件
$find/www-amin-10
#查找在/www中最后2天访问过的文件
$find/www-atime-2
#查找在/home下最近2天内改动过的文件
$find/home-mtime-2
#列出被改动过后2日内被存取过的文件或目录
$find/home-used-2
#列出被改动过后90日前被存取过的文件或目录
$find/home-used+90
#列出/home目录中属于用户osmond的文件或目录
$find/home-userosmond
#列出/home目录中UID大于501的文件或目录
$find/home-uid +501
#列出/home目录中组为osmond的文件或目录
$find/home-grouposmond
#列出/home目录中GID为501的文件或目录
$find/home-gid501
#列出/home目录中不属于本地用户的文件或目录
$find/home-nouser
#列出/home目录中不属于本地组的文件或目录
$find/home-nogroup
#精确查找权限为664的文件或目录
$find.-perm664
#查找权限至少为664的文件或目录
$find.-perm-664
############################################################
###使用逻辑运算构造复杂表达式
############################################################
#查找/tmp目录下21天之前访问过的大于10G的文件
$find/tmp-size+10M-a-atime+21
#查找/目录下属主为jjheng或osmond的文件
$find/-userjjheng-o-userosmond
#查找/tmp目录下的属主不是osmond的文件
$find/tmp!
-userosmond
#在/mnt下查找*.txt且文件系统类型不为vfat的文件
$find/mnt-name'*.txt'!
-fstypevfat
#在/tmp下查找名为l开头且类型为符号链接的文件
$find/tmp-name'l*'-typel
#查找以server开头的目录名
$find.-typed-name'server*'
#找出/var/log目录下所有的前5天修改过的.log文件
$find/var/log-name'*.log'-mtime+5
############################################################
###按文件样本查找
############################################################
#查找所有比FILE1的访问时间新的文件
$find-anewerFILE1
#查找所有比FILE2的访问时间旧的文件
$find!
-anewerFILE2
#查找所有比FILE1的访问时间新的
#且比FILE2的访问时间旧的文件
$find-anewerFILE1!
-anewerFILE2
#查找所有比FILE1的内容修改时间新的文件
$find-newerFILE1
#查找所有比FILE2的内容修改时间旧的文件
$find!
-newerFILE2
#查找所有比FILE1的内容修改时间新的
#且比FILE2的内容修改时间旧的文件
$find-newerFILE1!
-newerFILE2
#查找与FILE具有相同i-node的文件(硬链接)
$find-samefileFILE-ls
############################################################
###对查找到的文件实施命令操作
############################################################
#查找并列出当前目录下不安全的文件(世界可读写执行)
$find.-perm-007-execls-l{}\;
#查找logs目录下的所有的.log文件并查看它的详细信息
$findlogs-name"*.log"-typef-execls-l{}\;
#查找当天修改过的普通文件
$find.-typef-mtime-1-execls-l{}\;
#查找当前目录下的.php文件并用grep过滤出包含include的行
$find.-name"*.php"-execgrep"include"{}\;-print
#查找并删除当前目录及其子目录下所有扩展名为.tmp的文件
$find.-name'*.tmp'-execrm{}\;
#在logs目录中查找7天之内未修改过的文件并在删除前询问
$findlogs-typef-mtime+7-exec -ok rm{}\;
#查询并删除一周以来从未访问过的以.o结尾或名为a.out
#且不存在于nfs文件系统中的所有文件
$find/(-namea.out-o-name'*.o')-atime+7\
!
-fstypenfs-execrm{}\;
#查询并删除当前目录及其子目录下所有的空目录
$find.-depth-typed-empty-execrmdir{}\;
#将default目录下的文件由GBK编码转换为UTF-8编码
#目录结构不变,转码后的文件保存在utf/default目录下
#From:
$finddefault-typed-execmkdir-putf/{}\;
$finddefault-typef-execiconv-fGBK-tUTF-8{}-outf/{}\;
#下面find命令的书写形式均等价
$find-name\*.sh-execcp{}/tmp\;
$find-name'*.sh'-execcp{}/tmp';'
$find-name"*.sh"-execcp{}/tmp";"
$find-name\*.sh-execcp\{\}/tmp\;
$find-name'*.sh'-execcp'{}'/tmp';'
$find-name"*.sh"-execcp"{}"/tmp";"
############################################################
###在查找中排除指定的目录
############################################################
#显示当前目录树
$tree-F-L2
.
|--bin/
| |--switch-lang.sh*
| `--sys2wiki.sh*
|--book/
| |--basic/
| |--basic-utf8/
| |--basic.zip
| |--server/
| |--server-utf8/
| |--server.zip
| `--to-zh-CN-utf8.sh*
`--bak.sh*
#显示当前目录下除book目录的所有文件
$find.-namebook-prune-o-print
#查找当前目录下(除了book目录)的所有.sh文件
$find.-namebook-prune-o-name'*.sh'-print
#显示当前目录下除book/server目录的所有文件
$find.-path./book/server-prune-o-print
#使用绝对路径完成上述任务
$find/home/osmond-path/home/osmond/book/server-prune-o-print
#查找当前目录下(除了book/server目录)的所有.sh文件
$find.-path./book/server-prune-o-name'*.sh'-print
#显示当前目录下除book/server和book/server-utf8目录的所有文件
$find.-path'./book/server*'-prune-o-print
#查找当前目录下(除了book/server和book/server-utf8目录)的所有.sh文件
$find.-path'./book/server*'-prune-o-name'*.sh'-print
#显示当前目录下除book/server和book/basic目录的所有文件
$find.\(-path./book/server-o-path./book/basic\)-prune-o-print
#查找当前目录下(除了book/server和book/basic目录)的所有.sh文件
$find.