momo zone

调核人的blog

Monthly Archives: 一月 2010

ipad 发布

applet 的双手版 itouch 发布,感觉没啥新鲜的,整个就是一个大案板,而且不是MAC OS。
我是来看乔不死的

Advertisements

从rpm 档提取文件

1) The easiest way is to use Midnight Commander to navagate into the RPM
and then copy the file out that you are interested in. 

2) Another method is to do it at the command line using the following
commands:
cd /tmp
md rpmtmp
cd rpmtmp
rpm2cpio {FullNameOfRPM} | cpio -iumd {FullNameOfFileToExtract}
Be sure to clean up after you.

According to Pam Roberts:

3) You can use rpm-get, which is in rpm-utils-1.5-1.noarch.rpm from your
friendly local rpmfind.net and installs without any problems.

各种压缩/解压缩命令汇集

.Z


古老的Unix压缩档, 目前发行版中只有解压缩命令uncompress,而且已被gzip 取代了,系统中的uncompress其实一个bash脚本:

#!/bin/sh
PATH=${GZIP_BINDIR-‘/usr/bin’}:$PATH
exec gzip -d "$@"

实际调用的是gzip -d (gzip解压)

所以 .Z 与.gz是一样的。

umcompress filename.Z

保留原文档的解压缩命令:

umcompress –c
filename.Z >
filename


.gz

在bz2出现前使用最广泛的压缩档格式,是GNU的压缩程序,它只对单个文件进行压缩。使用gzip 压缩和gunzip(其实是gzip -d)解压缩。gunzip其实就是

#!/bin/sh
PATH=${GZIP_BINDIR-‘/bin’}:$PATH
exec gzip -d "$@"

注意,程序并不新建一个新的文件filename.gz,
而是将filename变成filename.gz

Linux压缩保留源文件的方法:

gzip –c filename > filename.gz

Linux解压缩保留源文件的方法:

gzip -d filename.gz > filenme

OR

gunzip –c filename.gz >
filename

.bz2

bzip2的主要优点在于它压缩后文件的尺寸,对于相同文件,bzip2
压缩后的尺寸几乎总是小于gzip的压缩结果。有些时候,这个差距会相当大

压缩

$ bzip2 filename

$ bzip2 -k filename #压缩后不删除原文件

解压缩

$ bunzip2 -k filename.bz2 #解压后不删除原文件

OR

$ bzip2 -d -k filename.bz2

注意,程序并不新建一个新的文件filename.bz2,
而是将filename变成filename.bz2

.tar

Unix/Linux 世界中一个历史悠久的打包程序:GNU的磁带归档程序。但现在它不是主要用于磁带了(那时候磁带可比硬盘便宜多了)。它可以将几个文件或者目录打包压缩成一个文件。这个特点让我们可以压缩整个目录树,而单使用gzip和
bzip2是无法做到的。事实上目前也都是用tar打包然后用gzip或bzip2压缩。

解包:

$ tar -xvzf filename.tar.gz
这里有不少的参数,那么它们各自有什么意思呢?
-x表示提取文件。这是一个非常重要的参数,因为它告诉tar对输入的文件具体怎么处理。在这里,我们要将打包的文件分离还原成打包前的状态。

-v表示详述。加入这个参数让程序将解包出来的每一个文件列出来。如果觉得列出来太烦了,你完全可以把这个参数去掉来关闭这个功能。相反,如果你需要每个
解包文件更详细的信息,则可以使用-vv参数。

-z是告诉tar先运行gunzip将文件解压缩。
-f是告诉tar在命令行输入的下一个串字符是需要处理的文件。

上面这个命令也可以用一些其他形式的写法。在比较老的系统里面由于缺少新版本的GNU
tar程序,你可能会看到它是写成这样的:
$ gunzip filename.tar.gz | tar -xvf –
这行命令先把文件解压缩,然后把解压的文件对输出到tar程序。gzip可以把其处理完的数据输到标准输出。这里就是把gzip解压缩的文件作为标准输出,然后由管道把文件送到tar程序进行解包。最后的
"-"表示处理标准输入。它将解包后的文件写入磁盘。

还有一种写法是将第一种命令格式的短划线去掉,像这样:
$ tar xvzf filename.tar.gz

你也可能会碰到bzip2压缩的打包文件。在SuSE所带的tar程序版本可以像gzip压缩的打包文件一样,只是要把参数-z用-j代替:
$ tar -xvjf filename.tar.bz2

这里需要注意的是,tar会把解包的文件放到当前目录。所以如果要把一个放在/tmp目录文件解压缩到你的家目录的话,这里有一些做法可供选择:

选择一,把文件拷贝到家目录,然后解包
选择二,指定需要解包文件的路径
选择三,用-C 参数指定解包后存放文件的路径

$ cd $HOME
$ cp /tmp/filename.tar.gz
$ tar -xvzf filename.tar.gz

$ cd $HOME
$ tar -xvzf /tmp/finename.tar.gz

$ cd /
$ tar -xvzf /tmp/filename.tar.gz -C $HOME

上面所有的命令都是等效的。每一种做法都是把文件解包到你的家目录,源文件则留在原来的地方。

打包:
在大多数情况下,只需要用参数"-c"代替参数"-x"就可以了:
$ tar -cvzf filename.tar.gz .
在这行命令里面,参数-c是告诉tar来建立一个打包文件;而参数-z是将打包的文件通过gzip程序进行压缩。filename.tar.gz
是你将要建立的文件名。(译者添加:命令行最后的"."是告诉tar将当前目录下的所有文件/文件夹打包)

参数"-f"不是必需的,但是通常来说加上会是一个好主意。如果不加,tar会将数据写到标准输出,这就需要管道将tar输出到另外一个程序,像这样:

$ tar -cv filename.tar . | gpg –encrypt

这行命令把当前目录下的所有文件打包建立一个没有被压缩的tar归档文件,通过管道输出到gpg程序进行加密,让不知道密钥的人无法读到文件内容。

.zip

windows 平台下早期最知名的压缩格式(尽管现在winzip这个软件包没落了)。在Linux/Unix世界中偶尔还是会遇到这种格式的。
linux下的zip软件包拥有和gzip,bzip2相同的动作和习惯,但不同的是默认动作的压缩和解压缩均不删除原文件。

压缩:
zip filename.zip filename

压缩一个目录:如压缩folder目录下所有东西(压缩后zip档放在当前目录, folder目录不变, zip档中包含完整路径)

zip -r filename.zip folder

如果要去除路径信息,只保留文件内容可以这样:
zip -jr filename.zip /folder/folder/target_folder

不过我有个习惯就是压缩档里一定有一个文件夹然后在hold 文件,这样只能用cd 切到目标路径下的上一层目录:
cd /mnt/folder/
zip -r filename.zip ./target_folder

解压缩:
unzip filename.zip

.rar

Windows 平台上的主力压缩/解压缩软件,装机必备阿(哈哈)
linux 平台上的rar工具和前述的行为和接口都不一样 ,比较另类(更接近win平台的风格)。

解压缩:

unrar e file.rar #解压到当前目录

unrar l file.rar #列出压缩档中的文件

unrar x file.rar #解压到指定目录

压缩:

openSuSE 并不包含rar 压缩程序,自己去packman 下载吧

安装完rar-{version}.rpm后,可以发现有两个版本的rar,分别是rar 和 rar2,前者压出来3.X 格式的rar档 后者压出来2.X的。

压缩单个文件:

rar a file.rar file

同样的参数也可以压缩目录 :

rar a file.rar /folder/folder/target_folder

上述方法压出来的档同样包含完整路径,如果需要去掉,需要这样做:

rar a -ep file.rar /folder/folder/target_folder

个人喜欢还是带一层文件夹:

cd /mnt/folder/folder
rar a filename.rar
./target_folder

或者

rar a -ep1 filename.rar /folder/folder/target_folder

这种做法最好。





用python脚本为python增加安装信息

对于win平台python的注册信息需要加入注册表。如果是部署portable版的,则需要手动改注册表,相当麻烦,这里用py脚本实现了自动设置:


  1. #!/usr/bin/python

  2. # -*- encoding: utf-8 -*-

  3. #

  4. # script to register Python 2.0 or later for use with win32all

  5. # and other extensions that require Python registry settings

  6. #

  7. # written by Joakim Löw for Secret Labs AB / PythonWare

  8. #

  9. # source:

  10.  

  11. import sys

  12.  

  13. from _winreg import *

  14.  

  15. # tweak as necessary

  16. version = sys.version[:3]

  17. installpath = sys.prefix

  18.  

  19. regpath = "SOFTWARE\Python\Pythoncore\%s\" % (version)

  20. installkey = "InstallPath"

  21. pythonkey = "PythonPath"

  22. pythonpath = "%s;%s\Lib\;%s\DLLs\" % (

  23.     installpath, installpath, installpath

  24. )

  25.  

  26. def RegisterPy():

  27.     try:

  28.         reg = OpenKey(HKEY_LOCAL_MACHINE, regpath)

  29.     except EnvironmentError:

  30.         try:

  31.             reg = CreateKey(HKEY_LOCAL_MACHINE, regpath)

  32.             SetValue(reg, installkey, REG_SZ, installpath)

  33.             SetValue(reg, pythonkey, REG_SZ, pythonpath)

  34.             CloseKey(reg)

  35.         except:

  36.             print "*** Unable to register!"

  37.             return

  38.         print "— Python", version, "is now registered!"

  39.         return

  40.     if (QueryValue(reg, installkey) == installpath and

  41.         QueryValue(reg, pythonkey) == pythonpath):

  42.         CloseKey(reg)

  43.         print "=== Python", version, "is already registered!"

  44.         return

  45.     CloseKey(reg)

  46.     print "*** Unable to register!"

  47.     print "*** You probably have another Python installation!"

  48.  

  49. def UnRegisterPy():

  50.     try:

  51.         reg = OpenKey(HKEY_LOCAL_MACHINE, regpath)

  52.     except EnvironmentError:

  53.         print "*** Python not registered?!"

  54.         return

  55.     try:

  56.         DeleteKey(reg, installkey)

  57.         DeleteKey(reg, pythonkey)

  58.         DeleteKey(HKEY_LOCAL_MACHINE, regpath)

  59.     except:

  60.         print "*** Unable to un-register!"

  61.     else:

  62.         print "— Python", version, "is no longer registered!"

  63.  

  64. if __name__ == "__main__":

  65.     # Register python’s distribution

  66.     RegisterPy()

  67.     # If you want to unregister python’s distribution, just comment the upper line and uncomment the following line

  68.     #UnRegisterPy()

自己搞定的第一个AWK脚本

l /mnt/TEMP/CG/ |awk ‘$9 !~/-4/ {print $9}’

将/mnt/TEMP/CG/目录下所有文件名中不包含’-4′ 的文件,并输出(仅文件名)。

l /mnt/TEMP/CG/w10-* | awk ‘$9 !~/-4/ {print "mv" " " $9 " " "/mnt/TEMP/CG/W10/"}’ | /bin/sh

将/mnt/TEMP/CG/目录下所有文件名中不包含’-4′ 的文件copy 到/mnt/TEMP/CG/W10/ 目录。

bash shell 手记

bash shell 快捷键

  • Control-A——此键绑定将当前位置定位到行开头。
  • Control-E——此键绑定将当前位置定位到行尾。
  • Control-K——此键绑定删除截止行尾的所有内容。
  • Control-U——此键绑定删除截止行头的所有内容。
  • Meta-B——此键绑定后退一个单词。
  • Meta-F——此键绑定向前推进一个单词。
  • Meta-D——此键绑定删除当前单词。


设置变量 :

$ myvar=’This is my environment variable!’

取消变量

unset myvar

使用变量 :

$ echo foo${myvar}bar
fooThis is my environment variable!bar

强引用

$ my=’hello’

$ echo “I say: ${my}-my baby”

I say hello-my baby

弱引用

$ my=’hello’

$ echo ‘I say: ${my}-my baby’

I say ${my}-my baby

PS: “$var”和$var有什么区别?

看看这个例子: hello=a b c d    e

$ echo $hello


a b c d e

$ echo $”hello”


a b c d    e

加上了””引用, 变量中的空格将保留, 否则多个空格被bash读取为一个空格.

取得目录名:

$ dirname /usr/local/share/doc/foo/foo.txt
/usr/local/share/doc/foo

取得文件名

$ basename /usr/local/share/doc/foo/foo.txt
foo.txt

命令替换:

$ MYDIR=`dirname /usr/local/share/doc/foo/foo.txt` (注意是“ 而不是 ‘ ‘)
$ echo $MYDIR
/usr/local/share/doc/foo

$ MYDIR=$(dirname /usr/local/share/doc/foo/foo.txt)
$ echo $MYDIR
/usr/local/share/doc/foo

字符截断(首):

$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}                       #${} 固定用法
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

字符截断(尾):

$ MYFOO=”chickensoup.tar.gz”
$ echo ${MYFOO%%.*}
chickensoup
$ echo ${MYFOO%.*}
chickensoup.tar

循环:

1.

myvar=0
while [ $myvar -ne 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))

done

2.
myvar=0
until [ $myvar -eq 10 ]
do
echo $myvar
myvar=$(( $myvar + 1 ))
done

选择:

case “${x##*.}” in
gz)
gzunpack ${SROOT}/${x}
;;
bz2)
bz2unpack ${SROOT}/${x}
;;
*)
echo “Archive format not recognized.”
exit
;;
esac

条件:

if [ ${1##*.} = tar ]
then
echo “(uncompressed tar)”
fi
tar tvf $1

子例程包含(相当于C中的include)

.       “/usr/lib/pm-utils/pm-function”

注意 中间有一个空格

另一个重要技巧  , 指定前缀补齐:

输入之前输入的部分内容后再按shift + up/down将显示之前所有该前缀的执行语句。比如tail -f 后shift+up/down将显示 之前输入过的tail -f /var/log/message ,tail -f /var/log/boot.msg 等

ATH W10VTG 靓图

 

python 平易近人?!

我的boss心血来潮,让我和某位同事研究一下task-coach(一个python的开源项目)的源代码, 下载下来一看吓一跳,一共有13MB。 对于python 算的上大家伙了。虽然下载了source code ,但我并不打算编译它(python 本来不就不需要编译嘛)而是直接用source 去运行。查看代码树,发现核心都在taskcoachlib 里面,而起始文件是taskcoach.py ,Ok, 很简单直接 python taskcoach.py 应该就能运行了.但结果还是出错了:

Traceback (most recent call last):
  File "H:TaskCoach-0.78.0taskcoach.py", line 51, in <module>
    start()
  File "H:TaskCoach-0.78.0taskcoach.py", line 40, in start
    from taskcoachlib import config, application
  File "H:TaskCoach-0.78.0taskcoachlibconfig__init__.py", line 19, in <modul
e>
    from settings import Settings
  File "H:TaskCoach-0.78.0taskcoachlibconfigsettings.py", line 20, in <modul
e>
    import ConfigParser, os, sys, wx
ImportError: No module named wx

我立刻发觉这个程序用了wxPython 库,立即去http://www.wxpython.org/download.php 下载(而且是AMD64版本,因为我用的是X64平台),安装的时候提示找不到%PYTHONPATH% 。不要紧稍后手动定位,安装到最后问是不是将库里面py编译成pyc, 结果失败,因为找不到%PYTHONPATH% 。 这里有个问题,一般其他程序判断%PYTHONPATH%并不是从环境变量中查找,而是在注册表中。后来查看了一下确实没有在HKLM\Software 中找到%PYTHONPATH% 。

安装完毕后继续python taskcoach.py  ,执行到call native dll的时候报错:

ERROR: Failure: ImportError (不是有效地Win32应用程序)

很奇怪,确认安装的是wx X64 库怎么会有问题? 于是把VS05,08 的runtime X64&X86 都上了一遍还是error

 难道是因为%PYTHONPATH% 在注册表中找不到? 最后发现之前找不到的python 键值,在Wow6432Node 中找到了。 我恍然大悟,原来我装的是X86版本的Python 。 怪不得会提示“不是有效地Win32应用程序”。 这也怪官方站点做的不好,因为根本就没有很醒目的列出X64 的载点。 全部版本的下载点在这里 http://www.python.org/ftp/python/

linux command 的众多好习惯

清单 1. 坏习惯 1 的示例:单独定义每个目录树

 
~ $ mkdir tmp
~ $ cd tmp
~/tmp $ mkdir a
~/tmp $ cd a
~/tmp/a $ mkdir b
~/tmp/a $ cd b
~/tmp/a/b/ $ mkdir c
~/tmp/a/b/ $ cd c
~/tmp/a/b/c $

使用 mkdir-p 选项并在单个命令中创建所有父目录及其子目录要容易得多。但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录。花时间有意识地养成这个好习惯是值得的:

清单 2. 好习惯 1 的示例:使用一个命令来定义目录树

~ $ mkdir -p tmp/a/b/c

您可以使用此选项来创建整个复杂的目录树(在脚本中使用是非常理想的),而不只是创建简单的层次结构。例如:

清单 3. 好习惯 1 的另一个示例:使用一个命令来定义复杂的目录树

~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

过去,单独定义目录的唯一借口是您的 mkdir 实现不支持此选项,但是在大多数系统上不再是这样了。IBM、AIX®、mkdir、GNU mkdir 和其他遵守单一 UNIX 规范 (Single UNIX Specification) 的系统现在都具有此选项。

对于仍然缺乏该功能的少数系统,您可以使用 mkdirhier 脚本(请参见参考资料),此脚本是执行相同功能的 mkdir 的包装:

~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}

更改路径;不要移动存档

另一个不良的使用模式是将 .tar 存档文件移动到某个目录,因为该目录恰好是您希望在其中提取 .tar 文件的目录。其实您根本不需要这样做。您可以随心所欲地将任何 .tar 存档文件解压缩到任何目录——这就是 -C 选项的用途。在解压缩某个存档文件时,使用 -C 选项来指定要在其中解压缩该文件的目录:

清单 4. 好习惯 2 的示例:使用选项 -C 来解压缩 .tar 存档文件

~ $ tar xvf -C tmp/a/b/c newarc.tar.gz

相对于将存档文件移动到您希望在其中解压缩它的位置,切换到该目录,然后才解压缩它,养成使用 -C 的习惯则更加可取——当存档文件位于其他某个位置时尤其如此。


将命令与控制操作符组合使用

您可能已经知道,在大多数 Shell 中,您可以在单个命令行上通过在命令之间放置一个分号 (;) 来组合命令。该分号是 Shell 控制操作符
虽然它对于在单个命令行上将离散的命令串联起来很有用,但它并不适用于所有情况。例如,假设您使用分号来组合两个命令,其中第二个命令的正确执行完全依赖
于第一个命令的成功完成。如果第一个命令未按您预期的那样退出,第二个命令仍然会运行——结果会导致失败。相反,应该使用更适当的控制操作符(本文将描述
其中的部分操作符)。只要您的 Shell 支持它们,就值得养成使用它们的习惯。

仅当另一个命令返回零退出状态时才运行某个命令

使用 && 控制操作符来组合两个命令,以便仅当 第一个命令返回零退出状态时才运行第二个命令。换句话说,如果第一个命令运行成功,则第二个命令将运行。如果第一个命令失败,则第二个命令根本就不运行。例如:

清单 5. 好习惯 3 的示例:将命令与控制操作符组合使用

~ $ cd tmp/a/b/c && tar xvf ~/archive.tar

在此例中,存档的内容将提取到 ~/tmp/a/b/c 目录中,除非该目录不存在。如果该目录不存在,则 tar 命令不会运行,因此不会提取任何内容。

仅当另一个命令返回非零退出状态时才运行某个命令

类似地,|| 控制操作符分隔两个命令,并且仅当第一个命令返回非零退出状态时才运行第二个命令。换句话说,如果第一个命令成功,则第二个命令不会运行。如果第一个命令失败,则第二个命令才会 运行。在测试某个给定目录是否存在时,通常使用此操作符,如果该目录不存在,则创建它:

清单 6. 好习惯 3 的另一个示例:将命令与控制操作符组合使用

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c

您还可以组合使用本部分中描述的控制操作符。每个操作符都影响最后的命令运行:

清单 7. 好习惯 3 的组合示例:将命令与控制操作符组合使用

~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar

谨慎引用变量

始终要谨慎使用 Shell
扩展和变量名称。一般最好将变量调用包括在双引号中,除非您有不这样做的足够理由。类似地,如果您直接在字母数字文本后面使用变量名称,则还要确保将该变
量名称包括在方括号 ([]) 中,以使其与周围的文本区分开来。否则,Shell
将把尾随文本解释为变量名称的一部分——并且很可能返回一个空值。清单 8 提供了变量的各种引用和非引用及其影响的示例。

清单 8. 好习惯 4 的示例:引用(和非引用)变量

~ $ ls tmp/
a b
~ $ VAR="tmp/*"
~ $ echo $VAR
tmp/a tmp/b
~ $ echo "$VAR"
tmp/*
~ $ echo $VARa

~ $ echo "$VARa"

~ $ echo "${VAR}a"
tmp/*a
~ $ echo ${VAR}a
tmp/a
~ $

使用转义序列来管理较长的输入

您或许看到过使用反斜杠 () 来将较长的行延续到下一行的代码示例,并且您知道大多数 Shell
都将您通过反斜杠联接的后续行上键入的内容视为单个长行。然而,您可能没有在命令行中像通常那样利用此功能。如果您的终端无法正确处理多行回绕,或者您的
命令行比通常小(例如在提示符下有长路经的时候),反斜杠就特别有用。反斜杠对于了解键入的长输入行的含义也非常有用,如以下示例所示:

清单 9. 好习惯 5 的示例:将反斜杠用于长输入

~ $ cd tmp/a/b/c || 
> mkdir -p tmp/a/b/c &&
> tar xvf -C tmp/a/b/c ~/archive.tar

或者,也可以使用以下配置:

清单 10. 好习惯 5 的替代示例:将反斜杠用于长输入

~ $ cd tmp/a/b/c 
>                  ||
> mkdir -p tmp/a/b/c
>                     &&
> tar xvf -C tmp/a/b/c ~/archive.tar

然而,当您将输入行划分到多行上时,Shell 始终将其视为单个连续的行,因为它总是删除所有反斜杠和额外的空格。

注意:在大多数 Shell 中,当您按向上箭头键时,整个多行输入将重绘到单个长输入行上。


在列表中对命令分组

大多数 Shell 都具有在列表中对命令分组的方法,以便您能将它们的合计输出向下传递到某个管道,或者将其任何部分或全部流重定向到相同的地方。您一般可以通过在某个 Subshell 中运行一个命令列表或通过在当前 Shell 中运行一个命令列表来实现此目的。

在 Subshell 中运行命令列表

使用括号将命令列表包括在单个组中。这样做将在一个新的 Subshell 中运行命令,并允许您重定向或收集整组命令的输出,如以下示例所示:

清单 11. 好习惯 6 的示例:在 Subshell 中运行命令列表

~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && 
> VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar )
> | mailx admin -S "Archive contents"

在此示例中,该存档的内容将提取到 tmp/a/b/c/ 目录中,同时将分组命令的输出(包括所提取文件的列表)通过邮件发送到地址 admin

当您在命令列表中重新定义环境变量,并且您不希望将那些定义应用于当前 Shell 时,使用 Subshell 更可取。

在当前 Shell 中运行命令列表

将命令列表用大括号 ({}) 括起来,以在当前 Shell 中运行。确保在括号与实际命令之间包括空格,否则 Shell 可能无法正确解释括号。此外,还要确保列表中的最后一个命令以分号结尾,如以下示例所示:

清单 12. 好习惯 6 的另一个示例:在当前 Shell 中运行命令列表

~ $ { cp ${VAR}a . && chown -R guest.guest a && 
> tar cvf newarchive.tar a; } | mailx admin -S "New archive"

在 find 之外使用 xargs

使用 xargs 工具作为筛选器,以充分利用从 find 命令挑选的输出。find 运行通常提供与某些条件匹配的文件列表。此列表被传递到 xargs 上,后者然后使用该文件列表作为参数来运行其他某些有用的命令,如以下示例所示:

清单 13. xargs 工具的经典用法示例

~ $ find some-file-criteria some-file-path | 
> xargs some-great-command-that-needs-filename-arguments

然而,不要将 xargs 仅看作是 find 的辅助工具;它是一个未得到充分利用的工具之一,当您养成使用它的习惯时,将会希望进行所有试验,包括以下用法。

传递空格分隔的列表

在最简单的调用形式中,xargs 就像一个筛选器,它接受一个列表(每个成员分别在单独的行上)作为输入。该工具将那些成员放置在单个空格分隔的行上:

清单 14. xargs 工具产生的输出示例

~ $ xargs
a
b
c
Control-D
a b c
~ $

您可以发送通过 xargs 来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示:

清单 15. xargs 工具的使用示例

~/tmp $ ls -1 | xargs
December_Report.pdf README a archive.tar mkdirhier.sh
~/tmp $ ls -1 | xargs file
December_Report.pdf: PDF document, version 1.3
README: ASCII text
a: directory
archive.tar: POSIX tar archive
mkdirhier.sh: Bourne shell script text executable
~/tmp $

xargs 命令不只用于传递文件名。您还可以在需要将文本筛选到单个行中的任何时候使用它:

清单 16. 好习惯 7 的示例:使用 xargs 工具来将文本筛选到单个行中

~/tmp $ ls -l | xargs
-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1
root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02
16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1
joe joe 3239 Sep 30 12:40 mkdirhier.sh
~/tmp $

谨慎使用 xargs

从技术上讲,使用 xargs 很少遇到麻烦。缺省情况下,文件结束字符串是下划线 (_);如果将该字符作为单个输入参数来发送,则它之后的所有内容将被忽略。为了防止这种情况发生,可以使用 -e 标志,它在不带参数的情况下完全禁用结束字符串。


了解何时 grep 应该执行计数——何时应该绕过

避免通过管道将 grep 发送到 wc -l 来对输出行数计数。grep-c 选项提供了对与特定模式匹配的行的计数,并且一般要比通过管道发送到 wc 更快,如以下示例所示:

清单 17. 好习惯 8 的示例:使用和不使用 grep 的行计数

~ $ time grep and tmp/a/longfile.txt | wc -l
2811

real     0m0.097s
user     0m0.006s
sys      0m0.032s
~ $ time grep -c and tmp/a/longfile.txt
2811

real     0m0.013s
user     0m0.006s
sys      0m0.005s
~ $

除了速度因素外,-c 选项还是执行计数的好方法。对于多个文件,带 -c 选项的 grep 返回每个文件的单独计数,每行一个计数,而针对 wc 的管道则提供所有文件的组合总计数。

然而,不管是否考虑速度,此示例都表明了另一个要避免地常见错误。这些计数方法仅提供包含匹配模式的行数——如果那就是您要查找的结果,这没什么问题。但是在行中具有某个特定模式的多个实例的情况下,这些方法无法为您提供实际匹配实例数量 的真实计数。归根结底,若要对实例计数,您还是要使用 wc 来计数。首先,使用 -o 选项(如果您的版本支持它的话)来运行 grep 命令。此选项 输出匹配的模式,每行一个模式,而不输出行本身。但是您不能将它与 -c 选项结合使用,因此要使用 wc -l 来对行计数,如以下示例所示:

清单 18. 好习惯 8 的示例:使用 grep 对模式实例计数

~ $ grep -o and tmp/a/longfile.txt | wc -l
3402
~ $

在此例中,调用 wc 要比第二次调用 grep 并插入一个虚拟模式(例如 grep -c)来对行进行匹配和计数稍快一点。


匹配输出中的某些字段,而不只是对行进行匹配

当您只希望匹配输出行中特定字段 中的模式时,诸如 awk 等工具要优于 grep

下面经过简化的示例演示了如何仅列出 12 月修改过的文件。

清单 19. 坏习惯 9 的示例:使用 grep 来查找特定字段中的模式

~/tmp $ ls -l /tmp/a/b/c | grep Dec
-rw-r--r--   7 joe joe   12043 Jan 27 20:36 December_Report.pdf
-rw-r--r--   1 root root   238 Dec 03 08:19 README
-rw-r--r--   3 joe joe    5096 Dec 14 14:26 archive.tar
~/tmp $

在此示例中,grep 对行进行筛选,并输出其修改日期和名称中带 Dec 的所有文件。因此,诸如 December_Report.pdf 等文件是匹配的,即使它自从一月份以来还未修改过。这可能不是您希望的结果。为了匹配特定字段中的模式,最好使用 awk,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示:

清单 20. 好习惯 9 的示例:使用 awk 来查找特定字段中的模式

~/tmp $ ls -l | awk '$6 == "Dec"'
-rw-r--r--   3 joe joe    5096 Dec 14 14:26 archive.tar
-rw-r--r--   1 root root   238 Dec 03 08:19 README
~/tmp $

有关如何使用 awk 的更多详细信息,请参见参考资料


停止对 cat 使用管道

grep 的一个常见的基本用法错误是通过管道将 cat 的输出发送到 grep 以搜索单个文件的内容。这绝对是不必要的,纯粹是浪费时间,因为诸如 grep 这样的工具接受文件名作为参数。您根本不需要在这种情况下使用 cat,如以下示例所示:

清单 21. 好习惯和坏习惯 10 的示例:使用带和不带 cat 的 grep

 
~ $ time cat tmp/a/longfile.txt | grep and
2811

real     0m0.015s
user     0m0.003s
sys      0m0.013s
~ $ time grep and tmp/a/longfile.txt
2811

real     0m0.010s
user     0m0.006s
sys      0m0.004s
~ $

此错误存在于许多工具中。由于大多数工具都接受使用连字符 (-) 的标准输入作为一个参数,因此即使使用 cat 来分散 stdin 中的多个文件,参数也通常是无效的。仅当您使用带多个筛选选项之一的 cat 时,才真正有必要在管道前首先执行连接。


结束语:养成好习惯

最好检查一下您的命令行习惯中的任何不良的使用模式。不良的使用模式会降低您的速度,并且通常会导致意外错误。本文介绍了 10 个新习惯,它们可以帮助您摆脱许多最常见的使用错误。养成这些好习惯是加强您的 UNIX 命令行技能的积极步骤。


ntp 相关设定

NTP服务器地址 :

time.buaa.edu.cn (首页:http://time.buaa.edu.cn/)

1. 手动一次同步时间:

$ ntpdate time.buaa.edu.cn

这种方式已不推荐

2. 自动同步时间(deamon):

在/etc/ntp.conf末尾添加:

server time.buaa.edu.cn iburst

restrict time.buaa.edu.cn

然后 service ntp start  启动服务。ntpd在后台负责同步时间。

注意:直接执行 ntpd 将不能达到目的,尽管ps aux |grep ntpd 也能看到ntpd。

3.同步系统时钟和硬件时钟(BIOS)

SYS->HW : hwclock –systohc

HW->SYS : hwclock –hctosys

display HW time : hwclock –show

4.普通ntp 客户端(仅查询,不依赖ntpd)

sntp time.buaa.edu.cn

5.ntp.conf 设定


#1. 设置访问权限

restrict default nomodify notrap noquery
restrict 220.130.158.71 <==底下这三行在开放主机进入的权限
restrict 220.130.158.51
restrict 220.130.158.52
restrict 127.0.0.1 mask 255.0.0.0 <==內部与 LAN 的使用权限
restrict 192.168.1.0 mask 255.255.255.0 nomodify

# 2. 設定主機來源!
server 220.130.158.71 prefer <==以这部主机最为先
server 220.130.158.51
server 220.130.158.51

# 3.原本內定的一个內部时间资料,不需要更动他
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10

# 4. 就是那个时间差异分析的东东,保留预设值即可。
driftfile /var/lib/ntp/drift
broadcastdelay 0.008

# 5.暂时不会使用的 keys 相关认证功能。
keys /etc/ntp/keys

6. ntp 查询工具

$ ntpq -p (service ntp status)

remote refid st t when poll reach delay offset jitter
==============================================================================
*220-130-158-71. 220.130.158.50 2 u 53 64 77 36.800 -10.496 1.890
220-130-158-51. .INIT. 16 u – 64 0 0.000 0.000 4000.00
+220-130-158-51. 220.130.158.50 2 u 49 64 77 33.448 -10.431 2.581
LOCAL(0) LOCAL(0) 10 l 51 64 77 0.000 0.000 0.004

這個 ntpq -p 可以列出目前我們的 NTP 與相關的上層 NTP 的狀態,上頭的幾個欄位的意義為:

  • remote:亦即是 NTP 主機的 IP 或主機名稱囉~注意最左邊的符號,
    如果有『+』代表目前正在作用當中的上層 NTP ,如果是『*』代表也有連上線,不過是作為次要連線的 NTP 主機。
  • refid:參考的上一層 NTP 主機的位址
  • st:就是 stratum 階層囉!
  • when:幾秒鐘前曾經做過時間同步化更新的動作;
  • poll:下一次更新在幾秒鐘之後;
  • reach:已經向上層 NTP 伺服器要求更新的次數
  • delay:網路傳輸過程當中延遲的時間,單位為 10^(-6) 秒
  • offset:時間補償的結果,單位與 10^(-3) 秒
  • jitter:Linux 系統時間與 BIOS 硬體時間的差異時間,
    單位為 10^(-6) 秒。

更新ntp 服务地址 0.pool.ntp.org , 1.pool.ntp.org,2.pool.ntp.org,3.pool.ntp.org

项目主页 http://www.pool.ntp.org/ 。 每个pool里面都是一堆ntp服务器,每小时随机分配一个哦。