寻找文件

快速寻找文件

寻找命令存储位置

如果调用一个没有路径的命令时,想知道它在文件系统的位置如何,可以使用type命令:

$ type gcc
gcc is /usr/bin/gcc
$ type type
type is a shell builtin
$ type newgcc
newgcc is aliased for /usr/test/bin/gcc
$ type myfunc
func is a function
$ type foobar
-bash: type: foobar: not found

由于type命令为内部Shell命令,所以它认得别名与函数。

find用法

find介绍

语法
	find [files-or-directories] [options]
用途
	寻找与指定名称模式匹配或具有给定属性的文件
主要选项
	-atime n
		选定n天前访问的文件
	-ctiom n
        选定n天前改过inode的文件
	-follow
        接着符号性连接
	-group g
        选定组g内的文件(g为用户组ID名称或数字)
	-links n
        选定拥有n个直接链接的文件
	-ls
        产生类似ls形式的列表,而不是只有文件名。
	-mtime
        选定n天前修改过的文件
	-name 'pattern'
        选定文件名与模式匹配的文件
	-perm mask
        选定与指定八进制权限掩码匹配的文件
	-prune
        不向下递归到目录树状结构里
	-size n
        选择大小为n的文件
	-type t
        选定类型为t的文件,类型是单一字母:d为目录、f为文件、l为符号性连接。
	-user u
        选定用户u拥有的文件(u为用户ID名称或编号)
注意
    (1)由于find默认会向下寻找目录,所以当它在大型文件系统中寻找时,会花费很长的执行时间。
    (2)find输出的是未排序的结果。

find与其他UNIX命令最大的不同之处在于:要查找的文件与目录,要放在参数列表的第一位,且目录几乎是递归地向下深入(寻找)。最终要显示而选定名称的选项或操作放在命令行的最后。

find不同于ls的地方是:

  • 它没有隐藏文件的概念,也就是说:就算是点号开头的文件名,find还是能找到它。
  • find不排序文件名。它只是以它读到目录的顺序依次显示,因此,可以得到find命令之后,通过管道加入步骤。
  • 当find处理的是目录时,它会自动递归深入目录结构,除非使用-prune选项。

当find找到文件要处理时,它会先执行命令行选项所设置的选择限制,入股这些测试成功,则将名称交给内部的操作程序处理。默认操作是将名称打印在标准输出上。旧的的find实现会要求明确地指出-print选项,才能产生输出。

下面的例子单纯使用find寻找当前目录树下的所有东西:

$ ls                               # 确认这是一个空目录
$ mkdir -p sub/sub1                # 建立一个目录树
$ touch one two .uno .dos          # 在该目录下建立一些空文件
$ touch sub/three sub/sub1/four    # 在树状结构较深层的地方建立一些空文件
$ find                             # 从此开始寻找所有东西
.
./two
./.dos
./sub
./sub/sub1
./sub/sub1/four
./sub/three
./.uno
./one

使用sort进行排序:

$ find | LC_ALL=C sort
.
./.dos
./.uno
./one
./sub
./sub/sub1
./sub/sub1/four
./sub/three
./two

设置LC_ALL=C取得ASCII排序顺序。

-ls选项,可得到如指定了ls -liRs的输出结果。不过,它缺乏进一步的选项控制这个冗长显示的格式:

$ find -ls
2055172    4 drwxrwxr-x   3 weblogic weblogic     4096  7月 11 17:07 .
4501908    0 -rw-rw-r--   1 weblogic weblogic        0  7月 11 17:07 ./two
4501910    0 -rw-rw-r--   1 weblogic weblogic        0  7月 11 17:07 ./.dos
2055173    4 drwxrwxr-x   3 weblogic weblogic     4096  7月 11 17:07 ./sub
2055174    4 drwxrwxr-x   2 weblogic weblogic     4096  7月 11 17:07 ./sub/sub1
4568789    0 -rw-rw-r--   1 weblogic weblogic        0  7月 11 17:07 ./sub/sub1/four
3755216    0 -rw-rw-r--   1 weblogic weblogic        0  7月 11 17:07 ./sub/three
4501909    0 -rw-rw-r--   1 weblogic weblogic        0  7月 11 17:07 ./.uno
4501907    0 -rw-rw-r--   1 weblogic weblogic        0  7月 11 17:07 ./one

这里以ls显示相同的文件数据:

$ ls -liRs *
4501907 0 -rw-rw-r-- 1 jones devel    0 07-11 17:07 one
4501908 0 -rw-rw-r-- 1 jones devel    0 07-11 17:07 two

sub:
总计 4
2055174 4 drwxrwxr-x 2 jones devel 4096 07-11 17:07 sub1
3755216 0 -rw-rw-r-- 1 jones devel    0 07-11 17:07 three

sub/sub1:
总计 0
4568789 0 -rw-rw-r-- 1 jones devel 0 07-11 17:07 four

现在给find命令一些文件模式:

find -name 'o*'
./one
$ find sub
sub
sub/sub1
sub/sub1/four
sub/three

抑制目录向下寻找的功能:

$ find -prune   # 不要在此目录下寻找
.
$ find . -prune # 同上(另一种方式)
.
$ find * -prune # 寻找目录下的文件
one
sub
two
$ ls -d *
one  sub  two

注意,没有文件或目录参数,是等同于当前的目录,所以前两个例子只会报告该目录。然而,星号会匹配每一个非隐藏文件,所以第三个find的运行,就如同ls -d,只不过它是一行显示一个文件。

-group或-user选项需要一个接着的负号或数值识别码。因此,find / -user root会在root拥有的整个树状结构中查找文件。find $HOME/. ! -user $USER,这条命令的意思是:从我的根目录开始,列出所有不属于我的文件。这里使用$HOME/.而非$HOME,使得如果$HOME为符号连接,命令也可正常运行。

-perm需要接上一个八进制字符串的权限掩码,其可以具有选用的正/负号。如掩码不带任何正负号,则必须有确实的匹配权限。如果为负号,则所有的位设置都必须匹配。如果为正号,则至少有一个位设置要匹配。如:

-perm -002      寻找(所有者与组外)其他人可写入的文件
-perm -444      寻找任何人都可读取的文件
! -perm -444    寻找任何人都无法读取的文件
-perm 444       寻找权限为r--r--r--的文件
-perm +007      寻找其他人可访问的文件
! -perm +007    寻找其他人无法访问的文件

-size选项必须接上一个数字参数。默认值是以512字节为单位的大小,不过,允许在数字之后加上c(字节)、k(KB)。如果数字未带有正负号,则指的是必须确实匹配于该文件大小;如果为负,则只有小于该数字(绝对值)的文件大小是匹配的;如果带有正号,则只有大于该容量的文件才匹配。所以find $HOME/. -size +1024k会在当前目录树下的所有文件中,寻找是否有大于1MB的,而find . -size 0则是寻找当前目录下的所有文件是是空的。

-type选项必须接上一个字母参数,以表明文件类型。较重要的几个为d的目录、f的一般文件,以及l的符号连接。

-links选项要求接上一个整数。如未指定正负号,会只选择具有指定数量的直接连接的文件;如果为负号,则只寻找连接数小鱼该数字(绝对值)的文件;如果为正号,则仅选择连接数大于该数的文件。如,寻找具有直接链接的文件:find . -links +1。

-atime(访问时间)、-ctime(inode变更时间)与-mtime(修改时间)必须接上一个以天为单位的整数。未指定正负号,即指确实的几天前;如果为负,则只少于该天数(绝对值);为正则大于该天数。find . -mtime +7可寻找一周前修改过的文件。

-newer file,可以选择比指定文件更接近最近时间修改过的文件。如果要的单位比这个时间还精细,可以建立一个空文件touch -t date_time timestampfile,然后以此文件搭配使用-newer选项。如果要找的是比该文件更旧的文件,使用否定项即可:! -newer timestampfile。

find命令的选择器项可以合并使用,如另外配置-a(AND)选项或-o(OR)选项。

# 寻找文件大小块小于10的非空文件
$ find . -size +0 -a -size 10
# 寻找空文件,或过去一年未读取过的文件
$ find . -size 0 -o -atime +365

find示例脚本

posted @ 2016-07-21 10:14  liangyonglu  阅读(144)  评论(0编辑  收藏  举报