文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>shell基础二:查找技巧,find及xargs的使用

shell基础二:查找技巧,find及xargs的使用

时间:2006-09-24  来源:b.s.d

zt:http://bbs.chinaunix.net/archiver/?tid-441883.html        
shell基础二:查找技巧,find及xargs的使用

shell基础1:文件安全与权限
http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger

附:Linux的用户和用户组管理
http://bbs.chinaunix.net/forum/viewtopic.php?t=438660&highlight=wingger

shell基础二:查找技巧,find及xargs的使用
http://bbs.chinaunix.net/forum/viewtopic.php?t=441883&highlight=wingger

shell基础三和四:后台(crontab,at,&,nohup)及(*,?,[]等)
http://bbs.chinaunix.net/forum/viewtopic.php?t=442596&highlight=wingger

shell基础五:输入和输出(echo,read,cat,管道,tee,重定向等)
http://bbs.chinaunix.net/forum/viewtopic.php?t=444209&highlight=wingger

shell基础六七:命令执行顺序(||及&&,{}及())和正则表?
http://bbs.chinaunix.net/forum/viewtopic.php?t=445229&highlight=wingger

shell基础八:文本过滤工具(grep)
http://bbs.chinaunix.net/forum/viewtopic.php?t=446683&highlight=wingger

http://bbs.chinaunix.net/forum/viewtopic.php?t=448687&highlight=wingger
shell基础九:awk

http://bbs.chinaunix.net/forum/viewtopic.php?t=452942&highlight=wingger
shell基础十:sed

http://bbs.chinaunix.net/forum/viewtopic.php?t=457730&highlight=wingger
基础11:文件分类、合并和分割(sort,uniq,join,cut,paste,split)

shell基础十二:tr
http://bbs.chinaunix.net/forum/viewtopic.php?t=459099&highlight=wingger

[b]呵呵,建议大家看《LINUX和UNIX基础编程》这本书哦,循序渐进[/b]

[b]查看man find会更详细哦[/b]

我把我学习内容拷下来,一起学习

http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger
这个链接里是第一部分,是LINUX的基础,建议初学者好好看看

由于f i n d具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( N F S ),f i n d命令在该文件系统中同样有效,只你具有相应的权限。
在运行一个非常消耗资源的f i n d命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指3 0 G字节以上的文件系统)。

F i n d命令的一般形式为:

[code]find pathname -options [-print -exec -ok][/code]

让我们来看看该命令的参数:

[quote]pathname:  find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。
-print:     find命令将匹配的文件输出到标准输出。
-exec:     find命令对匹配的文件执行该参数所给出的s h e l l命令。相应命令的形式为' command' {} \;,注意{ }和\;之间的空格。
-ok:       和- e x e c的作用相同,只不过以一种更为安全的模式来执行该参数所给出的s h e l l命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。[/quote]

寂寞烈火 2004-11-9 12:43
shell基础二:查找技巧,find及xargs的使用

呵呵~~~,find+xargs,才是绝佳组合~~

wingger 2004-11-9 12:46
shell基础二:查找技巧,find及xargs的使用

[b]先了解一下find所带的参数,能实现哪些功能[/b]

find命令选项

-name:按照[b]文件名[/b]查找文件。
-perm:按照[b]文件权限[/b]来查找文件。
-prune:使用这一选项可以使f i n d命令[b]不在当前指定的目录中查找[/b],如果同时使用-depth选项,那么-prune将被f i n d命令忽略。
-user: 按照[b]文件属主[/b]来查找文件。
-group:按照[b]文件所属的组[/b]来查找文件。

-mtime -n +n:按照[b]文件的更改时间[/b]来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。F i n d命令还有- a t i m e和- c t i m e选项,但它们都和- m t i m e选项。

-nogroup:查找[b]无有效所属组的文件[/b],即该文件所属的组在/ e t c / g r o u p s中不存在。
-nouser:查找[b]无有效属主的文件[/b],即该文件的属主在/ e t c / p a s s w d中不存在。

-newer file1 ! file2:[b]查找更改时间比文件f i l e 1新但比文件f i l e 2旧的文件。[/b]

[b]-type 查找某一类型的文件,诸如:[/b]

[code]b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。[/code]

-size n:[c] 查找[b]文件长度为n块[/b]的文件,带有c时表示文件长度以字节计。
-depth:[b]在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。[/b]
-fstype:查找位于[b]某一类型文件系统中的文件[/b],这些文件系统类型通常可以在配置文件/ e t c / f s t a b中找到,该配置文件中包含了本系统中有关文件系统的信息。

[quote]-mount:在查找文件时不跨越文件系统m o u n t点。
-follow:如果f i n d命令遇到符号链接文件,就跟踪至链接所指向的文件。
-cpio:对匹配的文件使用c p i o命令,将这些文件备份到磁带设备中。[/quote]

wingger 2004-11-9 12:47
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火"]呵呵~~~,find+xargs,才是绝佳组合~~[/quote 发表:[/i]

忘写了,一会看到那里再发,对了,上次在LINUX发的贴子中有几次错误,我已经更正了,也是这本书的一部份,但改了不少

寂寞烈火 2004-11-9 12:49
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger" 发表:[/i]

忘写了,一会看到那里再发,对了,上次在LINUX发的贴子中有几次错误,我已经更正了,也是这本书的一部份,但改了不少[/quote]
原来那篇贴子是你发的?~~~,佩服佩服~~~ ;)

wingger 2004-11-9 12:54
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火" 发表:[/i]

原来那篇贴子是你发的?~~~,佩服佩服~~~ ;)[/quote]

俺就怕人骂我多此一举 :oops:  :oops:  :oops:

寂寞烈火 2004-11-9 12:57
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger" 发表:[/i]

俺就怕人骂我多此一举 :oops:  :oops:  :oops:[/quote]
sorry~~,我没有那个意思!
P,S:想学shell,先熟读一下置顶的13问吧~
http://bbs.chinaunix.net/forum/viewtopic.php?t=218853&show_type=new

wingger 2004-11-9 13:09
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火" 发表:[/i]

sorry~~,我没有那个意思![/quote]

呵呵,不是说你呢

下面这个选项我觉得这个很好用,俺以前都不知道,所以放在第一个说明:

[b]使用exec或ok来执行shell命令[/b]

[quote]使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的

(在有些操作系统中只允许- e x e c选项执行诸如l s或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行r m命令删除文件之前,最好先用l s命令看一下,确认它们是所要删除的文件。

e x e c选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。

为了使用e x e c选项,必须要同时使用p r i n t选项。如果验证一下f i n d命令,会发现该命令只输出从当前路径起的相对路径及文件名。[/quote]

[b]例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c选项中[/b]
[code]# find . -type f -exec ls -l {} \;
-rw-r--r--    1 root     root        34928 2003-02-25  ./conf/httpd.conf
-rw-r--r--    1 root     root        12959 2003-02-25  ./conf/magic
-rw-r--r--    1 root     root          180 2003-02-25  ./conf.d/README
[/code]
上面的例子中,f i n d命令匹配到了当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出。

[b]在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:[/b]
[code]$ find logs -type f -mtime +5 -exec rm {} \;[/code]
记住,在s h e l l中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如m v或r m命令时,可以使用- e x e c选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

[b]在下面的例子中, f i n d命令在当前目录中查找所有文件名以. L O G结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。[/b]
[code]$ find . -name "*.conf"  -mtime +5 -ok rm {} \;
< rm ... ./conf/httpd.conf > ? n[/code]
按y键删除文件,按n键不删除。

[b]任何形式的命令都可以在- e x e c选项中使用。[/b]

[b]在下面的例子中我们使用g r e p命令。f i n d命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执
行grep命令看看在这些文件中是否存在一个sam用户。[/b]
[code]# find /etc -name "passwd*" -exec grep "sam" {} \;
sam:x:501:501::/usr/sam:/bin/bash[/code]

[b]论坛里-exec执行脚本的的例子
使用find 命令查找某个时间段的11点到12点的shell[/b]
http://www.chinaunix.net/forum/viewtopic.php?t=15821

bitbull 2004-11-9 14:18
shell基础二:查找技巧,find及xargs的使用

请问楼主《LINUX和UNIX基础编程》这本书是什么内容的,哪里有介绍吗?
我CHINA-PUB上没找着

wingger 2004-11-9 14:21
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "bitbull" 发表:[/i]
请问楼主《LINUX和UNIX基础编程》这本书是什么内容的,哪里有介绍吗?
我CHINA-PUB上没找着[/quote]

内容就是我发的这个,和上面的链接, :lol:  :lol:  :lol:
还有很多用法,我才看到这里,呵,我觉得发出来大家一起学习比较好

书上有不少错误呢

panlm 2004-11-9 14:21
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火"]呵呵~~~,find+xargs,才是绝佳组合~~[/quote 发表:[/i]

find可以家-exec呀, 不一定要xargs, 有时候更方便

寂寞烈火 2004-11-9 14:25
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "panlm" 发表:[/i]

find可以家-exec呀, 不一定要xargs, 有时候更方便[/quote]
嘿嘿~~~ 我也常这么干~

wingger 2004-11-9 14:38
shell基础二:查找技巧,find及xargs的使用

俺看书的速度好像慢了点,第一章花了我十天功夫,这篇看来得两个晚上才能看完

[b]find命令的例子[/b]

查找当前用户主目录下的所有文件,下面两种方法都可以使用:
[code]$ find $HOME -print
$ find ~ -print[/code]

为了在当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件,可以用:
[code]$ find . -type f -perm 644 -exec ls -l {} \;[/code]

为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:
[code]$ find / -type f -size 0 -exec ls -l {} \;[/code]

查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们:
[code]$ find /var/logs -type f -mtime +7 -ok rm {} \;[/code]

为了查找系统中所有属于root组的文件,可以用:
[code]$find . -group root -exec ls -l {} \;
-rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1
[/code]

下面的find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。该命令只检查三位数字,所以相应文件的后缀不要超过999。
先建几个admin.log*的文件 ,才能使用下面这个命令
[code]$ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
rm {} \;
< rm ... ./admin.log001 > ? n
< rm ... ./admin.log002 > ? n
< rm ... ./admin.log042 > ? n
< rm ... ./admin.log942 > ? n[/code]

为了查找当前文件系统中的所有目录并排序,可以用:
[code]$ find . -type d  |sort[/code]

为了查找系统中所有的r m t磁带设备,可以用:
[code]$ find /dev/rmt -print[/code]

[code]
原书为:
为了查找当前文件系统中的所有目录并排序,可以用:
$ find . -type d  -loacl -mount |sort
已更正为:
$ find . -type d |sort
[/code]

wingger 2004-11-10 02:43
shell基础二:查找技巧,find及xargs的使用

论里的其它find的贴子:

find命令中*号的疑惑
http://bbs.chinaunix.net/forum/viewtopic.php?t=349141&highlight=find

Linux中文件查找技术大全
http://bbs.chinaunix.net/forum/viewtopic.php?t=16140

wingger 2004-11-10 02:48
shell基础二:查找技巧,find及xargs的使用

[b]xargs[/b]

      在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。但有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是x a rg s命令的用处所在,特别是与f i n d命令一起使用。

       F i n d命令把匹配到的文件传递给x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

      在有些系统中,使用- e x e c选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;
       而使用x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

      来看看x a rg s命令是如何同f i n d命令一起使用的,并给出一些例子。

     [b] 下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类文件[/b]
[code]#find . -type f -print | xargs file
./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text
./.kde/Autostart/.directory:      ISO-8859 text\
......
[/code]

[b]在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:[/b]
[code]$ find / -name "core" -print | xargs echo "" >/tmp/core.log
[/code]
上面这个执行太慢,我改成在当前目录下查找
[code]#find . -name "file*" -print | xargs echo "" > /temp/core.log
# cat /temp/core.log
./file6[/code]

[b]在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:[/b]
[code]
# ls -l
drwxrwxrwx    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxrwx    2 sam      adm             0 10月 31 01:01 httpd.conf

# find . -perm -7 -print | xargs chmod o-w
# ls -l
drwxrwxr-x    2 sam      adm          4096 10月 30 20:14 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
[/code]

[b]用g r e p命令在所有的普通文件中搜索hostname这个词:[/b]
[code]# find . -type f -print | xargs grep "hostname"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your
[/code]

[b]用g r e p命令在当前目录下的所有普通文件中搜索hostnames这个词:[/b]
[code]# find . -name \* -type f -print | xargs grep "hostnames"
./httpd1.conf:#     different IP addresses or hostnames and have them handled by the
./httpd1.conf:# VirtualHost: If you want to maintain multiple domains/hostnames
on your[/code]
注意,在上面的例子中, \用来取消f i n d命令中的*在s h e l l中的特殊含义。

寂寞烈火 2004-11-10 02:51
shell基础二:查找技巧,find及xargs的使用

大多数情况下,这个-print是多余滴~(我认为)

wingger 2004-11-10 03:45
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火"]大多数情况下,这个-print是多余滴~(我认为)[/quote 发表:[/i]

我也是这么认为,呵呵

这两个看不明白,帮忙解析一下:lol:  :lol:  :lol:  :lol:  :lol:

[quote]为了匹配$ H O M E目录下的所有文件,下面两种方法都可以使用:
$ find $HOME -print
$ find ~ -print[/quote]

[quote]为了查找当前文件系统中的所有目录并排序,可以用:
[code]$ find . -type d -print -local -mount |sort [/quote]

# find . -type d  | sort
.
./dir1
./file6
./.kde
./.kde/Autostart
./sam
./.xemacs

# ls -l
总用量 52
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log001
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log002
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log042
-rw-r--r--    1 root     root            0 10月 31 18:07 admin.log942
drwxr-xr-x    2 root     root         4096 10月 31 20:26 dir1
-rw-r--r--    1 sam      adm             0 10月 31 01:07 fiel
drwxrwxr-x    2 sam      adm          4096 10月 31 20:25 file6
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rw-r--r--    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drwxrwxr-x    2 gem      group        4096 10月 26 19:48 sam
-rw-r--r--    1 root     root         2792 10月 31 20:19 temp

寂寞烈火 2004-11-10 04:09
shell基础二:查找技巧,find及xargs的使用

1,$HOME是shell专用变量,指的是用户的主目录,echo $HOME 一下,看看结果是啥?
2,直接用 find / -type d|sort 就可以

wingger 2004-11-10 05:08
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火" 发表:[/i]
1,$HOME是shell专用变量,指的是用户的主目录,echo $HOME 一下,看看结果是啥?
2,直接用 find / -type d|sort 就可以[/quote]

明白了,谢谢 :lol:  :lol:  :lol:

f i n d命令配合使用e x e c和x a rg s可以使用户对所匹配到的文件执行几乎所有的命令。

[b]下面是find一些常用参数的例子,有用到的时候查查就行了,像上面前几个贴子,都用到了其中的的一些参数,也可以用man或查看论坛里其它贴子有find的命令手册[/b]

[b][color=red]1、使用name选项[/color][/b]

文件名选项是f i n d命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。
可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。
不管当前路径是什么,[b]如果想要在自己的根目录$ H O M E中查找文件名符合* . t x t的文件[/b],使用~作为' p a t h n a m e参数,波浪号~代表了你的$ H O M E目录。
[code]$ find ~ -name "*.txt" -print[/code]

[b]想要在当前目录及子目录中查找所有的‘ * . t x t’文件,可以用:[/b][code]$ find . -name "*.txt" -print[/code]

[b]想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:[/b]
[code]$ find . -name "[A-Z]*" -print[/code]

[b]想要在/ e t c目录中查找文件名以h o s t开头的文件,可以用:[/b]
[code]$ find /etc -name "host*" -print[/code]

[b]想要查找$ H O M E目录中的文件,可以用:[/b]
[code]$ find ~ -name "*" -print 或find . -print[/code]

[b]要想让系统高负荷运行,就从根目录开始查找所有的文件。[/b]
[code]$ find / -name "*" -print[/code]

[b]如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是* . t x t的文件,下面的命令就能够返回名为a x 3 7 . t x t的文件:[/b]$ [code]$find . -name "[a-z][a-z][0--9][0--9].txt" -print[/code]

[b][color=red]2、用perm选项[/color][/b]

按照文件权限模式用- p e r m选项。

按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

[b]如在当前目录下查找文件权限位为7 5 5的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:[/b]
[code]$ find . -perm 755 -print[/code]

[b]还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666[/b]
[code]# ls -l
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 http3.conf
-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam
-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

# find . -perm 006
# find . -perm -006
./sam
./httpd1.conf
./temp
[/code]

[b][color=red]3、忽略某个目录[/color][/b]

如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用- p r u n e选项来指出需要忽略的目录。在使用- p r u n e选项时要当心,因为如果你同时使用了- d e p t h选项,那么- p r u n e选项就会被f i n d命令忽略。

[b]如果希望在/ a p p s目录下查找文件,但不希望在/ a p p s / b i n目录下查找,可以用:[/b]
[code]$ find /apps -path "/apps/bin" -prune -o -print[/code]

[color=red]-perm选项中,我的解析
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
不知对不对[/color]

wingger 2004-11-10 06:56
shell基础二:查找技巧,find及xargs的使用

补一个:使用find查找文件的时候怎么避开某个文件目录

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件
[code]find /usr/sam -path "/usr/sam/dir1" -prune -o -print  [/code]

[quote]
find [path ..] [expression] 在路径列表的后面的是表达式
-path "/usr/sam" -prune -o -print 是 -path "/usr/sam" -a -prune -o -print 的简写表达式按顺序求值, -a 和 -o 都是短路求值,与 shell 的 && 和 || 类似如果 -path "/usr/sam" 为真,则求值 -prune , -prune 返回真,与逻辑表达式为真;否则不求值 -prune ,与逻辑表达式为假。 如果 -path "/usr/sam" -a -prune 为假,则求值 -print ,-print 返回真,或逻辑表达式为真;否则不求值 -print,或逻辑表达式为真。  [/quote]

[b]这个表达式组合特例可以用伪码写为 [/b]

[code]if -path "/usr/sam"  then
          -prune
else
          -print [/code]

[b]避开多个文件夹 [/b]
[quote]find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print [/quote]

圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。

[b]查找某一确定文件,-name等选项加在-o 之后[/b]
[code]#find /usr/sam  \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print[/code]
           
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger" 发表:[/i]

# find . -type d  | sort
.
./dir1
./file6
./.kde
./.kde/Autostart
./sam
./.xemacs

# ls -l
总用量 52
-rw-r--r--    1 root     root            0 10月 31 18:06 admin.log001
-rw-r--r--  ..........[/quote]

~在csh类和bash里表示用户的主目录,~表示当前用户的主目录,~user表示user的主目录,例如:
cd ~   或者cd 回到当前用户主目录
ls ~oracle  列出oracle用户主目录下的文件

wingger 2004-11-10 07:22
shell基础二:查找技巧,find及xargs的使用

[b]4、使用user和nouser选项[/b]

按文件属主查找文件,如在$ H O M E目录中查找文件属主为sam的文件,可以用:
[code]$ find ~ -user sam -print[/code]

在/ e t c目录下查找文件属主为u u c p的文件:
[code]$ find /etc -user uucp -print[/code]

为了查找属主帐户已经被删除的文件,可以使用- n o u s e r选项。这样就能够找到那些属主在/ e t c / p a s s w d文件中没有有效帐户的文件。在使用- n o u s e r选项时,不必给出用户名; f i n d命令能够为你完成相应的工作。
例如,希望在/ h o m e目录下查找所有的这类文件,可以用:
[code]$ find /home -nouser -print[/code]

[b]5、使用group和nogroup选项[/b]

就像u s e r和n o u s e r选项一样,针对文件所属于的用户组, f i n d命令也具有同样的选项,为了在/ a p p s目录下查找属于gem用户组的文件,可以用:
[code]$ find /apps -group gem -print[/code]

要查找没有有效所属用户组的所有文件,可以使用n o g r o u p选项。下面的f i n d命令从文件系统的根目录处查找这样的文件
[code]$ find / -nogroup-print[/code]

[b]6、按照更改时间或访问时间等查找文件[/b]

如果希望按照更改时间来查找文件,可以使用m t i m e,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用m t i m e选项来查找这样的文件。
用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。
希望在系统根目录下查找更改时间在5日以内的文件,可以用:
[code]$ find / -mtime -5 -print[/code]

为了在/ v a r / a d m目录下查找更改时间在3日以前的文件,可以用:
[code]$ find /var/adm -mtime +3 -print[/code]

[b]论坛里的例 子
find 中的 -ctime 和 -mtime ,-atime 区别?  [/b]
http://www.chinaunix.net/forum/viewtopic.php?t=15799

[b]蜘蛛日记(九)::三个UNIX文件时间ctime,mtime,atime(转) [/b]
http://www.chinaunix.net/forum/viewtopic.php?t=92203

wingger 2004-11-10 07:25
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "明月清风" 发表:[/i]

~在csh类和bash里表示用户的主目录,~表示当前用户的主目录,~user表示user的主目录,例如:
cd ~   或者cd 回到当前用户主目录
ls ~oracle  列出oracle用户主目录下的文件[/quote]

明白了, :em02:  :em02:  :em02:

wingger 2004-11-10 07:46
shell基础二:查找技巧,find及xargs的使用

[b]编辑中[/b]

[b]7、查找比某个文件新或旧的文件[/b]

如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用- n e w e r选项。它的一般形式为:
[code]newest_file_name ! oldest_file_name[/code]
其中,!是逻辑非符号。

[b]查找更改时间比文件sam新但比文件temp旧的文件:[/b]

[code]例:有两个文件
-rw-r--r--    1 sam      adm             0 10月 31 01:07 fiel
-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam
-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

# find -newer httpd1.conf  ! -newer temp -ls
1077669    0 -rwxrwxr-x   2 sam      adm             0 10月 31 01:01 ./httpd.conf
1077671    4 -rw-rw-rw-   1 root     root         2792 10月 31 20:19 ./temp
1077673    0 -rw-r--r--   1 sam      adm             0 10月 31 01:07 ./fiel[/code]

查找更改时间在比temp文件新的文件:
[code]$ find . -newer temp -print[/code]

[b]8、使用type选项[/b]

在/ e t c目录下查找所有的目录,可以用:
[code]$ find /etc -type d -print[/code]

在当前目录下查找除目录以外的所有类型的文件,可以用:
[code]$ find . ! -type d -print[/code]

在/ e t c目录下查找所有的符号链接文件,可以用:
[code]$ find /etc -type l -print[/code]

寂寞烈火 2004-11-10 07:48
shell基础二:查找技巧,find及xargs的使用

弓虽口牙~~~~~

wingger 2004-11-10 08:15
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火"]弓虽口牙~~~~~[/quote 发表:[/i]

呵呵,弱得很,基础的没学好

[b]9、使用size选项[/b]

可以按照文件长度来查找文件,这里所指的文件长度既可以用块( b l o c k)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。
在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。

在当前目录下查找文件长度大于1 M字节的文件:
[code]$ find . -size +1000000c -print[/code]

在/ h o m e / a p a c h e目录下查找文件长度恰好为1 0 0字节的文件:
[code]$ find /home/apache -size 100c -print[/code]

在当前目录下查找长度超过1 0块的文件(一块等于5 1 2字节):
[code]$ find . -size +10 -print[/code]

[b]论坛例子:
如何查找大小为500K到1000K之间的文件[/b]
http://bbs.chinaunix.net/forum/viewtopic.php?t=332268

[b]10、使用depth选项[/b]

在使用f i n d命令时,可能希望先匹配所有的文件,再在子目录中查找。使用d e p t h选项就可以使f i n d命令这样做。这样做的一个原因就是,当在使用f i n d命令向磁带上备份文件系统时,希望首先备份所有的文件,其次再备份子目录中的文件。

在下面的例子中, f i n d命令从文件系统的根目录开始,查找一个名为C O N . F I L E的文件。
它将首先匹配所有的文件然后再进入子目录中查找。
[code]$ find / -name "CON.FILE" -depth -print[/code]

[b] 11、使用mount选项[/b]
在当前的文件系统中查找文件(不进入其他文件系统),可以使用f i n d命令的m o u n t选项。
从当前目录开始查找位于本文件系统中文件名以X C结尾的文件:
[code]$ find . -name "*.XC" -mount -print[/code]

[b]12、使用cpio选项[/b]
c p i o命令可以用来向磁带设备备份文件或从中恢复文件。可以使用f i n d命令在整个文件系统中(更多的情况下是在部分文件系统中)查找文件,然后用c p i o命令将其备份到磁带上。
如果希望使用c p i o命令备份/ e t c、/ h o m e和/ a p p s目录中的文件,可以使用下面所给出的命令,不过要记住你是在文件系统的根目录下:
[code]#cd /
#find etc home apps -depthe -print | cpio -ivcdC65535 -o [/code]

在上面的例子中,应当注意到路径中缺少/。这叫作相对路径。之所以使用相对路径,是因为在从磁带中恢复这些文件的时候,可以选择恢复文件的路径。例如,可以将这些文件先恢复到另外一个目录中,对它们进行某些操作后,再恢复到原始目录中。如果在备份时使用了绝对路径,例如/ e t c,那么在恢复时,就只能恢复到/ e t c目录中去,别无其他选择。在上面的例子中,我告诉f i n d命令首先进入/ e t c目录,然后是/ h o m e和/ a p p s目录,先匹配这些目录下
的文件,然后再匹配其子目录中的文件,所有这些结果将通过管道传递给c p i o命令进行备份。
顺便说一下,在上面的例子中c p i o命令使用了C 6 5 5 3 6选项,本可以使用B选项,不过这样每块的大小只有5 1 2 字节,而使用了C 6 5 5 3 6 选项后,块的大小变成了6 4 K 字节(6 5 5 3 6 / 1 0 2 4)

最后一项没有试验过

wingger 2004-11-10 09:14
shell基础二:查找技巧,find及xargs的使用

看完了这一章了,感觉find功能真的好强大啊,使用exec和xarg几乎可以扫行所有的命令。

同时谢谢各位的指点,嘻嘻,明天看下一章

aerfa 2004-11-10 11:14
shell基础二:查找技巧,find及xargs的使用

:D

bandt 2004-11-11 02:11
shell基础二:查找技巧,find及xargs的使用

upupup

odin_free 2004-11-11 02:36
shell基础二:查找技巧,find及xargs的使用

不错 我一直都是find / -name *|grep  text

ZealeS 2004-11-11 05:03
shell基础二:查找技巧,find及xargs的使用

好久没用Solaris,现在才发现原来原来Solaris8不支持:
-cmin
-mmin
-amin
等参数的,郁闷,怎样才能实现这个功能呢?

within0713 2004-11-11 17:29
shell基础二:查找技巧,find及xargs的使用

获益菲浅,楼主,继续呀

wingger 2004-11-12 00:38
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "within0713"]获益菲浅,楼主,继续呀[/quote 发表:[/i]

原想今天 收山了,看来还满有市场,呵呵

laixi781211 2004-11-12 08:02
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "bitbull" 发表:[/i]
请问楼主《LINUX和UNIX基础编程》这本书是什么内容的,哪里有介绍吗?
我CHINA-PUB上没找着[/quote]

http://laixi.dns0755.net/software/data/

双眼皮的猪 2004-11-14 03:54
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "bitbull" 发表:[/i]
请问楼主《LINUX和UNIX基础编程》这本书是什么内容的,哪里有介绍吗?
我CHINA-PUB上没找着[/quote]
Linux Unix shell编程指南

bitbull 2004-11-14 04:03
shell基础二:查找技巧,find及xargs的使用

谢谢

bigbigbig 2004-11-23 15:48
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火"]大多数情况下,这个-print是多余滴~(我认为)[/quote 发表:[/i]

刚才查了一下书:

如果在一个命令行没有指定动作,Linux和BSD系统下面-print却省地被执行。在其他版本的UNIX系统中,用户必须制定-print动作,否则就不会产生任何输出。

呵呵 :P

wingger 2004-11-25 02:13
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "bigbigbig" 发表:[/i]

刚才查了一下书:

如果在一个命令行没有指定动作,Linux和BSD系统下面-print却省地被执行。在其他版本的UNIX系统中,用户必须制定-print动作,否则就不会产生任何输出。

呵呵 :P[/quote]

呵呵,明白

rubemars 2004-11-25 09:33
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger" 发表:[/i]
避开多个文件夹
引用:
find /usr/sam \( -path "/usr/sam/dir1" -o -path "/usr/sam/file1" \) -prune -o -print  

圆括号表示表达式的结合。
\ 表示引用,即指示 shell 不对后面的字符作特殊解释,而留给 find 命令去解释其意义。

正确写法去掉()即可,如下:
代码:
#find /usr/sam  \-path "/usr/sam/dir1" -o -path "/usr/sam/file1" \ -prune -o -print   
[/quote]
试了一下,#find /usr/sam  \-path "/usr/sam/dir1" -o -path "/usr/sam/file1" \ -prune -o -print   
会把所有的都print,并没有避开/usr/sam/dir1和/usr/sam/file1,而是全部都print了,为什么?

寂寞烈火 2004-11-25 10:06
shell基础二:查找技巧,find及xargs的使用

你没有看仔细 ;)
[code]
find /pathdir \( -path /pahtdir/a -o -path /pathdir/b \) -prune -o -print[/code]
                             
shell基础二:查找技巧,find及xargs的使用

汗一个先,真的避不开耶

寂寞烈火 2004-11-25 12:44
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger"]汗一个先,真的避不开耶[/quote 发表:[/i]

怎么没有避开?!
[quote]
试了一下,#[color=red]find /usr/sam \-path "/usr/sam/dir1" -o -path "/usr/sam/file1" \ -prune -o -print [/color]
会把所有的都print,并没有避开/usr/sam/dir1和/usr/sam/file1,而是全部都print了,为什么?[/quote]
楼上的楼上的楼上的这样的写法,没有问题吗?!
正确的写法:
[size=20]find /pathdir \( -path /pahtdir/a -o -path /pathdir/b \) -prune -o -print[/size]

wingger 2004-11-25 14:05
shell基础二:查找技巧,find及xargs的使用

to 烈火

汗,多了这个“”

寂寞烈火 2004-11-25 14:20
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger" 发表:[/i]
to 烈火

汗,多了这个“”[/quote]
跟双引号没系
find -path "/path/dir" -prune -o -print 和:
find -path /path/dir -prune -o -print
是一样的效果
find [color=red]\([/color] -path "/path/dir1" -o -path "/path/dir2" [color=red]\)[/color] -prune -o -print 和:
find [color=red]\([/color] -path "/path/dir1" -o -path "/path/dir2" [color=red]\)[/color] -prune -o -print
是一样的,错误处在红字部分,即\(和\),他们两边要有空格

wingger 2004-11-26 01:52
shell基础二:查找技巧,find及xargs的使用

嗯 。那是我原文有错,少了括号,真是看了后面忘了前面了 :cry:

rubemars 2004-11-26 02:55
shell基础二:查找技巧,find及xargs的使用

懂了。find \( -path "/path/dir1" -o -path "/path/dir2" \) -prune -o -print是能完全避开 "/path/dir1"和"/path/dir2"的。
把find -path "/path/dir1" -o -path "/path/dir2" -prune -o -print 改成find -path "/path/dir1" -o -path "/path/dir2" -prune -o -exec  ls -l {} \;能看得比较清楚。这个命令中不会有ls -l  /path/dir1和ls -l  /path/dir2,但会ls -l /path/dir1下的文件,所以用-print参数的话看上去是避不开了。
我觉得还是没有了括号,按照
if -path "/usr/sam/dir1" -o -path "/usr/sam/file1"
then
    -prune
else
    -print
执行了的原因

quil 2004-11-26 06:35
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "bigbigbig" 发表:[/i]

刚才查了一下书:

如果在一个命令行没有指定动作,Linux和BSD系统下面-print却省地被执行。在其他版本的UNIX系统中,用户必须制定-print动作,否则就不会产生任何输出。

呵呵 :P[/quote]

hpunix也不用输-print

recn 2005-2-16 15:48
shell基础二:查找技巧,find及xargs的使用

我一定要努力,向他们学习的

rekus 2005-2-24 08:45
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger" 发表:[/i]
-perm选项中,我的解析
还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666
不知对不对

[/quote]

this is totally wrong

try
[code]
find . -perm -70 -print [/code]
how to explain the above one?

-7 means -**7

寂寞烈火 2005-2-24 09:11
shell基础二:查找技巧,find及xargs的使用

-perm mode:文件许可正好符合mode
-perm +mode:文件许可部分符合mode
-perm -mode: 文件许可完全符合mode

li2002 2005-3-17 14:21
shell基础二:查找技巧,find及xargs的使用

学会了避开一些指定目录的查找
find . -path "./xxx" -prune -o -name "xxx" -print
知道了-atime -mtime -ctime的含义
还有perm mode ,perm +mode,perm -mode的区别
还有 -and -or ! -size -empty -user -newer -perm等的功能。

有个小问题:
find ....|xargs echo "" >/tmp/aaa
其中的“”有什么作用??没有不也可以吗???

joefun 2005-3-24 23:12
shell基础二:查找技巧,find及xargs的使用

ding,我也想问楼上文的问题!!!

sdemon915 2005-4-26 10:15
shell基础二:查找技巧,find及xargs的使用

ding,我也想知道楼上的楼上的问题!

iotigod 2005-4-29 01:19
shell基础二:查找技巧,find及xargs的使用

补充一个,避开一些指定目录的查找时两个目录表示方法必须相同,否则不起作用要么都用绝对路径,要么都用相对路径
find . -path ./abc -prune -o -print

find /apps -path /apps/abc -prune -o -print
用下边的混用方式则不起作用
find . -path /apps/abc -prune -o -print

YGC 2005-6-11 06:23
shell基础二:查找技巧,find及xargs的使用

[quote]e x e c选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。 [/quote]
exec 的语法是
[code]-exec cmd \;[/code]
如果用户想在cmd中访问find查找的文件,才要用{}

YGC 2005-6-11 08:12
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "寂寞烈火"]大多数情况下,这个-print是多余滴~(我认为)[/quote 发表:[/i]

不见得是多余的。。
在linux和bsd中,-print缺省地被执行。在其他版本的UNIX系统中,没有指定-print动作,是不会产生任何输出的。。 :mrgreen:

YGC 2005-6-11 10:25
shell基础二:查找技巧,find及xargs的使用

看完。。。

guoliangbo 2005-6-11 16:03
shell基础二:查找技巧,find及xargs的使用

[quote][i]原帖由 "wingger"]注意,在上面的例子中, \用来取消f i n d命令中的*在s h e l l中的特殊含义。[/quote 发表:[/i]

$ find / -name "core" -print | xargs echo [color=red]""[/color] >/tmp/core.log
[quote]

    此处引号似乎可有可无--那就不要了吧

[/quote]

sword_111 2005-8-28 02:39
shell基础二:查找技巧,find及xargs的使用

[root@sword ~]# find -newer 2.sh ! 8.sh
find: paths must precede expression
Usage: find [path...] [expression]
这是我用find比较时的结果,我的目录里的内容为

[root@sword ~]# ls -l
total 204
-rwx------  1 root root    75 Aug 18 18:51 1
-rwx------  1 root root   384 Aug 21 08:30 1.sh
-rwxr--r--  1 root root    31 Aug 17 19:40 2
-rwx------  1 root root   105 Aug 18 22:29 2.sh
-rwx------  1 root root   259 Aug 22 23:09 3.sh
-rwx------  1 root root    72 Aug 22 23:30 4.sh
-rwx------  1 root root    49 Aug 23 03:09 5.sh
-rwx------  1 root root    38 Aug 24 01:00 6.sh
-rwx------  1 root root   112 Aug 24 00:57 8.sh
-rw-r--r--  1 root root  1358 Aug 11 17:10 anaconda-ks.cfg
-rw-r--r--  1 root root   260 Aug 28 21:20 corg.log
-rw-r--r--  1 root root    44 Aug 23 03:09 file.err
-rw-r--r--  1 root root     2 Aug 24 01:01 file.out
-rw-r--r--  1 root root 46599 Aug 11 17:10 install.log
-rw-r--r--  1 root root  3406 Aug 11 17:10 install.log.syslog
-rw-r--r--  1 root root     0 Aug 23 03:09 my.file
-rwx------  1 root root   155 Aug 22 23:24 my.sh
drwxr-xr-x  2 root root  4096 Aug 24 21:08 test
-rwx------  1 root root 12901 Aug 19 03:51 test.sh
为什么会这样呀?

sword_111 2005-8-28 02:48
shell基础二:查找技巧,find及xargs的使用

7、查找比某个文件新或旧的文件

如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用- n e w e r选项。它的一般形式为:
代码:
newest_file_name ! oldest_file_name

其中,!是逻辑非符号。

查找更改时间比文件sam新但比文件temp旧的文件:

代码:
例:有两个文件
-rw-r--r--    1 sam      adm             0 10月 31 01:07 fiel
-rw-rw-rw-    1 sam      adm         34890 10月 31 00:57 httpd1.conf
-rwxrwxr-x    2 sam      adm             0 10月 31 01:01 httpd.conf
drw-rw-rw-    2 gem      group        4096 10月 26 19:48 sam
-rw-rw-rw-    1 root     root         2792 10月 31 20:19 temp

# find -newer httpd1.conf  ! -newer temp -ls
1077669    0 -rwxrwxr-x   2 sam      adm             0 10月 31 01:01 ./httpd.conf
1077671    4 -rw-rw-rw-   1 root     root         2792 10月 31 20:19 ./temp
1077673    0 -rw-r--r--   1 sam      adm             0 10月 31 01:07 ./fiel
此处有错误,我感觉
应该是
find -newer oldfilesname ! -newer newfilesname -ls
我试验这样才能通过
                 
jiangjian5219 2005-9-24 02:58
shell基础二:查找技巧,find及xargs的使用

请楼主写的明白点好吗???
谢谢!!!!

c11v11 2005-10-10 11:22
shell基础二:查找技巧,find及xargs的使用

看完了
总觉得好象是不太复杂
不过具体的细节就要靠平时注意了
呵呵
大家要继续努力呀

erqie 2005-10-13 07:41
shell基础二:查找技巧,find及xargs的使用

嗯。平时总是在要用的时候才man一下,现在大体上知道有哪些选项可以用了。还是要平时多用的时候才能熟练.
还有前面有人问的关于用xargs echo "" >/tmp/core的时候的引号的作用?

佛光普照 2005-12-15 14:49
强中强!

wangjm213 2005-12-30 03:09
又让我学习到了很多知识,谢谢!

everslide 2006-2-8 01:26
楼主 find 命令是怎么对“ passwd*”进行匹配的,不是shell进行匹配的吗
find 内部命令 也可以进行文件匹配的吗

soney1550 2006-3-13 05:40
楼主写的不错啊,我现在正学到这里呢

wxg2718 2006-4-4 04:44
不是很难,但灵活用起来很难

zjg1727 2006-8-3 09:27
是啊,感觉不难其实要得心应手却不是难免简单!

pulf 2006-8-3 14:12
好东西啊!收下了!

+===========================+
IT技术引擎:[url]http://www.uye.cn[/url]
+===========================+

eddiexie 2006-8-29 07:35
find . -perm -7 -print | xargs chmod o-w

这个执行起来,提示  chmod: two few argument.

请问是为什么 ?

lovesaka 2006-8-29 14:26
[code]
chmod: two few argument.
[/code]
特别是那个two你应该知道吧

寂寞烈火 2006-8-29 15:36
[quote]原帖由 [i]eddiexie[/i] 于 2006-8-29 15:35 发表
find . -perm -7 -print | xargs chmod o-w

这个执行起来,提示  chmod: two few argument.

请问是为什么 ? [/quote]
你要作什么? 问题应该处在find身上

痞子燕 2006-9-12 09:57
好帖啊!!受益非浅

john11 2006-9-20 02:53
学习了


                 
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载