1、文件链接ln和文件查找Linux的文件类型Linux操作系统支持的文件类型有:普通文件、目录文件、设备文件以及符号链接文件。1) 普通文件:包括文本文件、数据文件、可执行的二进制程序等。2) 目录文件:简称为目录,Linux 中把目录看成一种特殊的文件,利用它构成文件系统的分层树型结构。每个目录文件中至少包括两个文件: “.”表示上一级目录,“.”表示该目录本身。3) 设备文件:设备文件是一种特别文件,Linux 系统用其标识各个设备驱动器,核心使用它们与硬件设备通信。有两类特别设备文件:字符设备文件和块设备文件。4) 符号链接:一种特殊文件,存放的数据是文件系统中通向某个文件的路径。当调用符
2、号链接文件时,系统会自动访问保存在文件中的路径。inode(index node) 索引节点、文件指标在Unix/Linux系统里,每个文件都有一个伴随它的inode(indentification node的缩写)。这个inode的值必须是系统中独一无二的。它的用途是作为存取文件的索引。您可以用系统指令l s -i将现行工作目錄下的各个文件之inode內含值印出。inode的內部储存了许多重要的信息,例如: 文件所有人的识別码 文件型态 文件存取权限 文件存取时间 文件案有几个连接 文件的大小 文件的实际储存位址从使用者的观点来看,用戶用文件名来辨识Unix/Linux的文件;但是以核心程式
3、的立场观之,则是透过inode来使用文件。inode有两种存在状态,在未被使用时,inode被放在磁碟中所谓的inode列表(inode list):当它要被参考时,核心程式会将它载入至主记忆內,此时的inode被称作in-core inode,以下是inode以C语言的结构(structure)所表示的情形:struct inodeint imode; /*存取权限 */char i_nl ink; /*文件连接数 */char i_uid; /*拥有者识別码 */char i_gid; /*使用群识別码 */long i_size; /*文件的长度 */int i_addr13); /*文
4、件所在位置 */int i_atime2); /*最近一次存取时间*/int i_mtime(2;/*最近一次修改时间*/【参考】disk inode, in-core inode, inode list,kernel。任何文件的inode都会对应到一个inode table,而这个inode table就是记录著这个文件的一些相关信息。从上面的图例来看,File 1的inode为168因此将168对应到inode table时,里头就会记载著这个文件的相关內容,比如文件的拥有人、拥有群组信息,相关的文件权限、或者文件的最后更动日期等等。我们可以使用ls -i来查看文件的inode信息,加上-
5、i参数代表显示inode的意思:文件链接ln和文件查找文件链接lnLinux 具有为一个文件起多个名字的功能,称为链接。这样只要对一个文件修改,就可以完成对所有目录下相应链接文件的修改。简单的来说,ln就像是各位在Windows系统中创建捷径的意思,但是又不像Windows创建捷径那樣的单纯容易!ln 命令用来创建链接,语法为:ln 源文件 目标文件ln 源文件1 源文件2 目标文件在第一种语法格式中,如果目标文件是到某一目录文件的路径,源文件会链接到此目录下,文件名不变;如果目标文件不是到某一目录文件的路径,源文件会链接到此目标文件,并覆盖已经存在的同名文件。在第二种语法格式中,所有的源文件
6、都被链接到目标文件该目标文件必须是目录文件。所有源文件的名字都不变。文件链接有两种形式,即硬链接和符号链接。 硬链接默认情况下,ln 命令创建硬链接。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件链接数为1。ln 命令会增加链接数,rm 命令会减少链接数。一个文件除非链接数为0,否则不会物理地从文件系统中被删除。对硬链接有如下限制:不能对目录文件作硬链接;不能在不同的文件系统之间作硬链接。 符号链接符号链接也称软链接,是将一个路径名链接到一个文件,事实上,它只是一个文本文件,其中包含它提供链接的另一个文件的路径名。另一个文件是实际包含所有数据的文件。所有读写文件内容的
7、命令,当它们被用于符号链接时,将沿着链接方向前进去访问实际的文件。如果给 ln 命令加上 s 选项,则建立符号链接。例如:ln -s source destination符号链接没有硬链接的限制,可以对目录文件作符号链接,也可以在不同文件系统之间作符号链接。文件类型file如果你想要知道某个文件的基本资料,例如是属于 ASCII 或者是 data 文件,或者是 binary , 且其中有没有使用到动态函式库 (share library) 等等的信息,就可以利用 file 这个指令来查看rootlinux # file /.bashrc/root/.bashrc: ASCII text = 告
8、诉我们是 ASCII 的纯文字!文件的查找注意:通常 find 不很常用的!因为速度慢。通常我们都是先使用 whereis 或者是 locate 来检查,如果真的找不到了,才以 find 来搜寻!为什么呢?因为 whereis 与 locate 是利用数据库来查找,所以相当的快速,而且并没有实际的搜寻硬盘,比较省时间。find 命令find 命令用来查找文件和目录的位置。该命令的语法为:find 路径名 选项find PATH option action 参数1. 与时间有关的参数-atime n n 为数字,意义为在 n 天之前的一天之内被 access 过的文件;-ctime n n 为数
9、字,意义为在 n 天之前的一天之内被 change 过状态的文件;-mtime n n 为数字,意义为在 n 天之前的一天之内被 modification 过的文件;-newer file file 为一个存在的文件,意思是说,只要文件比 file 还要新,就会被列出来2. 与使用者或群组名称有关的参数-uid n n 为数字,这个数字是使用者的帐号 ID,亦即 UID ,这个 UID 是记录在/etc/passwd 里面与帐号名称对应的数字。这方面我们会在第四篇介绍。-gid n n 为数字,这个数字是群组名称的 ID,亦即 GID,这个 GID 记录在/etc/group,相关的介绍我们会
10、第四篇说明-user name name 为使用者帐号名称喔!例如 dmtsai -group namename 为群组名称,例如 users ;-nouser 寻找文件的拥有者不存在 /etc/passwd 的人!-nogroup 寻找文件的拥有群组不存在于 /etc/group 的文件!当您自行安装软体时,很可能该软体的属性当中并没有文件拥有者,这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。3. 与文件权限及名称有关的参数-name filename搜寻文件名称为 filename 的文件;-size +-SIZE搜寻比 SIZE 还要大(+)或小(-)的
11、文件。这个 SIZE 的规格有c: 代表 byte, k: 代表 1024bytes。所以,要找比 50KB还要大的文件,就是 -size +50k -type TYPE 搜寻文件的类型为 TYPE 的,类型主要有一般正规文件 (f),装置文件 (b, c), 目录 (d), 连结档 (l), socket (s), 及 FIFO (p) 等属性。-perm mode 搜寻文件属性刚好等于 mode 的文件,这个 mode 为类似 chmod的属性值,举例来说, -rwsr-xr-x 的属性为 4755 !-perm -mode 搜寻文件属性必须要全部囊括 mode 的属性的文件,举例来说,我
12、们要搜寻 -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. 额外可进行的动作-exec command command 为其他指令,-exec 后面可再接额外的指令来处理搜寻到的结果。-print 将结
13、果列到萤幕上,这个动作是预设动作!其中,常用的选项有:-print:显示输出查找到的结果。如果未指定任何选项,则系统默认是 -print。如 find命令的最基本的用法就是列出指定目录下的所有文件和子目录:# find /usr -print-name:按文件名查找。-size:按文件大小查找。例如,下面的命令将查找/usr目录下超过100k的文件:# find /usr -size 100k-user:按文件主查找。-type: 按文件类型查找。常见的类型有:b块特别文件c字符特别文件。f普通文件l符号链接文件d目录文件# 不指定匹配表达式,显示所有文件# 递归显示当前目录的文件列表$ fi
14、nd# 递归显示 / 目录的文件列表$ find /# 递归显示 / 目录的文件列表(仅限于3层目录)$ find / -maxdepth 3# 递归显示 / 目录的文件列表(仅限于 / 文件系统)$ find / -xdev# 递归显示 /home、/www、/srv 目录的文件列表$ find /home /www /srv# 按文件名/路径名查找# 查找特定的文件名$ find -name myfile$ find -maxdepth 2 -name symfony# 使用通配符查找特定的文件名$ find -name d*$ find -name ?$ find -name afd*$
15、 find -iname a-z*$ find -name ch0-20-9.txt*# 匹配文件路径名$ find -path *server./vbird/server./server$ find -path *server12./server1./server2./server1/server2./server2/server2# 以正则表达式匹配文件路径名$ find -regex .*$ find -regex .*ch0.*./ch01./ch00./vbird/server/1000results/ch09-01.jpg$ find -regex .*ch0-9+./ch01./
16、ch21./ch00./ch333./ch1./ch41$ find -regex .*ch0-9+.txt./ch1.txt./ch24.txt# 按文件属性查找# 只查找普通文件$ find . -type f# 只查找符号链接文件$ find . -type l# 查找硬连接数大于 1 的文件或目录$ find /home -links +1# 查找 /tmp 目录下小于 10M 的文件$ find /tmp -size -10M# 查找 /home 目录下大于 1G 的文件$ find /home -size +1G# 查找系统中为空的文件或者目录$ find / -empty# 查找
17、在 /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 -user osmond# 列出 /home 目录中 UID 大于
18、 501 的文件或目录$ find /home -uid +501# 列出 /home 目录中组为 osmond 的文件或目录$ find /home -group osmond# 列出 /home 目录中 GID 为 501 的文件或目录$ find /home -gid 501# 列出 /home 目录中不属于本地用户的文件或目录$ find /home -nouser# 列出 /home 目录中不属于本地组的文件或目录$ find /home -nogroup# 精确查找权限为 664 的文件或目录$ find . -perm 664# 查找权限至少为 664 的文件或目录$ find
19、. -perm -664# 使用逻辑运算构造复杂表达式# 查找 /tmp 目录下21天之前访问过的大于 10G 的文件$ find /tmp -size +10M -a -atime +21# 查找 / 目录下属主为 jjheng 或 osmond 的文件$ find / -user jjheng -o -user osmond# 查找 /tmp 目录下的属主不是 osmond 的文件$ find /tmp ! -user osmond# 在 /mnt 下查找 *.txt 且文件系统类型不为 vfat 的文件$ find /mnt -name *.txt ! -fstype vfat# 在 /
20、tmp 下查找名为 l 开头且类型为符号链接的文件$ find /tmp -name l* -type l# 查找以 server 开头的目录名$ find . -type d -name server*# 找出 /var/log 目录下所有的前5天修改过的.log 文件$ find /var/log -name *.log -mtime +5# 按文件样本查找# 查找所有比 FILE1 的访问时间新的文件$ find -anewer FILE1# 查找所有比 FILE2 的访问时间旧的文件$ find ! -anewer FILE2# 查找所有比 FILE1 的访问时间新的# 且比 FILE
21、2 的访问时间旧的文件$ find -anewer FILE1 ! -anewer FILE2# 查找所有比 FILE1 的内容修改时间新的文件$ find -newer FILE1# 查找所有比 FILE2 的内容修改时间旧的文件$ find ! -newer FILE2# 查找所有比 FILE1 的内容修改时间新的# 且比 FILE2 的内容修改时间旧的文件$ find -newer FILE1 ! -newer FILE2# 查找与 FILE 具有相同 i-node 的文件(硬链接)$ find -samefile FILE -ls# 对查找到的文件实施命令操作# 查找并列出当前目录下不
22、安全的文件(世界可读写执行)$ find . -perm -007 -exec ls -l ;# 查找 logs 目录下的所有的 .log 文件并查看它的详细信息$ find logs -name *.log -type f -exec ls -l ;# 查找当天修改过的普通文件$ find . -type f -mtime -1 -exec ls -l ;# 查找当前目录下的.php文件并用grep过滤出包含include的行$ find . -name *.php -exec grep include ; -print# 查找并删除当前目录及其子目录下所有扩展名为 .tmp 的文件$ fi
23、nd . -name *.tmp -exec rm ;# 在logs目录中查找7天之内未修改过的文件并在删除前询问$ find logs -type f -mtime +7 -exec -ok rm ;# 查询并删除一周以来从未访问过的以 .o 结尾或名为 a.out# 且不存在于 nfs 文件系统中的所有文件$ find / ( -name a.out -o -name *.o ) -atime +7 ! -fstype nfs -exec rm ;# 查询并删除当前目录及其子目录下所有的空目录$ find . -depth -type d -empty -exec rmdir ;# 将de
24、fault目录下的文件由GBK编码转换为UTF-8编码# 目录结构不变,转码后的文件保存在utf/default目录下# From: $ find default -type d -exec mkdir -p utf/ ;$ find default -type f -exec iconv -f GBK -t UTF-8 -o utf/ ;# 下面 find 命令的书写形式均等价$ find -name *.sh -exec cp /tmp ;$ find -name *.sh -exec cp /tmp ;$ find -name *.sh -exec cp /tmp ;$ find -na
25、me *.sh -exec cp /tmp ;$ find -name *.sh -exec cp /tmp ;$ find -name *.sh -exec cp /tmp ;# 在查找中排除指定的目录# 显示当前目录树$ tree -F -L 2.|- bin/| |- switch-lang.sh*| - sys2wiki.sh*|- book/| |- basic/| |- basic-utf8/| |- basic.zip| |- server/| |- server-utf8/| |- server.zip| - to-zh-CN-utf8.sh*- bak.sh*# 显示当前目录
26、下除 book 目录的所有文件$ find . -name book -prune -o -print# 查找当前目录下(除了 book 目录)的所有 .sh 文件$ find . -name book -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# 查找当前目录下(除了 bo
27、ok/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 .
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1