2009年5月22日星期五

lftp使用方法

lftp是老牌,"万里长城永不倒"类型的王道unix/linux下的ftp客户端,可是很多新手总是想要找一个所谓
* 图形界面 * 中文不乱码 * 可以多线程
的ftp客户端。由于lftp的命令行特性,总觉得可能是高手才用的东东,其实不然,俺老pan也就只有几板斧,照样用的很high~下面容俺一一道来:
首先,所有的lftp终端内的命令,都可以用 代码: help 命令名
的方式来查看帮助信息。
另外,lftp支持tab自动补全,记不得命令是,多打两个tab,就可以看到可能的选项了。
1、登录ftp 代码: lftp 用户名:密码@ftp地址:传送端口(默认21)
也可以先不带用户名登录,然后在接口界面下用login命令来用指定账号登录,密码不显示。
2、查看文件与改变目录 代码: ls cd 对应ftp目录
嘿嘿,很简单吧?其实,在lftp终端中,前面带一个l的命令例如lcd,指的是local,就是在本机的操作,而对应的没有这个l的,都是对ftp
site的操作。还有就是要执行本地终端命令,也可以用前面带一个!的方式。这样,配合起来,终端,本地的操作都很放遍。
例如,查看ftp上所有的以mp3为扩展名的文件: 代码: find . -name "*.mp3"
3、下载 get当然是可以的,还可以 代码: mget -c *.pdf
把所有的pdf文件以允许断点续传的方式下载。m代表multi 代码: mirror aaa/
将aaa目录整个的下载下来,子目录也会自动复制 代码: pget -c -n 10 file.dat
以最多10个线程以允许断点续传的方式下载file.dat
可以通过设置pget:default-n的值而使用默认值。
4、上传 同样的put,mput,都是对文件的操作,和下载类似。 代码: mirror
-R 本地目录名 将本地目录以迭代(包括子目录)的方式反向上传到ftp site。
5、模式设置。 代码: set ftp:charset gbk 远程ftp
site用gbk编码,对应的要设置为utf8,只要替换gbk为utf8即可。 代码: set
file:charset utf8 本地的charset设定为utf8,如果你是gbk,相应改掉。 代码:
set ftp:passive-mode 1
使用被动模式登录,有些site要求必须用被动模式或者主动模式才可以登录,这个开关就是设置这个的。0代表不用被动模式。
6、书签 其实命令行也可以有书签,在lftp终端提示符下: 代码: bookmark
add ustc 就可以把当前正在浏览的ftp
site用ustc作为标签储存起来。以后在shell终端下,直接 代码: lftp ustc
就可以自动填好用户名,密码,进入对应的目录了。 代码: bookmark edit
会调用编辑器手动修改书签。当然,也可以看到,这个书签其实就是个简单的文本文件。密码,用户名都可以看到。
7、配置文件 /etc/lftp.conf 一般,我会添加这几行: 引用: set
ftp:charset gbk set file:charset utf8 set pget:default-n 5
这样,就不用每次进入都要打命令了。其他的set 可以自己tab然后help 来看。

2009年5月21日星期四

linux的free命令详解-内存是拿来用的不是拿来看的

linux的内存是很说究的.
如下显示free是显示的当前内存的使用,-m的意思是M字节来显示内容.我们来一起看看.
$ free -m

total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+ buffers/cache: 286 715
Swap: 1153 0 1153

第一部分Mem行:
total 内存总数: 1002M
used 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M

关系:total(1002M) = used(769M) + free(232M)

第二部分(-/+ buffers/cache):
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers -
cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers +
cached)

可见-buffers/cache反映的是被程序实实在在吃掉的内存,而+buffers/cache反映的是可以挪用的内存总数。

第三部分是指交换分区, 我想不讲大家都明白.

我想大家看了上面,还是很晕.第一部分(Mem)与第二部分(-/+
buffers/cache)的结果中有关used和free为什么这么奇怪.
其实我们可以从二个方面来解释.
对操作系统来讲是Mem的参数.buffers/cached
都是属于被使用,所以它认为free只有232.
对应用程序来讲是(-/+ buffers/cach).buffers/cached
是等同可用的,因为buffer/cached是为了提高程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。

所以,以应用来看看,以(-/+
buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家一些常识.Linux为了提高磁盘和内存存取效率,
Linux做了很多精心的设计,
除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),
还采取了两种主要Cache方式:Buffer Cache和Page
Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache能有效缩短了
I/O系统调用(比如read,write,getdents)的时间。
记住内存是拿来用的,不是拿来看的.不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换文件来读.这也就是
windows为什么常常提示虚拟空间不足的原因.你们想想,多无聊,在内存还有大部分的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以
我们看linux,只要不用swap的交换空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看内
存是否够用的标准哦.

让man手册显示颜色

让man手册显示颜色,在bashrc或者bash_profile中添加以下几行。

# man color
export LESS_TERMCAP_mb=$'\E[01;31m'
export LESS_TERMCAP_md=$'\E[01;31m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;32m'

VIM中常用的替换模式总结

0,:g/null/d
找到null的行并且删掉
1,简单替换表达式
替换命令可以在全文中用一个单词替换另一个单词:
:%s/four/4/g
"%" 范围前缀表示在所有行中执行替换。最后的 "g"
标记表示替换行中的所有匹配点。如果仅仅对当前行进行操作,那么只要去掉%即可
如果你有一个象 "thirtyfour"
这样的单词,上面的命令会出错。这种情况下,这个单词会被替换成"thirty4″。要解决这个问题,用
"\<" 来指定匹配单词开头:
:%s/\<four/4/g
显然,这样在处理 "fourty" 的时候还是会出错。用 "\>" 来解决这个问题:
:%s/\<four\>/4/g
如果你在编码,你可能只想替换注释中的
"four",而保留代码中的。由于这很难指定,可以在替换命令中加一个 "c"
标记,这样,Vim 会在每次替换前提示你:
:%s/\<four\>/4/gc
2,删除多余的空格
要删除这些每行后面多余的空格,可以执行如下命令:
:%s/\s\+$//
命令前面指明范围是 "%",所以这会作用于整个文件。"substitute"
命令的匹配模式是
"\s\+$"。这表示行末($)前的一个或者多个(\+)空格(\s)。替换命令的 "to"
部分是空的:"//"。这样就会删除那些匹配的空白字符。
3,匹配重复性模式
星号项 "*" 规定在它前面的项可以重复任意次。因此:
/a*
匹配 "a","aa","aaa",等等。但也匹配 ""
(空字串),因为零次也包含在内。星号 "*"
仅仅应用于那个紧邻在它前面的项。因此 "ab*" 匹配
"a","ab","abb","abbb",等等。如要多次重复整个字符串,那么该字符串必须被组成一个项。组成一项的方法就是在它前面加
"\(",后面加 "\)"。因此这个命令:
/\(ab\)*
匹配: "ab","abab","ababab",等等。而且也匹配 ""。
要避免匹配空字串,使用 "\+"。这表示前面一项可以被匹配一次或多次。
/ab\+
匹配 "ab","abb","abbb",等等。它不匹配 后面没有跟随 "b" 的 "a"。
要匹配一个可选项,用 "\="。 例如:
/folders\=
匹配 "folder" 和 "folders"。
4,指定重复次数
要匹配某一项的特定次数重复,使用 "\{n,m}" 这样的形式。其中 "n" 和 "m"
都是数字。在它前面的那个项将被重复 "n" 到 "m" 次 (|inclusive| 包含 "n" 和
"m")。例如:
/ab\{3,5}
匹配 "abbb","abbbb" 以及 "abbbbb"。
当 "n" 省略时,被默认为零。当 "m" 省略时,被默认为无限大。当 ",m"
省略时,就表示重复正好 "n" 次。例如:
模式 匹配次数
\{,4} 0,1,2,3 或 4
\{3,} 3,4,5,等等
\{0,1} 0 或 1,同 \=
\{0,} 0 或 更多,同 *
\{1,} 1 或 更多,同 \+
\{3} 3
5,多选一匹配
在一个查找模式中,"或" 运算符是 "\|"。例如:
/foo\|bar
这个命令匹配了 "foo" 或 "bar"。更多的抉择可以连在后面:
/one\|two\|three
匹配 "one","two" 或 "three"。
如要匹配其多次重复,那么整个抉择结构须置于 "\(" 和 "\)" 之间:
/\(foo\|bar\)\+
这个命令匹配 "foo","foobar","foofoo","barfoobar",等等。
再举个例子:
/end\(if\|while\|for\)
这个命令匹配 "endif","endwhile" 和 "endfor"。

通过代理访问blogspot.com

不知缘由,blogspot被封,国内无法访问。
正常的博客发布、订阅、浏览都受到影响。
最简单的方法,通过代理访问。
最新的代理:google.cn,端口80
可访问blogspot.com 和 blogger.com,速度挺快, 不过仅限于 google 的相关网站。

另外,推荐几个速度快的在线代理:
http://proxy-12345.appspot.com/
https://soproxy.appspot.com/
http://www.sneakme.net

Vim技巧 - 替换的巧妙使用

如何将一串十进制数字转换为16进制数字,使用VIM完成转换的最简单方法如下:
:%s/\d\+/\=printf("%X", submatch(0))/g

这条命令的原理是,把一串数字,用printf()函数的输出替换掉,printf()函数输出的正是这串数字的16进制形式。

分解如下:
%s 在整个文件中替换 (:help :s )
\d\+ 匹配一个或多个数字 (:help /\d :help /\+ )
\= 使用表达式的结果进行替换 (:help /\w )
printf 按指定格式输出 (:help printf() )
submatch() 返回:s命令中的指定匹配字符串 (:help submatch() )
g 替换行内所有出现的匹配 (:help :s_flags)

看来,替换命令的巧妙使用可以完成很多意想不到的功能!

下面这个技巧是在VIM邮件列表中看到的,非常实用。

这里以编写C语言程序为例, 假设,我们最终想完成的代码如下:
#define BIT_MASK_1 (1 << 0)
#define BIT_MASK_2 (1 << 1)
#define BIT_MASK_3 (1 << 2)
#define BIT_MASK_4 (1 << 3)
#define BIT_MASK_5 (1 << 4)
#define BIT_MASK_6 (1 << 5)
#define BIT_MASK_7 (1 << 6)
#define BIT_MASK_8 (1 << 7)
#define BIT_MASK_9 (1 << 8)
#define BIT_MASK_10 (1 << 9)
#define BIT_MASK_11 (1 << 10)
#define BIT_MASK_12 (1 << 11)
#define BIT_MASK_13 (1 << 12)
#define BIT_MASK_14 (1 << 13)
#define BIT_MASK_15 (1 << 14)
#define BIT_MASK_16 (1 << 15)
#define BIT_MASK_17 (1 << 16)
#define BIT_MASK_18 (1 << 17)
#define BIT_MASK_19 (1 << 18)
#define BIT_MASK_20 (1 << 19)
#define BIT_MASK_21 (1 << 20)
#define BIT_MASK_22 (1 << 21)
#define BIT_MASK_23 (1 << 22)
#define BIT_MASK_24 (1 << 23)
#define BIT_MASK_25 (1 << 24)
#define BIT_MASK_26 (1 << 25)
#define BIT_MASK_27 (1 << 26)
#define BIT_MASK_28 (1 << 27)
#define BIT_MASK_29 (1 << 28)
#define BIT_MASK_30 (1 << 29)
#define BIT_MASK_31 (1 << 30)
#define BIT_MASK_32 (1 << 31)

我们不需要一行一行的去写,只需要先写好第一行,如下:
#define BIT_MASK_1 (1 << 0)

然后,我们回到Normal模式,在这一行上输入"Y31p",拷贝此行,然后粘贴31次。这样,我们得到总共32行上面的内容。
现在使用"V31j"命令选中这32行,然后使用两次替换命令:
:'<,'>s/BIT_MASK_\zs\d*\ze/\=line(".") - line("'<") + 1
:'<,'>s/\zs\d*\ze)$/\=line(".")-line("'<")

这样,我们就得到了我们想要的结果。
这种方式还可以用于数组下标的自动增加,以及文本的章节自动编号等功能。只要你能够用正则表达式准确的定位出你想要自动编号的的数字,那么就可以使用这种方法来自动编号。

以第一条命令为例,第二条命令和第一条命令类似:

:'<,'>s/BIT_MASK_\zs\d*\ze/\=line(".") - line("'<") + 1

这条命令在我们选中的区域内进行替换,查找以"BIT_MASK_"开头,后面跟任意多个数字的字符串,并把匹配位置放在数字上,然后使用后面表达式计算出来的数字替换这些匹配的数字。
下面是这条命令中每个元素的含义:
'<,'> 我们所选中的区域 (:help '<,:help '> )
s 在选中的区域中进行替换 (:help :s )
\zs 指明匹配由此开始 (:help /\zs )
\d* 查找任意位数的数字 (:help /\d )
\ze 指明匹配到此为止 (:help /\ze )
\= 指明后面是一个表达式 (:help :s\= )
line(".") 当前光标所在行的行号 (:help line() )
line("'<") 我们所选区域中第一行的行号 (:help line() )

"'<"和"'>"是我们使用了"v","V"命令选中一个visual区域后,VIM设置的标记,分别用来标识visual区域的开始和结束。
"BIT_MASK_\zs\d*\ze"是一个正则表达式,用来查找以"BIT_MASK_"开头,后面跟任意多个数字的字符串。其中"\zs"、"\ze"用来指定匹配的开始和结束位置,因为我们只打算替换"BIT_MASK_0"中的数字,所以在查找时只把匹配区域置在数字上。
由于我们的替换操作要把不同行的数字替换成不同的值,所以在这里需要使用一个表达式来计算出替换后的值。当":s"命令的替换字符串是以"\="开头时,表明使用一个表达式计算的结果进行替换。我们这里的表达式就是"line(".")
- line("'<") +
1",其中"line()"函数用来获得行号,它可以获得当前行的行号,以及指定的标记(mark)所在的行号。"line(".")"用来获得当前光标所在行的行号,"line("'<")"则用来获得"'<"标记所在行的行号。这两个行号的差加上1就是我们想替换的值。

在上面的例子中,我们使用VIM的替换功能,实现高效的代码编写。现在介绍另外一种方法,实现相同的功能。

我们先看例子:
UniqueID2 = lview.focusedItem.subItems.opIndex(0).text;
Parent = lview.focusedItem.subItems.opIndex(0).text;
Children = lview.focusedItem.subItems.opIndex(0).text;
login = lview.focusedItem.subItems.opIndex(1).text;
txtCust.text = lview.focusedItem.subItems.opIndex(2).text;
txtProj.text = lview.focusedItem.subItems.opIndex(3).text;
txtbDate.text = lview.focusedItem.subItems.opIndex(4).text;
txtdDate.text = lview.focusedItem.subItems.opIndex(5).text;
txteDate.text = lview.focusedItem.subItems.opIndex(6).text;
txtPM.text = lview.focusedItem.subItems.opIndex(7).text;
txtLang.text = lview.focusedItem.subItems.opIndex(8).text;
txtVendor.text = lview.focusedItem.subItems.opIndex(9).text;
txtInvoice.text = lview.focusedItem.subItems.opIndex(10).text;
txtPMFund.text = lview.focusedItem.subItems.opIndex(11).text;
txtProjFund.text= lview.focusedItem.subItems.opIndex(12).text;
txtA_No.text = lview.focusedItem.subItems.opIndex(13).text;
txtNotes.text = lview.focusedItem.subItems.opIndex(14).text;
txtStatus.text = lview.focusedItem.subItems.opIndex(15).text;

我们要把上面代码中括号中的数字,替换成由0开始的一个顺序递增序列,例如:
UniqueID2 = lview.focusedItem.subItems.opIndex(0).text;
Parent = lview.focusedItem.subItems.opIndex(1).text;
Children = lview.focusedItem.subItems.opIndex(2).text;
……

实现以上需求,除了用前面介绍的方法外,还可以用下面的命令:
:let n=0 | g/opIndex(\zs\d\+/s//\=n/|let n+=1

这条命令同上一篇介绍的命令类似,它也使用了VIM的替换功能和表达式,不同之处在于它并不需要事先选中替换区域,因为它没有使用"line()"函数来计算当前位置的偏移,而是直接使用变量来进行赋值。
下面简单讲解一下这条命令各个组成元素:
let 为变量赋值 (:help let )
| 用来分隔不同的命令 (:help :bar )
g 在匹配后面模式的行中执行指定的ex命令 (:help :g )
\zs 指明匹配由此开始 (:help /\zs )
\d\+ 查找1个或多个数字 (:help /\d )
s 对匹配模式进行替换 (:help :s )
\= 指明后面是一个表达式 (:help :s\= )

所以,这条命令的执行过程为:
1. 给变量n赋值为0;
2. 查找模式" opIndex(\zs\d\+",使用变量n的值替换匹配的模式字符串;
3. 给变量n加1;

需要说明一下"|",它用来分隔不同的命令。
另外,在substitute命令中,如果省略匹配模式字符串,它会使用之前定义的匹配模式字符串,在本例中就是由"global"命令定义的"opIndex(\zs\d\+"。

除了上面介绍的方法外,还有一个VIM插件专门实现数字、日期等的增、减,可以在下面的网址下载此插件:
http://vim.sourceforge.net/scripts/script.php?script_id=670

http://mysite.verizon.net/astronaut/vim/index.html#VISINCR

linux的ln命令使用方法

ln 命令
用途 : 链接文件。
语法
1>将某个文件链接到一个文件上
ln [ -f | -n] [ -s ] SourceFile [ TargetFile ]
2>将一个或多个文件链接到一个目录上
ln [ -f | -n] [ -s ] SourceFile ... TargetDirectory
描述
ln 命令将在 SourceFile 参数中指定的文件链接到在 TargetFile
参数中指定的文件,或将其链接到在 TargetDirectory
参数中指定的另一个目录中的文件。
在缺省情况下,ln 命令会创建硬链接。如果需要使用 ln
命令来创建符号链接,请指明 -s 标志。
符号链接是指向文件的一个间接指针;它的目录项中包含了它所链接的文件名。符号链接可能会跨越文件系统,可能指向目录。
如果正在将某个文件链接到新的名字,那么只能列出一个文件。如果链接到一个目录,那么可以列出多个文件。
TargetFile 参数是可选的。
如果不指定目标文件,ln
命令会在当前的目录中创建一个新的文件。新的文件继承了指定在 SourceFile
参数中的文件名。
注意:
如果不使用 -s 标志,就不能在文件系统之间链接文件。
如果 TargetDirectory 已经是链接到目录上的一个符号链接,那么 ln
命令将现有的目标视为文件。
这意味着,类似于 ln -fs somepath/lname symdir 的命令不会遵循现有的 symdir
符号链接,作为代替,它会创建一个从 somepath/lname 到 symdir
的新的符号链接。
参数
-f 促使 ln
命令替换掉任何已经存在的目的路径。如果目的路径已经存在,而没有指定 -f
标志,ln
命令不会创建新的链接,而是向标准错误写一条诊断消息并继续链接剩下的
SourceFiles。
-n 指定,如果链接是一个现有的文件,那么不要覆盖文件的内容。 -f
标志重设了这个标志。这是缺省的行为。
-s 促使 ln
命令创建符号链接。符号链接中包含了它所链接的文件的名字。当对链接执行打开操作的时候,会使用到引用文件。对符号链接的
stat 调用会返回链接的目标文件;必须完成lstat
调用来获取链接的信息。可以使用 readlink
调用来读取符号链接的内容。符号链接可能跨越文件系统,指向目录。
注意:当为 -s 标志指定 SourceFile
参数的时候,必须使用绝对路径。如果没有指明绝对路径,那么当 SourceFile 和
TargetFile
参数位于不同的目录中的时候,可能会发生意外的结果。在创建符号链接之前,不需要存在源文件。
退出状态
此命令返回以下的退出值:
0 所有指定的文件都成功链接上了。
> 0 出现一次错误。
示例
1>为了创建到一个文件的另一个链接(别名),请输入:
ln -f file1 file2
这会将 file1 链接到新的名称, file2。如果 file2
不存在,那么会创建该文件名。如果 file2
已经存在了,那么这个文件会被替换为指向 file1的一个链接。然后 file1 和
file2
文件名会指向同一个文件。对其中任何一个的更改都会出现在另一个中。如果一个文件名被
rm 命令删除,那么该文件并没有完全被删除,因为它仍然以其它的名字存在。
2>为了将文件链接为另一个目录中的相同名字,请输入:
ln index dir1
这会将 index 链接到新的名称,dir1/index。
注意:在示例 1 中的 file2 是一个文件的名称;在示例 2 中的 dir1
是一个已经存在的目录。
3>为了将几个文件链接为另一个目录中的名称,请输入:
ln file2 dir2/file3 /home/dir1
这会将 file2 链接到新的名称 /home/dir1/file2;将 dir2/file3 链接到新的名称
/home/dir1/file3。
4>如果想要在 ln 命令中使用模式匹配字符,请输入:
ln dir1/* .
这会将 dir1 目录中的所有文件链接到当前目录中, . (点),给他们在 dir1
目录中同样的名称。
注意: 必须在星号和句点之间输入一个空格。
5>为了创建一个符号链接,输入:
ln -s /tmp/test test
这会在当前的目录中创建符号链接 test。 test 文件指向 /tmp/test 文件。如果
/tmp/test 文件已经存在了,那么 cat test 命令可以列出其内容。
6>如果想要在不指明 TargetFile 参数的情况下得到相同的结果,请输入:
ln -s /tmp/test

文件
/usr/bin/ln 包含了 ln 命令。