tcp要点学习-基础概念

TCP是TCP/IP协议簇中传输层上的一种网络协议,它是一种面向连接的、可靠的协议。为了提供这种可靠性,TCP实现了各种有效的机制、算法。为了从一种宏观的角度去了解这个协议,这里先大致地提一下与之相关
的概念。 
1. 什么是‘面向连接的’?
   引用中的概念:
   面向连接意味着两个使用TCP的应用(通常是一个客户和一个服务器)在彼此交换数据之前必须先建立一个TCP连接。 
2. 什么是‘三次握手’?[break]
   在建立TCP连接之前,两个使用TCP的应用需要交换三次网络数据。这三个数据包的来往也就是所谓的‘三次握手’。 
3. 报文段segment
   我们说TCP是流式的网络协议,那是因为,应用程序可以一直往TCP写数据,无论你是逐byte,还是write a chunk,TCP对应用传给它的数据进行缓冲,直到缓冲数据达到一定尺寸才发送。可以看出,对于应用而言,TCP就像是stream的。但事实上,在TCP层,数据还是以块为单位的。这个块也就是所谓的报文段 segment。 
4. 什么是MTU?
   MTU即最大传输单元(Maximum Transmission Unit,MTU)是指一种通信协议的某一层上面所能通过的大数据报大小(以字节为单位)。我个人目前的理解认为,MTU是一个网络在硬件层次上所允许的最大数据包大小,例如以太网大概是1500字节。 
5. 什么是MSS?
   MSS即最大报文段大小(Maximum Segment Size),它是指TCP中一个报文段上附加的用户数据的最大大小。这里稍微说下应用层发送某个数据包时整个TCP/IP协议栈的操作过程:应用层将自己的用户数据传给TCP层(传输层),TCP在这些数据前添加自己的协议头(简单地理解为附加一些数据),然后将数据交给
   IP层(网络层),IP层附加自己的协议头,以此类推。虽然MSS意思是最大报文段大小,但事实上它是排除了协议头的用户数据。 
6. MTU and MSS ?
   可以简单地给你一个这样的公示:mss = mtu - tcp_header_size - ip_header_size。而通常,IP协议附加的协议头大小和TCP的协议头大小都是20字节,所以通常的MSS为1460字节。注意,这里说的数字并不见得正确,因为MSS是可以被协商的。各种协议头也可能被添加附加数据,但是他们的关系是这样的。 
7. 什么是窗口大小?
   找本TCP的书看下TCP数据包的包头(本文多次使用数据包、报文的概念,我这里说的都是一样的),你会发现那个16位的窗口大小。
   窗口这个域对于整个TCP协议都很重要。简单地说,窗口大小是指接收端的接收缓存的大小。上面说了,应用在发数据的时候,TCP会缓存这些数据,稍后发送。接收数据时也一样,TCP接收数据并缓存起来,直到应用调用recv之类的函数取数据时,TCP才将这些缓存数据清除。TCP发送端会根据TCP接收端那个接收缓存大小决定发送多少数据(如何知道这个缓存大小?稍后给概念)。
   这样,TCP接收端的接收缓存才不至于缓冲溢出。 
8. 提供可靠性的方法之一:ACK确认?
   这里还不敢提序号、确认号、延时ACK等乱七八糟的东西。我只能告诉你,当TCP发送某些数据给TCP接收方时,TCP接收方会发回一个确认报文。TCP发送方收到这个确认报文后,就可以确认刚才发送的数据包成功到达。为什么这个确认报文叫ACK确认(貌似是我临时给的概念:D)?再翻到TCP包头结构那张图,ACK是TCP包头中的1bit标志位,如同SYN、PSH、RST之类的标志一样,这些标志都有一个专有的用途。当ACK标志位被设置为1  时,我就称其为ACK确认标志,因为ACK就是用于确认报文段的。 
   在上面所说的窗口大小中,我提到,发送方如何知道接收方的接收缓存大小呢?这也是通过确认报文段实现:当接收方接收到数据后,发送ACK确认数据包给发送方,就设置包头中的窗口域。 
9. 提供可靠性的方法之二:各种定时器
   TCP中会设置很多计时器,这些定时器大多用于超时重传(老半天得不到回应,所以重传数据)。 
10.什么是全双工?
   全双工就是你可以同时在一个TCP连接上进行数据的发送和接收。这种双工特性也促使了关闭TCP连接时的四次握手。 
11.TODO : more concepts...

这里我尽量简单地介绍一些TCP中的概念,希望可以让你有概括性的了解。预计下一节我会讲讲建立TCP连接的相关细节。除了Stevens的,我推荐,据说是另一部TCP的权威之作。


smarteng 发布于 2009-7-23 00:19

调整swap分区大小

方法一:使用分区作为swap
1.  使用fdisk 命令把/sdd1 分区转换为swap分区
# fdisk /dev/sdd1   t -》82 -》w
2.  格式化分区
#mkswap /dev/sdd1
3.  在/etc/fstab 中加载分区
/dev/sdd1     swap    swap   defaults 0 0
4.  启用交换分区
#Swapon –a
5. 检查swap情况
#swapon –s

方法二:可以用一个文件做交换分区.[break]
1、建立swap文件,比如在/tmp下建立swapfree作为交换文件。建立
#dd if=/dev/zero of=swapfree bs=32k count=8192
(bs=32k指定每个扇区占用32kb,读入了8192+0个区段,输出了8192+0个区段)
注意:bs参数的目的在于指定每次读取及输入多少个bytes;由于磁盘存取的最小单位为扇区,因此设置bs也等于设置每个扇区的大小;而count的目的则在指定可以使用多少个扇区.因此,可以使用的硬盘空间就等于bs*count.以上范例为例,可以使用的硬盘空间等于32*8192=262144 (KB),亦等于256MB. )
执行上述命令后,会在/tmp目录中创建一个256MB的swapfree的文件
2、格式华及启动swap文件
接下来执行mkswap命令,将myswap文件格式化成s文件系统,系统才能使用,切换到/tmp目录,并执行以下命令:
# mkswap swapfree (#将文件格式化为swap文件格式)
setting up swapspace version 1 , size = 262144 KB
# swapon /tmp/swapfree (#启动swap分区)
要停止使用新创建的swap文件,只要执行 swapoff /tmp/swapfree命令即可,如果swap交换文件不再使用,可以删除此文件。
3、检查swap
     #swapon -s
4、 开机时自动启动新添加的swap分区
如果每次开机后都要执行swapon命令启动swap分区或者文件,这太麻烦了.这时可以利用文字编辑器在/etc/fstab文件加一行,好让开机时自动启动swap分区及文件:
/dec/hdb5 swap swap defaults 0 0 (开机时启动此swap分区)
/tmp/swapfree swap swap defaults 0 0 (开机时启动此swap文件) .
swap空间大小:
通常情况下,Swap空间应大于或等于物理内存的大小,最小不应小于64M,通常Swap空间的大小应是物理内存的2-2.5倍。但根据不同的应用,应有不同的配置:如果是小的桌面系统,则只需要较小的Swap空间,而大的服务器系统则视情况不同需要不同大小的Swap空间。特别是数据库服务器和Web服务器,随着访问量的增加,对Swap空间的要求也会增加,具体配置参见各服务器产品的说明。
swap数量:
Swap分区的数量对性能也有很大的影响。因为Swap交换的操作是磁盘IO的操作,如果有多个Swap交换区,Swap空间的分配会以轮流的方式操作于所有的Swap,这样会大大均衡IO的负载,加快Swap交换的速度。如果只有一个交换区,所有的交换操作会使交换区变得很忙,使系统大多数时间处于等待状态,效率很低。用性能监视工具就会发现,此时的CPU并不很忙,而系统却慢。这说明,瓶颈在IO上,依靠提高CPU的速度是解决不了问题的。
 


smarteng 发布于 2009-7-22 01:01

戒指的带法

  戴戒指是有讲究的。按西方的传统习惯来说,左手显示的是上帝赐给你的运气,因此,戒指通常戴在左手上。  国际上比较流行的戴法是:食指———想结婚,表示未婚;中指———已经在恋爱中;无名指———表示已经订婚或结婚;小指———表示独身。 


smarteng 发布于 2009-7-21 06:30

include() require() include_once() require_once()区别

require() 语句包含并运行指定文件。

include() 语句包含并运行指定文件。

require()include() 除了怎样处理失败之外在各方面都完全一样。

include() 产生一个警告而 require() 则导致一个致命错误。

换句话说,如果想在丢失文件时停止处理页面,那就别犹豫了,用 require() 吧。

include() 就不是这样,脚本会继续运行。同时也要确认设置了合适的include_path。[break]

寻找包含文件的顺序先是在当前工作目录的相对的 include_path 下寻找,然后是当前运行脚本所在目录相对的 include_path 下寻找。例如 include_path 是 .,当前工作目录是 /www/,脚本中要 include 一个 include/a.php 并且在该文件中有一句 include "b.php",则寻找 b.php 的顺序先是 /www/,然后是 /www/include/。如果文件名以 ./ 或者 ../ 开始,则只在当前工作目录相对的 include_path 下寻找。

当一个文件被包含时,其中所包含的代码继承了 include 所在行的变量范围。从该处开始,调用文件在该行处可用的任何变量在被调用的文件中也都可用。不过所有在包含文件中定义的函数和类都具有全局作用域。

例:基本的include()例子

vars.php
<?php

$color
= 'green'
;
$fruit = 'apple'
;

?>

test.php
<?php

echo "A $color $fruit";
// A

include 'vars.php'
;

echo
"A $color $fruit";
// A green apple

?>

如果 include 出现于调用文件中的一个函数里,则被调用的文件中所包含的所有代码将表现得如同它们是在该函数内部定义的一样。所以它将遵循该函数的变量范围。

例: 函数中的包含

<?php

function foo
()
{
global
$color
;

include
'vars.php'
;

echo
"A $color $fruit"
;
}



foo();
// A green apple
echo "A $color $fruit";
// A green

?>

当一个文件被包含时,语法解析器在目标文件的开头脱离 PHP 模式并进入 HTML 模式,到文件结尾处恢复。由于此原因,目标文件中应被当作 PHP 代码执行的任何代码都必须被包括在有效的 PHP 起始和结束标记之中。

例:通过 HTTP 进行的 include()

<?php



// Won't work; file.txt wasn't handled by www.example.com as PHP
include 'http://www.example.com/file.txt?foo=1&bar=2'
;

// Won't work; looks for a file named 'file.php?foo=1&bar=2' on the
// local filesystem.
include 'file.php?foo=1&bar=2'
;

// Works.
include 'http://www.example.com/file.php?foo=1&bar=2'
;

$foo = 1
;
$bar = 2
;
include
'file.txt';
// Works.
include 'file.php';
// Works.

?>

安全警告:

远程文件可能会经远程服务器处理(根据文件后缀以及远程服务器是否在运行 PHP 而定),但必须产生出一个合法的 PHP 脚本,因为其将被本地服务器处理。如果来自远程服务器的文件应该在远端运行而只输出结果,那用 readfile() 函数更好。另外还要格外小心以确保远程的脚本产生出合法并且是所需的代码。


require_once() 语句在脚本执行期间包含并运行指定文件。此行为和 require() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。

require_once() 应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

include_once() 语句在脚本执行期间包含并运行指定文件。此行为和 include() 语句类似,唯一区别是如果该文件中的代码已经被包含了,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。

include_once() 应该用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。

注意: 要注意 include_once()require_once() 在大小写不敏感的操作系统中(例如 Windows)的行为可能不是所期望的。

 


smarteng 发布于 2009-7-21 05:26

vim使用技巧

读本文之前请注意:
            1. 本文的目标是提供一些vim的使用技巧,利用这些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用,但是现在基本上都是用vim了。
            2. 本文是整理和总结使用技巧,而非讲解vim入门,因此不会涉及最基本的使用,例如如何上移或下移光标,对此类操作请参阅任何一本vim或者vi教程。
            3. 本文阅读对象是了解了vim的基本操作,而希望高效地利用vim进行工作的人。熟练使用vim的人自然不必细读,如果能留下您的宝贵意见,本人将感激不尽。
            4. 本文由本人搜集整理,转载请注明出处[break]
             
            本文一般情况下用(里边的字母一般大小写无所谓,除非特别注明)表示按住ctrl同时按下相关字母,命令前加一个i表示在插入模式下用这个命令
            
            1. 选定文字 / 拷贝粘贴
            
            v为可视模式,可以选定多行。选定多行之后,可以用yy或者dd等等进行拷贝和剪切。
            p 是粘贴
            y 和d 可以直接拷贝或者剪切选定的内容
            yw是拷贝一个单词
            如果要复制整行的最简单办法就是V,y,p 就行了
            v是可以选定一行任意个字符的,V是行选定的,一次一整行,然后通过向下或向上移动光标而选定多行。
            对于v选定的,拷贝后就是这么多,选多少就拷贝多少,而V选定的,粘贴的话会自动换到下一行
            命令模式下,也是块选定,不过是列块选定
            
            2. 折叠代码
            
            可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)
            
            3. 缩进代码
            
            是右缩进
            按v选定后按=就是自动格式化代码,自动缩进,内部的递归的缩进都做到了
            行左移>,该命令用于调整源码缩进格式简便快速。
            
            4. 移动光标
            
            %是从大括号的开始移动到大括号的结束位置
            :后边加行号就是跳到这一行
                光标返回到以前的位置。相当于光标移动的“撤销”
                光标返回到后来的位置。相当于光标移动的“恢复”
            
            5. 多文件编辑 / 缓冲区命令
            
            vim下每一个打开的文件对应一个缓冲区(buffer)。
            多文件编辑会有两种情形,一种是在进入 vim 前所用的参数就是多个文件(这种情形称为 argument list)。另一种情形是进入 vim 后另外再开其它的文件(称为 buffer list)。不过都可以统称为buffer。
            
            5.1 打开文件
            vi flname1 flname2… flnameN
            将多个文件调入缓冲,是 argument list。
            :e filename
            这是在进入 vim 后,在不离开 vim 的情形下再开其它文件,只要您要编辑的档案是在目前目录,Tab 补全键还是可以使用。是buffer list。
            注意::e 或者:new 或者:split 后边可以跟目录,这样就可以在目录下慢慢找要打开的文件了
            
            5.2 缓冲区跳转
            :n   编辑下一个文件。
            :2n 编辑下二个文件。
            :N   编辑前一个文件。注意,这种用法只能用于 argument list 的情形。
            :rew 回到首文件
            :args 查看当前编辑缓冲文件状态
            :e# 或 Ctrl-^   编辑前一个档案,用于两文件互相编辑时相当好用。这种用法不管是 argument list 或buffer list 档案间皆可使用。 使用Ctrl-^ 命令更便捷,但如终端类型不正确该功能将无效。
            用:ls来显示缓冲区中的文件,编号后边有#的代表是前一个文件,可以通过:e#来进入,有%a的代表是当前文件,什么也没有的可以通过:bn来进入,这里的n代表文件编号。
            :b文件名或编号   移至该文件。
            在 :ls 中就会出示各文件的编号,这个编号在未离开 vim 前是不会变的。这个指令 elvis 也是可以使用。当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。
            在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,不必担心,载入相当快速的。加号 + 表示这个 buffer 已经修改过了。
            :bn   buffer next。这里的n代表字母n
            :bl   buffer last。
            以上两个指令 elvis 不适用。
            如果您是使用 vim 的 GUI,那就在菜单上就会有 Buffers 这个选项,可以很容易的知道及移动各buffer 间。
            
            5.3 移除缓冲区
            :bd(elete)   buffer 在未离开 vim 前是不会移除的,可使用这个指令移除。其实移除它干什么呢?vim是您在叫用时才会载入的,因此这些 buffers 并不是像 cache 一般要占内存的。
            
            5.4 重新编辑
            放弃一修改过的文件,重新编辑。
            (1)使用命令 :q!强行退出后再vi flname重新进入。
            (2)使用命令 :e!强行重编辑更便捷。这样也是会打开文件,但会放弃目前编辑文件的改变,否则如果文件已有变动,vim 预设是不让您随便离开的。:e! 后不接什么的话,代表舍弃一切修改,重新载入编辑中文件。
            
            5.5 其他命令
            :files 或 :buffers 或 :ls   会列出目前 buffer 中的所有文件。
            在 elvis 中可使用 :b 来叫出 buffers。
            :f 或 Ctrl-g   显示目前编辑的文件名、是否经过修改及目前光标所在之位置。
            :f 文件名   改变编辑中的文件名。(file)
            :r 文件名   在光标所在处插入一个文件的内容。(read)
            :35 r 文件名   将文件插入至 35 行之后。
            gf   这是 vim 的特殊打开文件的方法,会打开光标所在处的 word 为名的文件,当然,这个文件要在当前目录内,否则会创建新文件。
            
            6. 查找命令
            
            用/查找单词后,n可以跳到下一个,N则是上一个,:nohls可以取消高亮
            查找时,:set ignorecase”项让VIM忽略大小写,“:set noignorecase” 来关闭这项功能。
            
            7. 修改文字
            
            cw:删除一个单词并进入插入模式,cc:删除一行并进入插入模式。
            r:然后输入的字母将替换当前字母并保持命令模式,R则是不停的替换(一个挨着一个)。
            0到行首,$到行尾。
            
            8. 函数间跳转
            
            ctrl+]和ctrl+T分别是查找函数的定义和返回,好像需要ctag的支持
            i   跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个i,最好是找自己项目下的文件,否则找库函数的话还不如man.
            大写 K        看光标所指标识符的 man 帮助页
            
            9. 窗口命令
            
             = ctrl+w
            :split 文件名 同时在一个页面显示多个文件的内容,类似多窗口,用切换当前窗口
            f   切分显示光标在处的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #include 语句中的文件
            _   当同时打开几个文件时,按 _ 使当前窗口最大化
            用Ctrl-W命令指定光标移动:
                  Ctrl-W +       扩大窗口
                  Ctrl-W -       缩小窗口
                  Ctrl-W h       移动到窗口左边
                  Ctrl-W j       移动到窗口下边
                  Ctrl-W k       移动到窗口上边
                  Ctrl-W l       移动到窗口右边
            等于是按下后,松开键盘,再按下一个命令就可以了.
            如果要关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。
            多窗口是split,像用e打开多个文件是将文件放在缓冲区中。
            
            10. 自动完成
            
            i   向上搜索,补全一个词
            i   向下搜索,补全一个词
            i 补全一行。
比如你写过一行 for (int i = 0; i 即可。如果补全出来的不是你想要的那一行,你可以按  或
选择上一个或下一个匹配行i   在文件系统中搜索,补全一个文件名
            如果按  或  补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件,而文件的位置将在 path 中搜索。
            i   把上一行对应列的字符抄下来
            i   把下一行对应列的字符抄上来,这两个都可以一直按下去,到了行尾自己会停的.
            
            11. 注释整块内容
            
            注释块的方法:
             选定要注释掉的行   I   //   Esc
            I之后输入的东西就是插入到选定的行前边的,直至Esc.
            要去掉注释的办法:选定注释符//,然后d
            列块选定后I是在前边都插入,A是在后边都插入
            是按列块模式的选定,是行选定,v是普通选定
            
            12. 其他命令
            
            u可以撤销上一步操作, ctrl+r可以恢复
            i命令执行一个普通模式的命令,执行完毕后回到插入模式,不用多次Esc
            i后续字符   输入特殊的 ASCII 字符或键。
            .        在光标当前位置处重复上一次操作
            :!命令行         执行一条外部命令
***********************************************************************************
我是 vim 粉丝, 用了许久, 有一些自己的感受, 又到处挖到一些别人的技巧. 感觉对 vim 粉丝比较有用, 就把它记在这儿. 希望借此文套出大家自己的巧活, 就正应了抛砖引玉的古话了.
先稍为介绍一下 vim. vi 是 unix/linux 下极为普遍的一种文本编辑器, 大部分机器上都有. vi 有各种变种,
在不同的机器上常用不同的变种软件. 其中 vim 比较好用也用得比较广泛. vim 是 Vi IMproved 的缩写, 表示更好的 vi.
我个人觉得它是非常好的编辑器(为了避免 Emacs 粉丝挑眼, 就不说最好了). 没用过的也建议试试看, 当然 vim
对编写文本文件很方便好用, 比如编写程序, html文档等等, 却不能用来编写 word 文档.
关于 vim 的安装, 基本使用方法等网络上能搜出许多, 就不在这里罗嗦了, 要是对 vim 有兴趣, 那就看看这里(中文文档):
http://vcd.gro.clinux.org/
本文就说些其中比较有用, 比较常用的命令, 若能熟练运用这些命令, 那么会发现编辑文件很舒服.
说明:
以下的例子中 xxx 表示在命令模式下输入 xxx 并回车
以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车
小括号中的命令表示相关命令.
在编辑模式或可视模式下输入的命令会另外注明.
1. 查找
   /xxx(?xxx)       表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
                   向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.
                   一般来说是区分大小写的, 要想不区分大小写, 那得先输入
                   :set ignorecase
                   查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
   *(#)             当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
                   下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
                   向查找.
   g*(g#)           此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
                   是匹配包含该单词的所有字符串.
   gd               本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
                   注释段中第一次出现这个单词的地方.
   %                本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
   f(F)x            本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.
                   找到后:
                   输入 ; 表示继续往下找
                   输入 , 表示反方向查找
2. 快速移动光标
    在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定
位和编辑. 因此能更快一点移动光标是很有用的.
   w(e)             移动光标到下一个单词.
   b                移动光标到上一个单词.
   0                移动光标到本行最开头.
   ^                移动光标到本行最开头的字符处.
   $                移动光标到本行结尾处.
   H                移动光标到屏幕的首行.
   M                移动光标到屏幕的中间一行.
   L                移动光标到屏幕的尾行.
   gg               移动光标到文档首行.
   G                移动光标到文档尾行.
   c-f              (即 ctrl 键与 f 键一同按下) 本命令即 page down.
   c-b              (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up.
   ''               此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
                   找到某个单词后, 再输入此命令则回到上次停留的位置.
   '.               此命令相当好使, 它移动光标到上一次的修改行.
   `.               此命令相当强大, 它移动光标到上一次的修改点.
3. 拷贝, 删除与粘贴
    在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.
   yw               表示拷贝从当前光标到光标所在单词结尾的内容.
   dw               表示删除从当前光标到光标所在单词结尾的内容.
   y0               表示拷贝从当前光标到光标所在行首的内容.
   d0               表示删除从当前光标到光标所在行首的内容.
   y$               表示拷贝从当前光标到光标所在行尾的内容.
   d$               表示删除从当前光标到光标所在行尾的内容.
   yfa              表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
   dfa              表示删除从当前光标到光标后面的第一个a字符之间的内容.
   特殊地:
   yy               表示拷贝光标所在行.
   dd               表示删除光标所在行.
   D                表示删除从当前光标到光标所在行尾的内容.
   关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.
4. 数字与命令
    在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:
   5fx              表示查找光标后第 5 个 x 字符.
   5w(e)            移动光标到下五个单词.
   5yy              表示拷贝光标以下 5 行.
   5dd              表示删除光标以下 5 行.
   y2fa             表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
   :12,24y          表示拷贝第12行到第24行之间的内容.
   :12,y            表示拷贝第12行到光标所在行之间的内容.
   :,24y            表示拷贝光标所在行到第24行之间的内容. 删除类似.
5. 快速输入字符
    在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符.
    使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来. 这就是著名的命令
补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.
   c-p(c-n)         在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
                   索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
                   会在所有在这个 vim 程序中打开的文件中进行匹配.
   c-x-l            在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
                   文档中进行匹配.
   c-x-f            在编辑模式中, 这个命令表示补齐文件名. 如输入:
                   /usr/local/tom 后再输入此命令则它会自动匹配出:
                   /usr/local/tomcat/
   abbr             即缩写. 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
                   字符串. 比如编写java文件的常常输入 System.out.println, 这很
                   是麻烦, 所以应该用缩写来减少敲字. 可以这么做:
                   :abbr sprt System.out.println
                   以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.
                   out.println
6. 替换
    替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.
   :s/aa/bb/g       将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :s/\/bb/g   将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
   :%s/aa/bb/g      将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/^/#/     将从12行到23行的行首加入 # 字符
   :%s= *$==        将所有行尾多余的空格删除
   :g/^\s*$/d        将所有不包含字符(空格也不包含)的空行删除.
7. 多文件编辑
    在一个 vim 程序中打开很多文件进行编辑是挺方便的.
   :sp(:vsp) 文件名     vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
                       从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
                       把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
                       开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
                       到帮助信息.
   :e 文件名            vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
   c-w-w                vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
                       到各个窗口之中.
   :ls                  此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
                       会显示出如下数据:
                       1    %a       "usevim.html"          行 162
                       2    #        "xxxxxx.html"          行 0
                       其中:
                       1                表示打开的文件序号, 这个序号很有用处.
                       %a               表示文件代号, % 表示当前编辑的文件,
                                       # 表示上次编辑的文件
                       "usevim.html"    表示文件名.
                       行 162           表示光标位置.
   :b 序号(代号)        此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
                       就是用 :ls 命令看到的.
   :set diff            此命令用于比较两个文件, 可以用
                       :vsp filename
                       命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
                       到效果了.
8. 宏替换
    vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,
因此我把它们定义到 - 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
   :nmap  :nohls               取消被搜索字串的高亮
   :nmap  w                   命令模式下转移光标到不同窗口
   :imap                  输入模式下运行
   :nmap  :%s= *$==           删除所有行尾多余的空格.
   :imap                同上
   :java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
             会说到如何实现这一点)
   :nmap  :comp javac:mak -d . %
        此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
        义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
           setlocal makeprg=javac
           setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
   :nmap  :comp ant:mak
        此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
        vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
        在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
   :nmap  :cl                  此命令用于查看所有的编译错误.
   :imap  
   :nmap  :cc                  此命令用于查看当前的编译错误.
   :imap  
   :nmap  :cn                  此命令用于跳到下一个出错位置.
   :imap  
   :nmap  :cp                  此命令用于跳到上一个出错位置.
   :imap  
   :nmap  :JavaBrowser
        此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
        本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
        在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.
   :imap  
9. TAB
    TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
    >                   输入此命令则光标所在行向右移动一个 tab.
    5>>                  输入此命令则光标后 5 行向右移动一个 tab.
    :12,24>              此命令将12行到14行的数据都向右移动一个 tab.
    :12,24>>             此命令将12行到14行的数据都向右移动两个 tab.
    那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
    有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
    帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.
    :set shiftwidth=4    设置自动缩进 4 个空格, 当然要设自动缩进先.
    :set sts=4           即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
    :set tabstop=4       实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
    :set expandtab       在输入 tab 后, vim 用恰当的空格来填充这个 tab.
10. autocmd
     这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置; 可以
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件
里面. 由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.
   :autocmd!                删除所有之前的自动命令.
   autocmd FileType         java   source ~/.vim/files/java.vim
   autocmd FileType         java   source ~/.vim/files/jcommenter.vim
     以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.
   autocmd BufNewFile       *.java   0r ~/.vim/files/skeletons/java.skel
     以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
   autocmd BufNewFile       *.java   normal gnp
     以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
     处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
11. 常用脚本
     在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.
我常用的有:
     jcommenter.vim         自动加入 javadoc 风格的注释.
     JBrowser.vim           类资源浏览. C, C++ 等可以用 Tlist
     还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
     反编译 .class 文件等等.
12. 常用配置
     在~/.vimrc 配置文件中你常常需要一些个性化配置. 比如上面写的一些宏定义, 一些
autocmd 定义等等. 比如:
     set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
         这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.
     set nu           显示行号
     set ai           设置自动缩进
     map Y y$         让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.
13. 其他
     还有许多有意思的命令, 记录在这里免得忘记.
     .                                                重复上次编辑命令.
     :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)    在行首插入行号
     :runtime! syntax/2html.vim                       转换 txt 成 html, 会按照你的颜色配置来转


smarteng 发布于 2009-7-15 08:16

两篇很牛的vim使用技巧

读本文之前请注意:
1. 本文的目标是提供一些vim的使用技巧,利用这些技巧可以提高vim的操作效率。部分技巧在vi上也可以使用,但是现在基本上都是用vim了。
2. 本文是整理和总结使用技巧,而非讲解vim入门,因此不会涉及最基本的使用,例如如何上移或下移光标,对此类操作请参阅任何一本vim或者vi教程。
3. 本文阅读对象是了解了vim的基本操作,而希望高效地利用vim进行工作的人。熟练使用vim的人自然不必细读,如果能留下您的宝贵意见,本人将感激不尽。
4. 本文由本人搜集整理,转载请注明出处[break]

本文一般情况下用(里边的字母一般大小写无所谓,除非特别注明)表示按住ctrl同时按下相关字母,命令前加一个i表示在插入模式下用这个命令

1. 选定文字 / 拷贝粘贴

v为可视模式,可以选定多行。选定多行之后,可以用yy或者dd等等进行拷贝和剪切。
p 是粘贴
y 和d 可以直接拷贝或者剪切选定的内容
yw是拷贝一个单词
如果要复制整行的最简单办法就是V,y,p 就行了
v是可以选定一行任意个字符的,V是行选定的,一次一整行,然后通过向下或向上移动光标而选定多行。
对于v选定的,拷贝后就是这么多,选多少就拷贝多少,而V选定的,粘贴的话会自动换到下一行
命令模式下,也是块选定,不过是列块选定

2. 折叠代码

可以zf进行折叠, 用zo打开折叠,也可以方向键向右打开折叠,zc 关闭折叠(只要在被折叠的块中的任一个语句就行)
3. 缩进代码
是右缩进
按v选定后按=就是自动格式化代码,自动缩进,内部的递归的缩进都做到了
行左移>,该命令用于调整源码缩进格式简便快速。
4. 移动光标

%是从大括号的开始移动到大括号的结束位置
:后边加行号就是跳到这一行
    光标返回到以前的位置。相当于光标移动的“撤销”
    光标返回到后来的位置。相当于光标移动的“恢复”
5. 多文件编辑 / 缓冲区命令
vim下每一个打开的文件对应一个缓冲区(buffer)。
多文件编辑会有两种情形,一种是在进入 vim 前所用的参数就是多个文件(这种情形称为 argument list)。另一种情形是进入 vim 后另外再开其它的文件(称为 buffer list)。不过都可以统称为buffer。

5.1 打开文件
vi flname1 flname2… flnameN
将多个文件调入缓冲,是 argument list。
:e filename
这是在进入 vim 后,在不离开 vim 的情形下再开其它文件,只要您要编辑的档案是在目前目录,Tab 补全键还是可以使用。是buffer list。
注意::e 或者:new 或者:split 后边可以跟目录,这样就可以在目录下慢慢找要打开的文件了
5.2 缓冲区跳转
:n   编辑下一个文件。
:2n 编辑下二个文件。
:N   编辑前一个文件。注意,这种用法只能用于 argument list 的情形。
:rew 回到首文件
:args 查看当前编辑缓冲文件状态
:e# 或 Ctrl-^   编辑前一个档案,用于两文件互相编辑时相当好用。这种用法不管是 argument list 或buffer list 档案间皆可使用。 使用Ctrl-^ 命令更便捷,但如终端类型不正确该功能将无效。
用:ls来显示缓冲区中的文件,编号后边有#的代表是前一个文件,可以通过:e#来进入,有%a的代表是当前文件,什么也没有的可以通过:bn来进入,这里的n代表文件编号。
:b文件名或编号   移至该文件。
在 :ls 中就会出示各文件的编号,这个编号在未离开 vim 前是不会变的。这个指令 elvis 也是可以使用。当然 :e#编号 也是可以的,这样的用法则是所有 vi clone 都通用了。
在 buffers 中,减号 - 表示这个 buffer 并未载入,不过,不必担心,载入相当快速的。加号 + 表示这个 buffer 已经修改过了。
:bn   buffer next。这里的n代表字母n
:bl   buffer last。
以上两个指令 elvis 不适用。
如果您是使用 vim 的 GUI,那就在菜单上就会有 Buffers 这个选项,可以很容易的知道及移动各buffer 间。

5.3 移除缓冲区
:bd(elete)   buffer 在未离开 vim 前是不会移除的,可使用这个指令移除。其实移除它干什么呢?vim是您在叫用时才会载入的,因此这些 buffers 并不是像 cache 一般要占内存的。
5.4 重新编辑
放弃一修改过的文件,重新编辑。
(1)使用命令 :q!强行退出后再vi flname重新进入。
(2)使用命令 :e!强行重编辑更便捷。这样也是会打开文件,但会放弃目前编辑文件的改变,否则如果文件已有变动,vim 预设是不让您随便离开的。:e! 后不接什么的话,代表舍弃一切修改,重新载入编辑中文件。

5.5 其他命令
:files 或 :buffers 或 :ls   会列出目前 buffer 中的所有文件。
在 elvis 中可使用 :b 来叫出 buffers。
:f 或 Ctrl-g   显示目前编辑的文件名、是否经过修改及目前光标所在之位置。
:f 文件名   改变编辑中的文件名。(file)
:r 文件名   在光标所在处插入一个文件的内容。(read)
:35 r 文件名   将文件插入至 35 行之后。
gf   这是 vim 的特殊打开文件的方法,会打开光标所在处的 word 为名的文件,当然,这个文件要在当前目录内,否则会创建新文件。

6. 查找命令

用/查找单词后,n可以跳到下一个,N则是上一个,:nohls可以取消高亮
查找时,:set ignorecase”项让VIM忽略大小写,“:set noignorecase” 来关闭这项功能。

7. 修改文字

cw:删除一个单词并进入插入模式,cc:删除一行并进入插入模式。
r:然后输入的字母将替换当前字母并保持命令模式,R则是不停的替换(一个挨着一个)。
0到行首,$到行尾。

8. 函数间跳转
ctrl+]和ctrl+T分别是查找函数的定义和返回,好像需要ctag的支持
i   跳转到光标所指标识符的定义行,是打开一个新的小窗口显示,记住要加个i,最好是找自己项目下的文件,否则找库函数的话还不如man.
大写 K        看光标所指标识符的 man 帮助页
9. 窗口命令
= ctrl+w
:split 文件名 同时在一个页面显示多个文件的内容,类似多窗口,用切换当前窗口
f   切分显示光标在处的文件名,VIM 会在 path 中搜索该文件名,比如常用它打开 #include 语句中的文件
_   当同时打开几个文件时,按 _ 使当前窗口最大化
用Ctrl-W命令指定光标移动:
      Ctrl-W +       扩大窗口
      Ctrl-W -       缩小窗口
      Ctrl-W h       移动到窗口左边
      Ctrl-W j       移动到窗口下边
      Ctrl-W k       移动到窗口上边
      Ctrl-W l       移动到窗口右边
等于是按下后,松开键盘,再按下一个命令就可以了.
如果要关闭分割窗口可以用:close,剩下只有一个窗口的话就不能关了。
多窗口是split,像用e打开多个文件是将文件放在缓冲区中。
10. 自动完成

i   向上搜索,补全一个词
i   向下搜索,补全一个词
i 补全一行。
比如你写过一行 for (int i = 0; i 即可。如果补全出来的不是你想要的那一行,你可以按  或  选择上一个或下一个匹配行i   在文件系统中搜索,补全一个文件名
如果按  或  补全一个词,在当前文件中没有找到匹配,VIM 将搜索 #include 语句中的文件,而文件的位置将在 path 中搜索。
i   把上一行对应列的字符抄下来
i   把下一行对应列的字符抄上来,这两个都可以一直按下去,到了行尾自己会停的.
11. 注释整块内容

注释块的方法:
选定要注释掉的行   I   //   Esc
I之后输入的东西就是插入到选定的行前边的,直至Esc.
要去掉注释的办法:选定注释符//,然后d
列块选定后I是在前边都插入,A是在后边都插入
是按列块模式的选定,是行选定,v是普通选定

12. 其他命令

u可以撤销上一步操作, ctrl+r可以恢复
i命令执行一个普通模式的命令,执行完毕后回到插入模式,不用多次Esc
i后续字符   输入特殊的 ASCII 字符或键。
.        在光标当前位置处重复上一次操作
:!命令行         执行一条外部命令
***********************************************************************************
我是 vim 粉丝, 用了许久, 有一些自己的感受, 又到处挖到一些别人的技巧. 感觉对 vim 粉丝比较有用, 就把它记在这儿. 希望借此文套出大家自己的巧活, 就正应了抛砖引玉的古话了.
先稍为介绍一下 vim. vi 是 unix/linux 下极为普遍的一种文本编辑器, 大部分机器上都有. vi 有各种变种, 在不同的机器上常用不同的变种软件. 其中 vim 比较好用也用得比较广泛. vim 是 Vi IMproved 的缩写, 表示更好的 vi. 我个人觉得它是非常好的编辑器(为了避免 Emacs 粉丝挑眼, 就不说最好了). 没用过的也建议试试看, 当然 vim 对编写文本文件很方便好用, 比如编写程序, html文档等等, 却不能用来编写 word 文档.
关于 vim 的安装, 基本使用方法等网络上能搜出许多, 就不在这里罗嗦了, 要是对 vim 有兴趣, 那就看看这里(中文文档):
http://vcd.gro.clinux.org/
本文就说些其中比较有用, 比较常用的命令, 若能熟练运用这些命令, 那么会发现编辑文件很舒服.
说明:
以下的例子中 xxx 表示在命令模式下输入 xxx 并回车
以下的例子中 :xxx 表示在扩展模式下输入 xxx 并回车
小括号中的命令表示相关命令.
在编辑模式或可视模式下输入的命令会另外注明.
1. 查找
   /xxx(?xxx)       表示在整篇文档中搜索匹配xxx的字符串, / 表示向下查找, ? 表示
                   向上查找.其中xxx可以是正规表达式,关于正规式就不多说了.
                   一般来说是区分大小写的, 要想不区分大小写, 那得先输入
                   :set ignorecase
                   查找到以后, 再输入 n 查找下一个匹配处, 输入 N 反方向查找.
   *(#)             当光标停留在某个单词上时, 输入这条命令表示查找与该单词匹配的
                   下(上)一个单词. 同样, 再输入 n 查找下一个匹配处, 输入 N 反方
                   向查找.
   g*(g#)           此命令与上条命令相似, 只不过它不完全匹配光标所在处的单词, 而
                   是匹配包含该单词的所有字符串.
   gd               本命令查找与光标所在单词相匹配的单词, 并将光标停留在文档的非
                   注释段中第一次出现这个单词的地方.
   %                本命令查找与光标所在处相匹配的反括号, 包括 () [] {}
   f(F)x            本命令表示在光标所在行进行查找, 查找光标右(左)方第一个x字符.
                   找到后:
                   输入 ; 表示继续往下找
                   输入 , 表示反方向查找
2. 快速移动光标
    在 vi 中, 移动光标和编辑是两件事, 正因为区分开来, 所以可以很方便的进行光标定
位和编辑. 因此能更快一点移动光标是很有用的.
   w(e)             移动光标到下一个单词.
   b                移动光标到上一个单词.
   0                移动光标到本行最开头.
   ^                移动光标到本行最开头的字符处.
   $                移动光标到本行结尾处.
   H                移动光标到屏幕的首行.
   M                移动光标到屏幕的中间一行.
   L                移动光标到屏幕的尾行.
   gg               移动光标到文档首行.
   G                移动光标到文档尾行.
   c-f              (即 ctrl 键与 f 键一同按下) 本命令即 page down.
   c-b              (即 ctrl 键与 b 键一同按下, 后同) 本命令即 page up.
   ''               此命令相当有用, 它移动光标到上一个标记处, 比如用 gd, * 等查
                   找到某个单词后, 再输入此命令则回到上次停留的位置.
   '.               此命令相当好使, 它移动光标到上一次的修改行.
   `.               此命令相当强大, 它移动光标到上一次的修改点.
3. 拷贝, 删除与粘贴
    在 vi 中 y 表示拷贝, d 表示删除, p 表示粘贴. 其中拷贝与删除是与光标移动命令
结合的, 看几个例子就能够明白了.
   yw               表示拷贝从当前光标到光标所在单词结尾的内容.
   dw               表示删除从当前光标到光标所在单词结尾的内容.
   y0               表示拷贝从当前光标到光标所在行首的内容.
   d0               表示删除从当前光标到光标所在行首的内容.
   y$               表示拷贝从当前光标到光标所在行尾的内容.
   d$               表示删除从当前光标到光标所在行尾的内容.
   yfa              表示拷贝从当前光标到光标后面的第一个a字符之间的内容.
   dfa              表示删除从当前光标到光标后面的第一个a字符之间的内容.
   特殊地:
   yy               表示拷贝光标所在行.
   dd               表示删除光标所在行.
   D                表示删除从当前光标到光标所在行尾的内容.
   关于拷贝, 删除和粘贴的复杂用法与寄存器有关, 可以自行查询.
4. 数字与命令
    在 vi 中数字与命令结合往往表示重复进行此命令, 若在扩展模式的开头出现则表示行
号定位. 如:
   5fx              表示查找光标后第 5 个 x 字符.
   5w(e)            移动光标到下五个单词.
   5yy              表示拷贝光标以下 5 行.
   5dd              表示删除光标以下 5 行.
   y2fa             表示拷贝从当前光标到光标后面的第二个a字符之间的内容.
   :12,24y          表示拷贝第12行到第24行之间的内容.
   :12,y            表示拷贝第12行到光标所在行之间的内容.
   :,24y            表示拷贝光标所在行到第24行之间的内容. 删除类似.
5. 快速输入字符
    在 vi 中, 不要求你输入每一个字符, 可以有很多种方法快速输入一些字符.
    使用 linux/unix 的同学一定有一个经验, 在命令行下输入命令时敲入头几个字符再按
TAB 系统就会自动将剩下的字符补齐, 假如有多个匹配则会打印出来. 这就是著名的命令
补齐(其实windows中也有文件名补齐功能). vi 中有许多的字符串补齐命令, 非常方便.
   c-p(c-n)         在编辑模式中, 输入几个字符后再输入此命令则 vi 开始向上(下)搜
                   索开头与其匹配的单词并补齐, 不断输入此命令则循环查找. 此命令
                   会在所有在这个 vim 程序中打开的文件中进行匹配.
   c-x-l            在编辑模式中, 此命令快速补齐整行内容, 但是仅在本窗口中出现的
                   文档中进行匹配.
   c-x-f            在编辑模式中, 这个命令表示补齐文件名. 如输入:
                   /usr/local/tom 后再输入此命令则它会自动匹配出:
                   /usr/local/tomcat/
   abbr             即缩写. 这是一个宏操作, 可以在编辑模式中用一个缩写代替另一个
                   字符串. 比如编写java文件的常常输入 System.out.println, 这很
                   是麻烦, 所以应该用缩写来减少敲字. 可以这么做:
                   :abbr sprt System.out.println
                   以后在输入sprt后再输入其他非字母符号, 它就会自动扩展为System.
                   out.println
6. 替换
    替换是 vi 的强项, 因为可以用正规表达式来匹配字符串.以下提供几个例子.
   :s/aa/bb/g       将光标所在行出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :s/\/bb/g   将光标所在行出现的所有 aa 替换为 bb, 仅替换 aa 这个单词
   :%s/aa/bb/g      将文档中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/aa/bb/g 将从12行到23行中出现的所有包含 aa 的字符串中的 aa 替换为 bb
   :12,23s/^/#/     将从12行到23行的行首加入 # 字符
   :%s= *$==        将所有行尾多余的空格删除
   :g/^\s*$/d        将所有不包含字符(空格也不包含)的空行删除.
7. 多文件编辑
    在一个 vim 程序中打开很多文件进行编辑是挺方便的.
   :sp(:vsp) 文件名     vim 将分割出一个横(纵)向窗口, 并在该窗口中打开新文件.
                       从 vim6.0 开始, 文件名可以是一个目录的名称, 这样, vim 会
                       把该目录打开并显示文件列表, 在文件名上按回车则在本窗口打
                       开该文件, 若输入 O 则在新窗口中打开该文件, 输入 ? 可以看
                       到帮助信息.
   :e 文件名            vim 将在原窗口中打开新的文件, 若旧文件编辑过, 会要求保存.
   c-w-w                vim 分割了好几个窗口怎么办? 输入此命令可以将光标循环定位
                       到各个窗口之中.
   :ls                  此命令查看本 vim 程序已经打开了多少个文件, 在屏幕的最下方
                       会显示出如下数据:
                       1    %a       "usevim.html"          行 162
                       2    #        "xxxxxx.html"          行 0
                       其中:
                       1                表示打开的文件序号, 这个序号很有用处.
                       %a               表示文件代号, % 表示当前编辑的文件,
                                       # 表示上次编辑的文件
                       "usevim.html"    表示文件名.
                       行 162           表示光标位置.
   :b 序号(代号)        此命令将指定序号(代号)的文件在本窗口打开, 其中的序号(代号)
                       就是用 :ls 命令看到的.
   :set diff            此命令用于比较两个文件, 可以用
                       :vsp filename
                       命令打开另一个文件, 然后在每个文件窗口中输入此命令,就能看
                       到效果了.
8. 宏替换
    vi 不仅可以用 abbr 来替换文字, 也可以进行命令的宏定义. 有些命令输起来很费劲,
因此我把它们定义到 - 上, 这样就很方便了.这些配置可以预先写到 ~/.vimrc
(windows 下为 $VIM/_vimrc) 中, 写进去的时候不用写前面的冒号.
   :nmap  :nohls               取消被搜索字串的高亮
   :nmap  w                   命令模式下转移光标到不同窗口
   :imap                  输入模式下运行
   :nmap  :%s= *$==           删除所有行尾多余的空格.
   :imap                同上
   :java 中: (注, 这里为什么说 java 中, 因为以下定义对其他文件格式不起作用, 下文
             会说到如何实现这一点)
   :nmap  :comp javac:mak -d . %
        此命令用 javac 编译 java 文件, 它会自动将光标定位到出错点. 不过这需要定
        义一个 javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有两行字:
           setlocal makeprg=javac
           setlocal errorformat=%A%f:%l:\ %m,%-Z%p^,%-C%.%#
   :nmap  :comp ant:mak
        此命令用 ant 编译 java 文件, 它会自动将光标定位到出错点. 一般来说, 安装
        vim 后已经有了compiler/ant.vim文件, 因此这个命令可以直接使用. 但是需要
        在当前目录下有 build.xml 文件, 当然还必须安装 ant 才行.
   :nmap  :cl                  此命令用于查看所有的编译错误.
   :imap  
   :nmap  :cc                  此命令用于查看当前的编译错误.
   :imap  
   :nmap  :cn                  此命令用于跳到下一个出错位置.
   :imap  
   :nmap  :cp                  此命令用于跳到上一个出错位置.
   :imap  
   :nmap  :JavaBrowser
        此命令用于在窗口左部分割出一个新窗口, 里面的内容是 java 的资源树, 包括
        本文件中出现的类, 类的成员变量及成员方法, 就好像 JCreator 表现的那样.
        在这个窗口中输入 ? 会看到帮助. 嘿嘿, 很好用, 不过需要 ctags 支持.
   :imap  
9. TAB
    TAB 就是制表符, 单独拿出来做一节是因为这个东西确实很有用.
    >                   输入此命令则光标所在行向右移动一个 tab.
    5>>                  输入此命令则光标后 5 行向右移动一个 tab.
    :12,24>              此命令将12行到14行的数据都向右移动一个 tab.
    :12,24>>             此命令将12行到14行的数据都向右移动两个 tab.
    那么如何定义 tab 的大小呢? 有人愿意使用 8 个空格位, 有人用4个, 有的用2个.
    有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 没关系, vim 能
    帮助你.以下的设置一般也都先写入配置文件中, 免得老敲.
    :set shiftwidth=4    设置自动缩进 4 个空格, 当然要设自动缩进先.
    :set sts=4           即设置 softtabstop 为 4. 输入 tab 后就跳了 4 格.
    :set tabstop=4       实际的 tab 即为 4 个空格, 而不是缺省的 8 个.
    :set expandtab       在输入 tab 后, vim 用恰当的空格来填充这个 tab.
10. autocmd
     这个命令十分的强大, 可以用这个命令实现对不同的文件格式应用不同的配置; 可以
在新建文件时自动添加上版权声明等等. 这些命令一般定义在 ~/.vimrc 这样的配置文件
里面. 由于他很强大, 所以我不能给出很具体的说明, 只能举几个例子, 详细的请看帮助.
   :autocmd!                删除所有之前的自动命令.
   autocmd FileType         java   source ~/.vim/files/java.vim
   autocmd FileType         java   source ~/.vim/files/jcommenter.vim
     以上两条命令让我在打开 java 文件时才应用后面提到的两个配置文件.
   autocmd BufNewFile       *.java   0r ~/.vim/files/skeletons/java.skel
     以上这条命令让我在新建 java 文件时自动加入 java.skel 文件的内容.
   autocmd BufNewFile       *.java   normal gnp
     以上这条命令让我在新建 java 文件时自动运行 gnp 命令, 这个命令进行一些特殊化
     处理, 比如将新 java 文件中的 __date__ 替换成今天的日期什么的.
11. 常用脚本
     在 vim.sf.net 你可以发现很多脚本(script), 这些脚本常常有让你意想不到的作用.
我常用的有:
     jcommenter.vim         自动加入 javadoc 风格的注释.
     JBrowser.vim           类资源浏览. C, C++ 等可以用 Tlist
     还有许多有用的, 比如 checkstyle.vim 可以检验你的编程风格, jad.vim 可以直接
     反编译 .class 文件等等.
12. 常用配置
     在~/.vimrc 配置文件中你常常需要一些个性化配置. 比如上面写的一些宏定义, 一些
autocmd 定义等等. 比如:
     set suffixes=.bak,~,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc
         这样在vim中打开文件时, 按 tab 键补齐文件名时它会忽略上述文件.
     set nu           显示行号
     set ai           设置自动缩进
     map Y y$         让 Y 和 D 一样, 要不然 Y 的本意和 yy 一样.
13. 其他
     还有许多有意思的命令, 记录在这里免得忘记.
     .                                                重复上次编辑命令.
     :g/^/exec "s/^/".strpart(line(".")." ", 0, 4)    在行首插入行号
     :runtime! syntax/2html.vim                       转换 txt 成 html, 会按照你的颜色配置来转


smarteng 发布于 2009-7-15 08:09

grep特殊应用

1、在当前目录及子目录下的 某种类型的文件中搜索 某个单词:

grep -r '你要搜的字符串' `find . -name "*.扩展名"`

grep -r "function"  `find . -name “*.文件类型"`

grep -r "function" `find . -name "*.php"`

2、在一个目录及其子目录下查找某种类型的文件:
find . -name "*.c"

 3、在一个目录及子目录下查找某个包含某个字符串的文件

grep "string"  *  -R


smarteng 发布于 2009-7-15 05:33

linux grep命令详解

◎语法: grep [options]
PATTERN [FILE...]
grep用以在file内文中比对相对应的部分,或是当没有指定档案时,
由标准输入中去比对。 在预设的情况下,grep会将符合样式的那一行列出。

         此外,还有两个程式是grep的变化型,egrep及fgrep。          
         其中egrep就等同於grep -E ,fgrep等同於grep -F 。

◎参数
    1. -A NUM,--after-context=NUM
               除了列出符合行之外,并且列出後NUM行。
             
         ex:   $ grep -A 1 panda file
               (从file中搜寻有panda样式的行,并显示该行的後1行) [break]
                                  
    2. -a或--text  
               grep原本是搜寻文字档,若拿二进位的档案作为搜寻的目标,
               则会显示如下的讯息: Binary file 二进位档名 matches 然後结束。
                  
               若加上-a参数则可将二进位档案视为文字档案搜寻,
               相当於--binary-files=text这个参数。
            
         ex:   (从二进位档案mv中去搜寻panda样式)
               (错误!!!)
               $ grep panda mv
               Binary file mv matches  
               (这表示此档案有match之处,详见--binary-files=TYPE )
               $
               (正确!!!)
               $ grep -a panda mv
       
    3. -B NUM,--before-context=NUM
               与 -A NUM 相对,但这此参数是显示除符合行之外
               并显示在它之前的NUM行。        
             
         ex:   (从file中搜寻有panda样式的行,并显示该行的前1行)
               $ grep -B 1 panda file

    4. -C [NUM], -NUM, --context[=NUM]  
               列出符合行之外并列出上下各NUM行,预设值是2。
             
         ex:   (列出file中除包含panda样式的行外并列出其上下2行)
               (若要改变预设值,直接改变NUM即可)
               $ grep -C[NUM] panda file
             
    5. -b, --byte-offset
               列出样式之前的内文总共有多少byte ..
              
          ex: $ grep -b panda file  
       显示结果类似於:
         0:panda
        66:pandahuang
       123:panda03
           
    6. --binary-files=TYPE
               此参数TYPE预设为binary(二进位),若以普通方式搜寻,只有2种结果:
                 1.若有符合的地方:显示Binary file 二进位档名 matches
                 2.若没有符合的地方:什麽都没有显示。
                   
               若TYPE为without-match,遇到此参数,
               grep会认为此二进位档案没有包含任何搜寻样式,与-I 参数相同。
                   
               若TPYE为text, grep会将此二进位档视为text档案,与-a 参数相同。
        
     Warning: --binary-files=text 若输出为终端机,可能会产生一些不必要的输出。
              
    7. -c, --count
       不显示符合样式行,只显示符合的总行数。
       若再加上-v,--invert-match,参数显示不符合的总行数。

    8. -d ACTION, --directories=ACTION
               若输入的档案是一个资料夹,使用ACTION去处理这个资料夹。
       预设ACTION是read(读取),也就是说此资料夹会被视为一般的档案;
       若ACTION是skip(略过),资料夹会被grep略过:
       若ACTION是recurse(递),grep会去读取资料夹下所有的档案,
       此相当於-r 参数。

    9. -E, --extended-regexp
       采用规则表示式去解释样式。
      
   10. -e PATTERN, --regexp=PATTERN
       把样式做为一个partern,通常用在避免partern用-开始。  

   11. -f FILE, --file=FILE
       事先将要搜寻的样式写入到一个档案,一行一个样式。
       然後采用档案搜寻。
       空的档案表示没有要搜寻的样式,因此也就不会有任何符合。
       
   ex: (newfile为搜寻样式档)
       $grep -f newfile file    

   12. -G, --basic-regexp
       将样式视为基本的规则表示式解释。(此为预设)

   13. -H, --with-filename
       在每个符合样式行前加上符合的档案名称,若有路径会显示路径。
       
   ex: (在file与testfile中搜寻panda样式)   
       $grep -H panda file ./testfile
                file:panda
                ./testfile:panda
                $
     
   14. -h, --no-filename  
               与-H参数相类似,但在输出时不显示路径。

   15. --help
               产生简短的help讯息。

   16. -I
               grep会强制认为此二进位档案没有包含任何搜寻样式,
               与--binary-files=without-match参数相同。
                   
           ex: $ grep -I panda mv

   17. -i, --ignore-case       
               忽略大小写,包含要搜寻的样式及被搜寻的档案。
               
           ex: $ grep -i panda mv
                
   18. -L, --files-without-match
               不显示平常一般的输出结果,反而显示出没有符合的档案名称。

   19. -l, --files-with-matches               
               不显示平常一般的输出结果,只显示符合的档案名称。

   20. --mmap               
               如果可能,使用mmap系统呼叫去读取输入,而不是预设的read系统呼叫。
               在某些状况,--mmap 能产生较好的效能。 然而,--mmap
               如果运作中档案缩短,或I/O 错误发生时,
               可能造成未定义的行为(包含core dump),。
               
   21. -n, --line-number
               在显示行前,标上行号。
               
            ex: $ grep -n panda file  
                显示结果相似於下:
                行号:符合行的内容

   22. -q, --quiet, --silent
               不显示任何的一般输出。请参阅-s或--no-messages

   23. -r, --recursive
       递地,读取每个资料夹下的所有档案,此相当於 -d recsuse 参数。

   24. -s, --no-messages
       不显示关於不存在或无法读取的错误讯息。
     
小: 不像GNU grep,传统的grep不符合POSIX.2协定,
       因为缺乏-q参数,且他的-s 参数表现像GNU grep的 -q 参数。
       Shell Script倾向将传统的grep移植,避开-q及-s参数,
       且将输出限制到/dev/null。
    
POSIX: 定义UNIX及UNIX-like系统需要提供的功能。              
    
   25. -V, --version
显示出grep的版本号到标准错误。
当您在回报有关grep的bugs时,grep版本号是必须要包含在内的。

   26. -v, --invert-match
显示除搜寻样式行之外的全部。
                   
   27. -w, --word-regexp
          将搜寻样式视为一个字去搜寻,完全符合该"字"的行才会被列出。

   28. -x, --line-regexp
将搜寻样式视为一行去搜寻,完全符合该"行"的行才会被列出


smarteng 发布于 2009-7-15 05:30

网页错误代码列表

Successful Client Requests
200 OK
201 Created
202 Accepted
203 Non-Authorative Information
204 No Content
205 Reset Content
206 Partial Content
Client Request Redirected
300 Multiple Choices
301 Moved Permanently
302 Moved Temporarily
303 See Other
304 Not Modified
305 Use Proxy
Client Request Errors
400 Bad Request
401 Authorization Required
402 Payment Required (not used yet)
403 Forbidden
404 Not Found      [break]
405 Method Not Allowed
406 Not Acceptable (encoding)
407 Proxy Authentication Required
408 Request Timed Out
409 Conflicting Request
410 Gone
411 Content Length Required
412 Precondition Failed
413 Request Entity Too Long
414 Request URI Too Long
415 Unsupported Media Type
Server Errors
500 Internal Server Error
501 Not Implemented
502 Bad Gateway
503 Service Unavailable
504 Gateway Timeout
505 HTTP Version Not Supported


smarteng 发布于 2009-7-11 01:56

Linux文件查找命令find xargs

关于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命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。[break]

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兄贴在论坛中;我对本文进行了再次整理,为方便大家阅读; ── 北南南北

六、相关文档


smarteng 发布于 2009-7-10 01:22

linux 指令 ls

ls 命令可以说是linux下最常用的命令之一。它有众多的选项,其中有很多是很有用的,你是否熟悉呢?下面列出了 ls 命令的绝大多数选项。

-a 列出目录下的所有文件,包括以 . 开头的隐含文件。

-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。[break]

-c 输出文件的 i 节点的修改时间,并以此排序。

-d 将目录象文件一样显示,而不是显示其下的文件。

-e 输出时间的全部信息,而不是输出简略信息。

-f -U 对输出的文件不排序。

-g 无用。

-i 输出文件的 i 节点的索引信息。

-k 以 k 字节的形式表示文件的大小。

-l 列出文件的详细信息。

-m 横向输出文件名,并以“,”作分格符。

-n 用数字的 UID,GID 代替名称。

-o 显示文件的除组信息外的详细信息。

-p -F 在每个文件名后附上一个字符以说明该文件的类型,“*”表示可执行的普通

文件;“/”表示目录;“@”表示符号链接;“|”表示FIFOs;“=”表示套

接字(sockets)。

-q 用?代替不可输出的字符。

-r 对目录反向排序。

-s 在每个文件名后输出该文件的大小。

-t 以时间排序。

-u 以文件上次被访问的时间排序。

-x 按列输出,横向排序。

-A 显示除 “.”和“..”外的所有文件。

-B 不输出以 “~”结尾的备份文件。

-C 按列输出,纵向排序。

-G 输出文件的组的信息。

-L 列出链接文件名而不是链接到的文件。

-N 不限制文件长度。

-Q 把输出的文件名用双引号括起来。

-R 列出所有子目录下的文件。

-S 以文件大小排序。

-X 以文件的扩展名(最后一个 . 后的字符)排序。

-1 一行只输出一个文件。

--color=no 不显示彩色文件名

--help 在标准输出上显示帮助信息。

--version 在标准输出上输出版本信息并退出。

只列出子目录

1. ls -F | grep /$ 或者 alias sub = "ls -F | grep /$"(linux)

2. ls -l | grep "^d" 或者 ls -lL | grep "^d" (Solaris)

计算当前目录下的文件数和目录数

下面命令可以分别计算当前目录下的文件和目录个数:

# ls -l * |grep "^-"|wc -l ---- to count files

# ls -l * |grep "^d"|wc -l ----- to count dir

显示彩色目录列表

打开/etc/bashrc, 加入如下一行:

alias ls="ls --color"

下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:

1. 蓝色-->目录

2. 绿色-->可执行文件

3. 红色-->压缩文件

4. 浅蓝色-->链接文件

5. 灰色-->其他文件

ls -tl --time-style=full-iso sshd

ls -ctl --time-style=long-iso


smarteng 发布于 2009-7-9 08:46

linux列出一个目录及其子目录下面的某种类型的文件

怎么样把,一个目录及其所有的子目录下面的某种类型(比如*.gif)的文件全部列出来?
这些子目录下面可能还包含有目录,要想全部列出*.gif的文件

find . -name "*.gif"

linux find命令-exec参数的使用说明(笔记)[break]

关键词: Linux   find -exec

前言:最近几天使用find的高级功能,但执行到 -exec命令的时候总是提示错误

信息如下:“find: missing argument to `-ok' ”,花了点时间,研究了下帮助(man),终于是搞清楚了。

说明:find命令,配合-exec参数,可以对查询的文件进行进一步的操作,可以得到很多有用的功能,比如说文件包含特定字符串的查询等,要了解这个功能,最简单直接的就是看find命令帮助,列出

 -exec command ;
               Execute command; true if 0 status is returned.   All   following   arguments   to find are taken to be arguments to the command until an   argument   consisting of #;' is encountered.   The string {}' is replaced by the current file name being processed everywhere it occurs in the arguments to the command, not just in arguments where it is alone, as in some versions of find.   Both of these constructions might need to be escaped (with a \') or quoted to   protect   them   from   expansion   by the shell.   The command is executed in the starting directory.

其实只要读懂这段话就理解了

废话少说,这里简单说明一下

-exec 参数后面跟的是 command命令,注意点如下:

command命令的终止,使用 ';' (分号)来判定,在后面必须有一个 ';'

'{}',使用{}来表示文件名,也就是find前面处理过程中过滤出来的文件,用于command命令进行处理

特别强调,对于不同的系统,直接使用分号可能会有不同的意义, 使用转义符 '\'在分号前明确说明,对于前面我们遇到的问题,主要就是这个原因引起的!

举例:

1.查询所有保护字符串“Hello”的文件

find / -exec grep "Hello" {} \;

2.删除所有临时文件

find / -name "*.tmp" -exec rm -f {} \;

。。。。。。。。

如何批量更改文件权限

我处理 ftp 上传资源时,最常用的命令是这样,不过要小心后果
代码:

find . -type f -exec chmod 644 "{}" \; find . -type d -exec chmod 755 "{}" \;

别用这个命令处理系统中原有的文件就可以了
find 会遍历每个文件,其中每一个都临时以 "{}" 来标识


smarteng 发布于 2009-7-9 08:40
    1 2

博主

    blogger

    smarteng

    人生就流星,虽然转瞬即逝,但也有永恒。

日历

恰饭

标签