北京中搜网会模拟人访问网站

今天在查看访问日志时发现几个IP有点异常,通过http://www.123cha.com网站可以看到,这些IP都是北京中搜网的。

他们不像其它搜索引擎,会明确告诉网站他们是bot。

这是他们的访问记录:

...

2006-10-25 23:01:25,281 - User: userID:836,userName:guest; IP: 202.108.1.13 USER-AGENT: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) REFERER: Http://www.learndiary.com/disDiaryContentAction.do?goalID=2168&naviStr=a10a21

...

2006-10-25 23:01:54,281 - User: userID:836,userName:guest; IP: 202.108.1.10 USER-AGENT: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) REFERER: Http://www.learndiary.com/disGoalContentAction.do?goalID=2040&naviStr=a10

...

2006-10-25 23:02:16,781 - User: userID:836,userName:guest; IP: 202.108.1.6 USER-AGENT: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) REFERER: Http://www.learndiary.com/disDiaryContentAction.do?goalID=2034

linux应用小技巧收集

一些一两句话的linux应用小技巧放在这个帖子里。

1、查看文件字符集编码是gb2312还是utf8等:$file filename (Determine file type of FILEs.)

2、find 命令忽略大小写参数 -iname

3、gftp 中如果要把一个文件移到其它目录可以使用“更名”,如把文件h.txt 移到 ./folder/h.txt就把文件名h.txt更名为./folder/h.txt就行了。注:gftp是linux下的图形化的ftp软件。

4、 查看目录的大小

du -sh dirname

-s 仅显示总计

-h 以K、M、G为单位,提高信息的可读性。KB、MB、GB是以1024为换算单 位, -H以1000为换算单位。

-b print size in bytes

(但是奇怪的是在redhat linux9.0中在图形界面的目录上点击右键的属性项上显示的大小与上面命令显示的大小不一样,如上面命令显示的是9M,而在图形界面的属性中显示的却是7.2M。不知道是怎么一回事?)

你想不想知道:开源社区如何对付坏分子(转)

不管怎么说,学习日记也算是开源,虽然差劲。现在项目根本无人参与,也谈不上坏分子(要说有坏分子,那就是我了,在互联网上散布垃圾代码:))。也许,学习日记如果真正流行了,那时再来翻一下这个帖子也许能够给点帮助也说不定?

转自:http://tech.ccidnet.com/art/302/20060801/716251_1.html

你想不想知道:开源社区如何对付坏分子

作者: 来源:blog 发布时间:2006.08.02

【Java专区】 【网络安全】 【网管专区】 【linux专区】 【数据库专区】 【进入论坛】 【IT博客】 

【Eclipse】  【PHP】  【DB2】  【Ajax】  【Struts】  【Spring】  【源码·文档下载】

o'Reilly的OSCON还真是有些有趣的东西,这里挖掘到的一个演讲的主题是如何对付项目中的坏分子,或者说如何在毒人发作时存活下来。国内虽然这方面实践不多,我也没有什么经验,但总可以先看一下别人的作法,又或者对任何网络社区的活动都有一些指导意义。

  这里说的毒人,原文是Poisonous people,这么翻不知道合适与否。我们的前提是“注意力和专注是所有开源项目的稀缺资源,并且保护好”。这种毒人就能打散团队的注意力,影响工作的进行。这是需要避免的。首先,一个好的社区应该坚守自己的价值:

  礼貌、尊重、信任、谦让

  这样,当坏分子进来时,他们会发现他们与这种气氛格格不入,只能离开。但要维持一个有活力的团队,则还要做到:

    * 把项目历史写好(设计决策,补丁记录,错误,代码改变);

    * 保持健康的合作氛围:提交代码时发个邮件,鼓励其他人去检测代码,大的改变时就新开个一个分支,在开分支上不用太小心;

    * 增大项目的保险系数。就是如果有人离开,不至于某段代码就死掉了;

    * 在源代码文件中不要写名字,这会在代码所有权上造成许多不必要的麻烦,还是用版本控制工具来说明版权;

    * 只给部分提交的权限;

    * 如果不信任某人,就不要给他提交的权限。

  强壮的开源项目还应该有明确的发布流程,补丁流程,测试及增加新的提交人的流程。要形成自己的文化。成熟的社区应该能够较容易达成一致,只有万不得已时才用投票的手段。

  需要警惕的人包括有许多昵称的人,用奇怪ID的人,用全大写的昵称的人,没条理的,不理解社区目标的,问许多手册上写得很明白的问题的人等。还有很大牌地要求提供帮助的人,给其他人写黑信的,有权利欲的,挑衅的,打小报告的,还有不理会别人意见的,说许多垃圾话的,重开已有定论的话题的。最重要的,要当心那些不同别人合作的,抱怨却不愿去解决问题的,拒绝讨论一些设计的,还有根本不能接受批评的。

  当这些情况出现并开始扰乱社区气氛时,应尽快做出评定,搞清楚此人是否对项目有利。但千万不要再给他们以激励,比如加入他的行列,或者变得情绪化。最后,应该知道何时忽视他们,何时直接赶走,以及对这种行为进行反击。

  两位演讲者是Subversion的开发者,也写过这个软件的书。不过,现在他们又都在Google工作 ,推广开源软件,这工作真不错啊。难怪GoogleCode都是SVN。

JDOM与XML的案例(转帖)

JDOM与XML的案例转自:http://www.j2medev.com/code/j2se/language/200606/2559.html

××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

import java.io.IOException;

import java.util.Iterator;

import java.util.List;

import org.jdom.Comment;

import org.jdom.Document;

import org.jdom.Element;

import org.jdom.JDOMException;

import org.jdom.ProcessingInstruction;

import org.jdom.input.DOMBuilder;

import org.jdom.input.SAXBuilder;

import org.jdom.output.DOMOutputter;

/*

 * Simple demo of JDOM

 */

public class JDOMDemo {

    public static void main(String[] args) {

    // Must be at least one file or URL argument

        if (args.length == 0) {

            System.out.println("Usage: java JDOMDemo URL [...]");

        }

        SAXBuilder saxBuilder = new SAXBuilder();

        DOMBuilder domBuilder = new DOMBuilder();

        for (int i = 0; i < args.length; i++) {

            try {

                Document jdomDocument = saxBuilder.build(args[i]);

                DOMOutputter domOutputter = new DOMOutputter();

                /*

                 * Test getting DOM Document from JDOM Document

                org.w3c.dom.Document domDocument = domOutputter.output(doc);

                 */

                /*

                 * Test getting DOM Element from JDOM Element

                 */

                org.w3c.dom.Element domElement =

                  domOutputter.output(jdomDocument.getRootElement());

                /*

                 * Test getting JDOM Element from DOM Element

                 */

                org.jdom.Element jdomElement = domBuilder.build(domElement);

                demo(jdomElement);

            } catch (JDOMException e) { // indicates a well-formedness or other error

                System.out.println(args[i] + " is not a well formed XML document.");

                System.out.println(e.getMessage());

            } catch (IOException ex) {

        System.out.println("Input or Output error:" +

          args[i] + ": " + ex);

      }    

        }

    }

    public static void demo(Document doc) {

        List children = doc.getContent();

        Iterator iterator = children.iterator();

        while (iterator.hasNext()) {

            Object o = iterator.next();

            if (o instanceof Element) {

                demo((Element) o);

            }

            else if (o instanceof Comment)

        doComment((Comment) o);

            else if (o instanceof ProcessingInstruction)

        doPI((ProcessingInstruction) o);

        }

    }    

    public static void demo(Element element) {

    System.out.println("Element " + element);

        List attributes = element.getAttributes();

        List children = element.getContent();

        Iterator iterator = children.iterator();

        while (iterator.hasNext()) {

            Object o = iterator.next();

            if (o instanceof Element) {

                demo((Element) o);

            }

            else if (o instanceof Comment)

        doComment((Comment)o);

            else if (o instanceof ProcessingInstruction)

        doPI((ProcessingInstruction)o);

            else if (o instanceof String) {

                System.out.println("String: " + o);

            }  

        }

    } 

  public static void doComment(Comment c) {

    System.out.println("Comment: " + c);

  }

  public static void doPI(ProcessingInstruction pi) {

    System.out.println("PI: " + pi);

  }

}

// demo xml file

/*

<?xml version="1.0"?>

<people>

<person>

  <name>Ian Darwin</name>

  <email>http://www.darwinsys.com/</email>

  <country>Canada</country>

</person>

<person>

  <name>Another Darwin</name>

  <email type="intranet">afd@node1</email>

  <country>Canada</country>

</person>

</people>

*/

幼儿园的孩子也有“家庭作业”了

今天下午回到家里,她外婆指着桌子上一页纸说,老师说的,写一篇“3”。

现在的孩子真不容易呀,哪像我们小时候,七岁以前就一个字:玩。七岁以后才读小学,幼儿园也没上。很可惜的是,我的童年的记忆只有零星几点了。

我觉得,孩子小还是以培养习惯为主,但是中国就这样,你的孩子不学,别的孩子都学,你就“输在起跑线上”了。孩子在童年还是要以快乐和玩为基调。教她写字也没错,前提是她要乐意去写,把写字当成一个种快乐最好。我们不能逼她写,不然,这么小的孩子就对写字心生畏惧,不好。

在教会孩子写字和使孩子快乐之间的选择:在孩子快乐的前提下教她写字,如果写字成了她的痛苦,多读一年幼儿园也没啥关系。人生就这么几十年,童年都不快乐点,什么时候才快乐?

我们孩子三岁多点,我对她的能力还是满意的。她会画太阳,会画小刺猬。今天中午,她把数字2的大概形状能写对了,我还认真的夸了她,她高兴得手舞足蹈。现在幼儿园又在教3了。看来只有把2放弃了。教她写3,不然,老是在老师的进度后面追,太累了。

JSP/servlet中<JSP:FORWORD>和response.sendRedirect("")重定向

JAVA学习日记现有绑定了3个域名:www.learndiary.com, www.123go.org.cn, java.learndiary.com,

搜索引擎优化排名SEO每天一贴的zac老师讲:http://www.chinamyhosting.com/seoblog/2006/08/13/some-seo-questions/


如果这些域名都返回的是200,那么恐怕就有复制内容问题。应该把其中一个域名做主域名,服务器返回200,其他的所有域名都要做301转向,检查服务器状态码时,应该返回301,这样才能避免复制内容网页。

但是,我还没有解决本站现在要面临的首页重定向问题,即怎样在输入http://java.learndiary.com后返回200状态码,这主要是告诉搜索引擎:这个域名是我们的主域名。

具体问题是:


#  littlebat说:

2006年10月21日 at 5:22 pm

尊敬的zac老师,

你好。

我的网站是个jsp的网站,现有三个绑定的域名,按时间顺序分别是www.learndiary.com(pr=4),www.123go.org.cn (pr=4),当前由于网站定位调整,准备主要启用域名java.learndiary.com(pr=0)(pr值用www.123cha.com上查的)。

根据你写的文章和jsp的重定向技术,我在程序中实现了网站下面各页面内容的301转向,请求原来域名下的内容返回301码,请求新域名下的内容返回200码。

但是,我的首页通过程序无法实现301重定向。访问http://www.learndiary.com和http: //www.123go.org.cn返回301,重定向到http://java.learndiary.com ,访问http://java.learndiary.com返回302,重定向到http: //java.learndiary.com/indexAction.do ,

访问http://java.learndiary.com/indexAction.do返回200码。

因为我的网站是租的虚拟主机,主机只能够自动把http://java.learndiary.com定向到index.jsp, index.html, index.htm三种主页上,而我的网站的主页是index.do (使用struts做的),于是我在index.jsp做了一些重定向代码。但是始终不能达到输入我现在主用的域名http: //java.learndiary.com就返回200码的效果。

请问我这样情况的主页对搜索引擎友好吗?如果不友好我应该作些什么变动?

谢谢。

littlebat

http://java.learndiary.com JAVA学习日记,分享目标,分享快乐。

# Zac说:

2006年10月22日 at 6:12 am

littlebat: 抱歉,具体怎么实现301在各种服务器上方法不一样。我对JSP等一无所知,也帮不上忙了。

# littlebat说:

2006年10月22日 at 2:25 pm

谢谢您的回答,我主要是看了您的文章

回答几个SEO相关问题:http://www.chinamyhosting.com/seoblog/2006/08/13/some-seo- questions/中的这段:“如果这些域名都返回的是200,那么恐怕就有复制内容问题。应该把其中一个域名做主域名,服务器返回200,其他的所有域名都要做301转向,检查服务器状态码时,应该返回301,这样才能避免复制内容网页。”

我的重点是想问:我输入首域名http://java.learndiary.com的返回状态码是302,不返回200码;输入其它两个辅助域名的返回状态码是301。

请问这样的情况对搜索引擎友好吗?对网站的搜索排名等有多大的负面影响呢?

# littlebat说:

2006年10月23日 at 6:39 am

zac老师,

您好。我在jsp文件里用meta的重定向标记使输入主域名正确的返回了200码,输入辅助域名返回301码并重定向到主域名。

但是,我听说使用meta的跳转会被怀疑作弊,甚至会被搜索引擎封掉,就没敢用。是真的吗?

我的用meta重定向的首页index.jsp:


<%

  String newLocn = "http://java.learndiary.com";

  if (!(request.getHeader("host").equalsIgnoreCase("java.learndiary.com"))){

    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

    response.setHeader("Location",newLocn);

  }else{

    //response.setStatus(HttpServletResponse.SC_OK);

%>

<html>

        <head>

                <title>login...</title>

                <meta http-equiv="Refresh" content="0; URL=http://java.learndiary.com/indexAction.do">

        </head>

        <body>

        </body>

</html>

<%

  }

%>

当前正在运行,“输入首域名http://java.learndiary.com的返回状态码是302,不返回200码”的首页index.jsp:


<%@ include file="/common/predirective.jsp" %>

<html:html locale="true">

<head>

<title>login...</title>

<!--<meta http-equiv="Refresh" content="0; URL=bulletinAction.do">-->

</head>

<body>

<%

  String newLocn = "http://java.learndiary.com";

  if (!(request.getHeader("host").equalsIgnoreCase("java.learndiary.com"))){

    response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

    response.setHeader("Location",newLocn);

  }else{

    //response.setStatus(HttpServletResponse.SC_OK);

%>

  <logic:redirect page="/indexAction.do" />

<%

  }

%>

</body>

</html:html>

这个问题正在向zac老师请教一些问题,见转向和网址规范化。zac老师在搜索引擎优化排名SEO方面写了不少好文章。我也需要自己来探索在jsp中怎么样来具体实现。

另一篇转自:http://www.javalaw.cn/forum/read.php?tid=333&page=e的文章:servlet的两种重定向方法的区别及应用。

这篇文章还对HTTP的各种状态代码作了简要介绍。转帖正文:

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

servlet的两种重定向方法的区别及应用

一 问题:在servlet/JSP编程学习中,发现有两种方法可以实现服务端输出重定向,一种是通过forward方法(例如JSP中的<jsp: forward page=”OtherPage.jsp”/>),另一种则是通过运用 javax.servlet.http.HttpServletResponse接口的sendRedirect方法(例如 response.sendRedirect(“OtherPage.jsp”);这两种方法有什么区别和联系呢?让我们看下面的分析。

  二 分析:(1)<JSP:FORWORD>

  该方法是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区(buffer)的内容发送到客户端之前,原来的不发送,改为发送该页面的内容,如果在 <JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意.

  补充知识:输出缓冲区

  缺省情况下:服务端要输出到客户端的内容,不直接写到客户端,而是先写到一个输出缓冲区中.只有在下面三中情况下,才会把该缓冲区的内容输出到客户端上:

  1该JSP网页已完成信息的输出

  2输出缓冲区已满

  3JSP中调用了out.flush()或response.flushbuffer()

  输出缓冲区的大小可以用:<%@page buffer="none"|"nkb"%>或response.setBufferSize()设置,如下:

  1设置输出缓冲区的大小为1KB。<%@page buffer="1kb"%>或response.setBufferSize(1);

  2设置输出缓冲区的大小为0,即不缓冲。<%@page buffer="none" %>或response.setBufferSize(0);

  用response.getBufferSize()或out.getBufferSize()可取的输出缓冲区的大小,单位为字节.

  用response.isCommitted()可检查看服务端是否已将数据输出到客户端. 如果返回值是TRUE则已将数据输出到客户端,是FALSE则还没有。

  (2)response.sendRedirect(“OtherPage.jsp”)

  该方法通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。如果地址是相对的,没有一个’/’,那么Web container就认为它是相对于当前的请求URI的。

  因为这个方法是通过修改HTTP协议的HEADER实现的重定义功能,而下面的方法也能改变HTTP HEADER属性,他们的原理是一样的.

  <%

  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

  String newLocn="/index.html";

  response.setHeader("Location",newLocn);

  %>

  补充知识:HTTP应答头

   Web服务器响应浏览器或其他客户程序的请求时,其应答一般由以下几个部分组成:一个状态行,几个应答头,一个空行,内容文档。下面是一个最简单的应答:

  HTTP/1.1 200 OK

  Content-Type: text/plain

  Hello World

  1设置状态信息

  状态行包含HTTP版本、状态代码、与状态代码对应的简短说明信息。在大多数情况下,除了Content-Type之外的所有应答头都是可选的。 Servlet可以利用状态代码来实现许多功能。例如,可以把用户重定向到另一个网站,就像我们上边所看到的那个例子。下面我们就通过这个机会具体讨论各种状态代码的含义以及利用这些代码可以做些什么。

  如前所述,HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关,而HTTP版本又由服务器确定,因此需要Servlet设置的只有一个状态代码。

  先给出常见的HTTP 1.1状态代码以及它们对应的状态信息和含义,具体的使用方法我们接下来再做详细的介绍。

  100 Continue 初始的请求已经接受,客户应当继续发送请求的其余部分。(HTTP 1.1新)

  101 Switching Protocols 服务器将遵从客户的请求转换到另外一种协议(HTTP 1.1新)

  200 OK 一切正常,对GET和POST请求的应答文档跟在后面。如果不用setStatus设置状态代码,Servlet默认使用202状态代码。

  201 Created 服务器已经创建了文档,Location头给出了它的URL。

  202 Accepted 已经接受请求,但处理尚未完成。

  203 Non-Authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝(HTTP 1.1新)。

  204 No Content 没有新文档,浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。

  205 Reset Content 没有新的内容,但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容(HTTP 1.1新)。

  206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它(HTTP 1.1新)。

  300 Multiple Choices 客户请求的文档可以在多个位置找到,这些位置已经在返回的文档内列出。如果服务器要提出优先选择,则应该在Location应答头指明。

  301 Moved Permanently 客户请求的文档在其他地方,新的URL在Location头中给出,浏览器应该自动地访问新的URL。

  302 Found 类似于301,但新的URL应该被视为临时性的替代,而不是永久性的。注意,在HTTP1.0中对应的状态信息是“Moved Temporatily”,而HttpServletResponse中相应的常量是SC_MOVED_TEMPORARILY,而不是SC_FOUND。

  出现该状态代码时,浏览器能够自动访问新的URL,因此它是一个很有用的状态代码。为此,Servlet提供了一个专用的方法,即 sendRedirect。使用response.sendRedirect(url)比使用response.setStatus (response.SC_MOVED_TEMPORARILY)和response.setHeader("Location",url)更好。这是因为:

  首先,代码更加简洁。

  第二,使用sendRedirect,Servlet会自动构造一个包含新链接的页面(用于那些不能自动重定向的老式浏览器)。

  最后,sendRedirect能够处理相对URL,自动把它们转换成绝对URL。

  注意这个状态代码有时候可以和301替换使用。例如,如果浏览器错误地请求http://host/~user(缺少了后面的斜杠),有的服务器返回301,有的则返回302。

  严格地说,我们只能假定只有当原来的请求是GET时浏览器才会自动重定向。请参见307。

  303 See Other 类似于301/302,不同之处在于,如果原来的请求是POST,Location头指定的重定向目标文档应该通过GET提取(HTTP 1.1新)。

  304 Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

  305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取(HTTP 1.1新)。

  307 Temporary Redirect 和302(Found)相同。许多浏览器会错误地响应302应答进行重定向,即使原来的请求是POST,即使它实际上只能在POST请求的应答是303时才能重定向。由于这个原因,HTTP 1.1新增了307,以便更加清除地区分几个状态代码:当出现303应答时,浏览器可以跟随重定向的GET和POST请求;如果是307应答,则浏览器只能跟随对GET请求的重定向。

  注意,HttpServletResponse中没有为该状态代码提供相应的常量。(HTTP 1.1新)

  400 Bad Request 请求出现语法错误。

  401 Unauthorized 客户试图未经授权访问受密码保护的页面。应答中会包含一个WWW-Authenticate头,浏览器据此显示用户名字/密码对话框,然后在填写合适的Authorization头后再次发出请求。

  403 Forbidden 资源不可用。服务器理解客户的请求,但拒绝处理它。通常由于服务器上文件或目录的权限设置导致。

  404 Not Found 无法找到指定位置的资源。这也是一个常用的应答,HttpServletResponse专门提供了相应的方法:sendError(message)。

  405 Method Not Allowed 请求方法(GET、POST、HEAD、DELETE、PUT、TRACE等)对指定的资源不适用。(HTTP 1.1新)

  406 Not Acceptable 指定的资源已经找到,但它的MIME类型和客户在Accpet头中所指定的不兼容(HTTP 1.1新)。

  407 Proxy Authentication Required 类似于401,表示客户必须先经过代理服务器的授权。(HTTP 1.1新)

  408 Request Timeout 在服务器许可的等待时间内,客户一直没有发出任何请求。客户可以在以后重复同一请求。(HTTP 1.1新)

  409 Conflict 通常和PUT请求有关。由于请求和资源的当前状态相冲突,因此请求不能成功。(HTTP 1.1新)

  410 Gone 所请求的文档已经不再可用,而且服务器不知道应该重定向到哪一个地址。它和404的不同在于,返回407表示文档永久地离开了指定的位置,而404表示由于未知的原因文档不可用。(HTTP 1.1新)

  411 Length Required 服务器不能处理请求,除非客户发送一个Content-Length头。(HTTP 1.1新)

  412 Precondition Failed 请求头中指定的一些前提条件失败(HTTP 1.1新)。

  413 Request Entity Too Large 目标文档的大小超过服务器当前愿意处理的大小。如果服务器认为自己能够稍后再处理该请求,则应该提供一个Retry-After头(HTTP 1.1新)。

  414 Request URI Too Long URI太长(HTTP 1.1新)。

  416 Requested Range Not Satisfiable 服务器不能满足客户在请求中指定的Range头。(HTTP 1.1新)

  500 Internal Server Error 服务器遇到了意料不到的情况,不能完成客户的请求。

  501 Not Implemented 服务器不支持实现请求所需要的功能。例如,客户发出了一个服务器不支持的PUT请求。

  502 Bad Gateway 服务器作为网关或者代理时,为了完成请求访问下一个服务器,但该服务器返回了非法的应答。

  503 Service Unavailable 服务器由于维护或者负载过重未能应答。例如,Servlet可能在数据库连接池已满的情况下返回503。服务器返回503时可以提供一个Retry-After头。

  504 Gateway Timeout 由作为代理或网关的服务器使用,表示不能及时地从远程服务器获得应答。(HTTP 1.1新)

  505 HTTP Version Not Supported 服务器不支持请求中所指明的HTTP版本。(HTTP 1.1新)

  如前所述,HTTP应答状态行包含HTTP版本、状态代码和对应的状态信息。由于状态信息直接和状态代码相关,而HTTP版本又由服务器确定,因此需要 Servlet设置的只有一个状态代码。拿我们上边的例子来看。其中有一句就是设置HTTP应答头的状态代码的,是:

  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);

  Servlet设置状态代码一般使用HttpServletResponse的setStatus方法。setStatus方法的参数是一个整数(即状态代码),不过为了使得代码具有更好的可读性,可以用HttpServletResponse中定义的常量来避免直接使用整数。这些常量根据HTTP 1.1中的标准状态信息命名,所有的名字都加上了SC前缀(Status Code的缩写)并大写,同时把空格转换成了下划线。也就是说,与状态代码301对应的状态信息是“Moved Permanently”,则HttpServletResponse中的对应常量名字为SC_MOVED_PERMANENTLY。但有两个例外:和状态代码302对应的常量根据HTTP 1.0命名为SC_MOVED_TEMPORARILY,而不是SC_FOUND,而307没有对应的常量。

  虽然设置状态代码一般使用的是response.setStauts(int)方法,但为了简单起见,HttpServletResponse为两种常见的情形提供了专用方法:sendError方法生成一个404应答,同时生成一个简短的HTML错误信息文档;sendRedirect方法生成一个 302应答,同时在Location头中指示新文档的URL。这种方法就是我们前边提到的response.sendRedirect (“OtherPage.jsp”)实现重定向的方法的原理。它与301应答,既response.setStatus (HttpServletResponse.SC_MOVED_PERMANENTLY)的区别请看上边状态列表的红色标记部分,这里不再重复。

  2设置HTTP应答头

  设置HTTP应答头往往和设置状态行中的状态代码结合起来。例如,有好几个表示“文档位置已经改变”的状态代码都伴随着一个Location头,而 401(Unauthorized)状态代码则必须伴随一个WWW-Authenticate头。这些都在相应的状态代码的状态信息说明中都提到了。

  然而,即使在没有设置特殊含义的状态代码时,指定应答头也是很有用的。应答头可以用来完成:设置Cookie,指定修改日期,指示浏览器按照指定的间隔刷新页面,声明文档的长度以便利用持久HTTP连接,……等等许多其他任务。还拿我们上边的例子来看,其中有一句就是设置HTTP应答头的,是:

   response.setHeader("Location",newLocn);

  设置应答头最常用的方法是HttpServletResponse的setHeader,该方法有两个参数,分别表示应答头的名字和值。和设置状态代码相似,设置应答头应该在发送任何文档内容之前进行。

  应答头 说明

  Allow 服务器支持哪些请求方法(如GET、POST等)。

  Content-Encoding 文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept- Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。

  Content-Length 表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入 ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过 byteArrayStream.writeTo(response.getOutputStream()发送内容。

  Content- Type 表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置 Content-Type,因此HttpServletResponse提供了一个专用的方法setContentTyep。

  Date 当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。

  Expires 应该在什么时候认为文档已经过期,从而不再缓存它?

  Last-Modified 文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。

  Location 表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。

  Refresh 表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。

  注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的 HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。

  注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。

  注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。

  Server 服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。

  Set-Cookie 设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。

   WWW-Authenticate 客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如, response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。

  注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。

   到此我们应该可以理解用下面代码实现重定向的原理:修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。

  <%

  response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY); 设置HTTP应答头状态代码

  String newLocn="/index.html";

  response.setHeader("Location",newLocn); 设置HTTP应答头

  %>

  三 总结:

  通过上边的分析,我们清楚了这两种服务器端重定向方法的原理,<jsp:forward>是利用服务器端先将数据输出到缓冲区的机制,在把缓冲区的内容发送到客户端之前,通过停止调用页的处理,将执行转向响应的页面,从而实现的重定位功能,原调用页的输出缓冲区中任何尚未在浏览器中显示(刷新)的内容将被清楚,不再显示。

   而response.sendRedirect(“OtherPage.jsp”)是通过修改HTTP协议的HEADER部分,对浏览器下达重定向指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容的。

  四 对比:

  1 forward方法是在Web container内部工作的。SendRedirect方法需要到客户端的一个往返。所以forward方法要比sendreRirect要快

  2 forward方法只能重定向到同一个Web应用程序中的一个资源。而sendRedirect方法可以重定向到任何URL

  3 forward方法还将原始的HTTP请求对象(request)转到目录页。而sendRedirect方法的功能是触发浏览器转向指定的URL,并不会将原始请求对象转发。

  在例:C:\Tomcat 5.0\webapps\test\regiester10中我们可以看到在WELCOME。JSP中有:

  <tr><td>姓名:<%=request.getParameter("userName")%></td></tr>

  当在LOGIN.JSP中用response.sendRedirect("welcome.jsp");重定向到WELCOME.JSP时,输出为:

   姓名:null

  当在LOGIN.JSP中用<jsp:forward page = "welcome.jsp"/>重定向到WELCOME.JSP时,输出为:

   姓名:wangjian

  4.sendRedirect能够处理相对URL,自动把它们转换成绝对URL。

                                               --转帖完毕

OS中复制文件后eclipse3.*不能识别包下面的合法类文件!

在eclipse3.1和3.2中写学习日记的程序。我发现,如果把一个已有的工程文件在操作系统中复制成另一个工程(把.project文件中的文件名改了)。再编译复制的工程文件时会出现。报告一个明明正确引用的类文件不存在,全是小红叉!我初步试了一下,可以把工程顶层目录中的那些前面有.的隐藏删除,然后重启eclipse好像就可以了(还没完全证实)。

另外,如果要把一个工程的文件复制到另一个工程去。我发现只要在eclipse系统中进行就没事。

我的操作系统用的是Redhat linux9.0,不知道在windows下eclipse3.*有没有这个问题?没试过。

ThunderBird中文用户的一点牢骚

我在linux下使用ThunderBird作为邮件收发和RSS订阅工具。发现一些中文邮件ThunderBird竟然不能接收。而用它来订阅我们JAVA学习日记站的RSS老是不能保质保量的完成任务,说订39篇,订了1篇就停了,估计是什么中文处理没通过,卡住了。

而我在windows下用新浪的点点通RSS订阅,都能正常完成订阅和阅读。邮件也是用foxmail也不成问题。

我指的是ThunderBird这款软件,它不只是linux用,在windows下也可以用。在windows下的ThunderBird有没有这些问题还没有试过。

另外,我用ThunderBird订阅www.matrix.org.cn的RSS却没有问题,估计是我的程序的哪个地方还有问题。

与WIN不同,linux替换文件夹会删除原文件夹下的全部内容!

例如:

原文件夹folder含一个文件test.txt和一个子文件夹subdir;

同名新文件夹folder下只有一个文件test.txt。

我在文件夹中用鼠标复制新文件夹到旧文件夹所在的文件夹,在windows下只会替换其中新文件夹中的test.txt,旧文件夹下的子文件夹subdir不会受影响;而在linux下旧文件夹下面的子文件夹subdir也会被删除!

这就是linux和windows不同的地方之一,一些在windows下面想当然的操作在linux下没有用过也不要去随便做。

另外,我在linux下的命令行方式下试了一下复制覆盖操作:

假设folder和anotherfolder在当前目录下,anotherfolder下有个名为folder的旧文件夹,

cp folder anotherfolder/ -fr

这样操作只会覆盖同名的文件test.txt,而不会覆盖旧文件夹下面的其它东西。

真不知道在窗口中用鼠标操作的复制操作的等同的命令是什么?

Linux文件查找命令find,xargs详述(转帖)

转自:(http://docs.chinalinuxpub.com/read.php?wid=1230)

想删除工程中的CVS文件和文件夹,查了一下网上,基本的东西都是差不多的,就是这篇帖子才解决问题。为什么?因为这篇文章多了一句话:“相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。”

我没有在{}和\;之间加空格,结果是费了不少时间。感谢原作者的贡献。

我前面的命令为:

find . -name "*CVS*" -exec rm -fr {} \;

转帖正文:

×××××××××××××××××××××××××××××××××××××××××××××××××××××××××××××

Linux文件查找命令find,xargs详述

发布于2006-06-12 被读1665次 【字体:大 中 小】

版权声明

本文是zhyfly兄贴在LinuxSir.Org 的一个帖子而整理出来的,如果您对版权有疑问,请在本帖后面跟帖。谢谢;本文的HTML版本由北南南北整理;修改了整篇文档的全角及说明文字中的单词中每个字母空格的问题;为标题加了编号,方便大家阅读;

前言:关于find命令

由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下。即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限。

在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可能会花费很长的时间(这里是指30G字节以上的文件系统)。

一、find 命令格式

1、find命令的一般形式为;

find pathname -options [-print -exec -ok ...]

2、find命令的参数;

pathname: find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-print: find命令将匹配的文件输出到标准输出。

-exec: find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。

-ok: 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

3、find命令选项

-name

按照文件名查找文件。

-perm

按照文件权限来查找文件。

-prune

使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。

-user

按照文件属主来查找文件。

-group

按照文件所属的组来查找文件。

-mtime -n +n

按照文件的更改时间来查找文件, - n表示文件更改时间距现在n天以内,+ n表示文件更改时间距现在n天以前。find命令还有-atime和-ctime 选项,但它们都和-m time选项。

-nogroup

查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。

-nouser

查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。

-newer file1 ! file2

查找更改时间比文件file1新但比文件file2旧的文件。

-type

查找某一类型的文件,诸如:

b - 块设备文件。

d - 目录。

c - 字符设备文件。

p - 管道文件。

l - 符号链接文件。

f - 普通文件。

-size n:[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。

-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。

-fstype:查找位于某一类型文件系统中的文件,这些文件系统类型通常可以在配置文件/etc/fstab中找到,该配置文件中包含了本系统中有关文件系统的信息。

-mount:在查找文件时不跨越文件系统mount点。

-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件。

-cpio:对匹配的文件使用cpio命令,将这些文件备份到磁带设备中。

另外,下面三个的区别:

   -amin n

  查找系统中最后N分钟访问的文件

  -atime n

  查找系统中最后n*24小时访问的文件

  -cmin n

  查找系统中最后N分钟被改变文件状态的文件

  -ctime n

  查找系统中最后n*24小时被改变文件状态的文件

    -mmin n

  查找系统中最后N分钟被改变文件数据的文件

  -mtime n

  查找系统中最后n*24小时被改变文件数据的文件

4、使用exec或ok来执行shell命令

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

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

exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。为了使用exec选项,必须要同时使用print选项。如果验证一下find命令,会发现该命令只输出从当前路径起的相对路径及文件名。

例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中

# 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

上面的例子中,find命令匹配到了当前目录下的所有普通文件,并在-exec选项中使用ls -l命令将它们列出。

在/logs目录中查找更改时间在5日以前的文件并删除它们:

 $ find logs -type f -mtime +5 -exec rm { } \;

记住:在shell中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如mv或rm命令时,可以使用-exec选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

在下面的例子中, find命令在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。

 $ find . -name "*.conf" -mtime +5 -ok rm { } \;

< rm ... ./conf/httpd.conf > ? n

按y键删除文件,按n键不删除。

任何形式的命令都可以在-exec选项中使用。

在下面的例子中我们使用grep命令。find命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执行grep命令看看在这些文件中是否存在一个sam用户。

# find /etc -name "passwd*" -exec grep "sam" { } \;

sam:x:501:501::/usr/sam:/bin/bash

二、find命令的例子;

1、查找当前用户主目录下的所有文件:

下面两种方法都可以使用

 $ find  $HOME -print

 $ find ~ -print

2、让当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件;

 $ find . -type f -perm 644 -exec ls -l { } \;

3、为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径;

 $ find / -type f -size 0 -exec ls -l { } \;

4、查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们;

 $ find /var/logs -type f -mtime +7 -ok rm { } \;

5、为了查找系统中所有属于root组的文件;

 $find . -group root -exec ls -l { } \;

-rw-r--r-- 1 root root 595 10月 31 01:09 ./fie1

6、find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。

该命令只检查三位数字,所以相应文件的后缀不要超过999。先建几个admin.log*的文件 ,才能使用下面这个命令

 $ 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

7、为了查找当前文件系统中的所有目录并排序;

 $ find . -type d | sort

8、为了查找系统中所有的rmt磁带设备;

 $ find /dev/rmt -print

三、xargs

xargs - build and execute command lines from standard input

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

find命令把匹配到的文件传递给xargs命令,而xargs命令每次只获取一部分文件而不是全部,不像-exec选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用-exec选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用xargs命令则只有一个进程。另外,在使用xargs命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看xargs命令是如何同find命令一起使用的,并给出一些例子。

下面的例子查找系统中的每一个普通文件,然后使用xargs命令来测试它们分别属于哪类文件

#find . -type f -print | xargs file

./.kde/Autostart/Autorun.desktop: UTF-8 Unicode English text

./.kde/Autostart/.directory: ISO-8859 text\

......

在整个系统中查找内存信息转储文件(core dump) ,然后把结果保存到/tmp/core.log 文件中:

 $ find / -name "core" -print | xargs echo "" >/tmp/core.log

上面这个执行太慢,我改成在当前目录下查找

#find . -name "file*" -print | xargs echo "" > /temp/core.log

# cat /temp/core.log

./file6

在当前目录下查找所有用户具有读、写和执行权限的文件,并收回相应的写权限:

# 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

用grep命令在所有的普通文件中搜索hostname这个词:

# 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

用grep命令在当前目录下的所有普通文件中搜索hostnames这个词:

# 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

注意,在上面的例子中, \用来取消find命令中的*在shell中的特殊含义。

find命令配合使用exec和xargs可以使用户对所匹配到的文件执行几乎所有的命令。

四、find 命令的参数

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

1、使用name选项

文件名选项是find命令最常用的选项,要么单独使用该选项,要么和其他选项一起使用。

可以使用某种文件名模式来匹配文件,记住要用引号将文件名模式引起来。

不管当前路径是什么,如果想要在自己的根目录 $HOME中查找文件名符合*.txt的文件,使用~作为 'pathname'参数,波浪号~代表了你的 $HOME目录。

 $ find ~ -name "*.txt" -print

想要在当前目录及子目录中查找所有的‘ *.txt’文件,可以用:

 $ find . -name "*.txt" -print

想要的当前目录及子目录中查找文件名以一个大写字母开头的文件,可以用:

 $ find . -name "[A-Z]*" -print

想要在/etc目录中查找文件名以host开头的文件,可以用:

 $ find /etc -name "host*" -print

想要查找 $HOME目录中的文件,可以用:

 $ find ~ -name "*" -print 或find . -print

要想让系统高负荷运行,就从根目录开始查找所有的文件。

 $ find / -name "*" -print

如果想在当前目录查找文件名以两个小写字母开头,跟着是两个数字,最后是.txt的文件,下面的命令就能够返回名为ax37.txt的文件:

 $find . -name "[a-z][a-z][0--9][0--9].txt" -print

2、用perm选项

按照文件权限模式用-perm选项,按文件权限模式来查找文件的话。最好使用八进制的权限表示法。

如在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件,可以用:

 $ find . -perm 755 -print

还有一种表达方法:在八进制数字前面要加一个横杠-,表示都匹配,如-007就相当于777,-006相当于666

# 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

-perm mode:文件许可正好符合mode

-perm +mode:文件许可部分符合mode

-perm -mode: 文件许可完全符合mode

3、忽略某个目录

如果在查找文件时希望忽略某个目录,因为你知道那个目录中没有你所要查找的文件,那么可以使用-prune选项来指出需要忽略的目录。在使用-prune选项时要当心,因为如果你同时使用了-depth选项,那么-prune选项就会被find命令忽略。

如果希望在/apps目录下查找文件,但不希望在/apps/bin目录下查找,可以用:

 $ find /apps -path "/apps/bin" -prune -o -print

4、使用find查找文件的时候怎么避开某个文件目录

比如要在/usr/sam目录下查找不在dir1子目录之内的所有文件

find /usr/sam -path "/usr/sam/dir1" -prune -o -print

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,或逻辑表达式为真。

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

if -path "/usr/sam" then

          -prune

else

          -print

避开多个文件夹

find /usr/sam \( -path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -print

圆括号表示表达式的结合。

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

查找某一确定文件,-name等选项加在-o 之后

#find /usr/sam \(-path /usr/sam/dir1 -o -path /usr/sam/file1 \) -prune -o -name "temp" -print

5、使用user和nouser选项

按文件属主查找文件,如在 $HOME目录中查找文件属主为sam的文件,可以用:

 $ find ~ -user sam -print

在/etc目录下查找文件属主为uucp的文件:

 $ find /etc -user uucp -print

为了查找属主帐户已经被删除的文件,可以使用-nouser选项。这样就能够找到那些属主在/etc/passwd文件中没有有效帐户的文件。在使用-nouser选项时,不必给出用户名; find命令能够为你完成相应的工作。

例如,希望在/home目录下查找所有的这类文件,可以用:

 $ find /home -nouser -print

6、使用group和nogroup选项

就像user和nouser选项一样,针对文件所属于的用户组, find命令也具有同样的选项,为了在/apps目录下查找属于gem用户组的文件,可以用:

 $ find /apps -group gem -print

要查找没有有效所属用户组的所有文件,可以使用nogroup选项。下面的find命令从文件系统的根目录处查找这样的文件

 $ find / -nogroup-print

7、按照更改时间或访问时间等查找文件

如果希望按照更改时间来查找文件,可以使用mtime,atime或ctime选项。如果系统突然没有可用空间了,很有可能某一个文件的长度在此期间增长迅速,这时就可以用mtime选项来查找这样的文件。

用减号-来限定更改时间在距今n日以内的文件,而用加号+来限定更改时间在距今n日以前的文件。

希望在系统根目录下查找更改时间在5日以内的文件,可以用:

 $ find / -mtime -5 -print

为了在/var/adm目录下查找更改时间在3日以前的文件,可以用:

 $ find /var/adm -mtime +3 -print

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

如果希望查找更改时间比某个文件新但比另一个文件旧的所有文件,可以使用-newer选项。它的一般形式为:

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

查找更改时间在比temp文件新的文件:

 $ find . -newer temp -print

9、使用type选项

在/etc目录下查找所有的目录,可以用:

 $ find /etc -type d -print

在当前目录下查找除目录以外的所有类型的文件,可以用:

 $ find . ! -type d -print

在/etc目录下查找所有的符号链接文件,可以用

 $ find /etc -type l -print

10、使用size选项

可以按照文件长度来查找文件,这里所指的文件长度既可以用块(block)来计量,也可以用字节来计量。以字节计量文件长度的表达形式为N c;以块计量文件长度只用数字表示即可。

在按照文件长度查找文件时,一般使用这种以字节表示的文件长度,在查看文件系统的大小,因为这时使用块来计量更容易转换。

在当前目录下查找文件长度大于1 M字节的文件:

 $ find . -size +1000000c -print

在/home/apache目录下查找文件长度恰好为100字节的文件:

 $ find /home/apache -size 100c -print

在当前目录下查找长度超过10块的文件(一块等于512字节):

 $ find . -size +10 -print

11、使用depth选项

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

在下面的例子中, find命令从文件系统的根目录开始,查找一个名为CON.FILE的文件。

它将首先匹配所有的文件然后再进入子目录中查找。

 $ find / -name "CON.FILE" -depth -print

12、使用mount选项

在当前的文件系统中查找文件(不进入其他文件系统),可以使用find命令的mount选项。

从当前目录开始查找位于本文件系统中文件名以XC结尾的文件:

 $ find . -name "*.XC" -mount -print

五、关于本文

本文是find 命令的详细说明,可贵的是针对参数举了很多的实例,大量的例证,让初学者更为容易理解;本文是zhy2111314兄贴在论坛中;我对本文进行了再次整理,为方便大家阅读; ── 北南南北

                                     --转帖完毕