记录我的成长吧~

man手册


  在Linux上,当你遇到不懂的命令时大多数情况下你会怎么去其帮助信息?我想大多数人很像我一样先去Google和度娘上搜索吧。但是往往查找的结果并不是很理想,网上充斥着各种重复或者误导的信息,那么我要如何去筛选呢?这不是我们今天讨论的话。

  废话不多说,先了解下如何获取帮助吧

内部命令:
	help COMMAND
外部命令:
	1、命令自带简要格式的使用帮助
	2、使用手册:manual
	3、info COMMAND				获取命令的在线文档
	4、很多应用程序自带帮助文档:/usr/share/doc/APP-VERSION
	5、主流发行版官方文档:	http://www.redhat.com/doc
	6、程序的官方文档:		官方站点上的“Document”
	7、用好搜索引擎

  每个命令可能由于对应版本的不同内部用法略有不同,那么对于当前系统的命令,我们当然是使用系统的内部的man手册最适合啦~~

  man是manual的缩写,因此man page就是"手册页面";通常,man page是由编写程序的开发人员编写的(但也有例外)。编写Linux分发版中应用程序的开发人员大多是优秀的程序员,但对于自己的劳动成果,他们却不是总能很清楚明确地写出来或讲解出来。他们知道程序是怎么运行的,但是他们常常忘记用户并不了解那些开发人员司空见惯的技术细节。

  不过,即使有这么多问题,man page仍不失为供各层次Linux用户学习的好资源。如果想在命令行中使用Linux,就需要学习如何使用和阅读man page

man - an interface to the on-line reference manuals

位置:/usr/share/man

大致分为以下几个部分:

NAME                        功能说明
SYNOPSIS                    简要功能说明
DESCRIPTION                 描述,这部分最好仔细看看
OPTIONS                     选项,针对 SYNOPSIS 部分中,有列举的所有可用的参数说明
EXPRESSIONS                 表达式
    OPTIONS                 选项
    TESTS                   测试
    ACTIONS
STANDARDS CONFORMANCE      标准匹配
ENVIRONMENT VARIABLES      环境变量
EXAMPLES                   一些可以参考的范例
SEE ALSO                   可以参考的,跟这个指令或资料有相关的其他说明
BUGS                       已知的错误,以及如何报告新错误

SYNOPSIS里选项:

[]:可选内容
<>:必须提供的内容
a|b|c:多选一
...:同类内容出现多个

man章节:

  手册分为不同章节,每个章节代表不同的意思,而他们一般是存放在/usr/share/man/man#目录下,并且以*.gz的压缩格式呈现,那么每个章节又代表什么意思呢?

1:用户命令;普通用户和管理员都可以运行的命令
2:系统调用:程序员会用到
3:C库调用;
4:设备文件及特殊文件;
5:文件配置格式的说明;
6:游戏使用帮助
7:杂项;
8:管理工具及守护进程;管理员运行的命令
9:跟kernel相关

查看命令有哪些帮助

~]# whatis COMMAND
注意:其执行过程是查询数据库进行的
手动更新数据库:
~】# makewhatis

下面正式切入正题:

find命令


话不多说先上图

 

find命令时实时查找工具,通过遍历指定路径下的文件系统层级结构完成文件查找;

工作特性:

  相比于locate,whereis,which依赖于建好的索引库来说,findind是遍历硬盘;

  • 查找速度略慢
  • 精确查找;
  • 实时查找

 find命令用法

    find [OPTINS] [查找起始路径] [查找条件] [处理动作]

查找起始路径:
    指定具体搜索目标起始路径;默认为当前目录;
查找条件:
    指定的查找标准,可以根据文件名、大小、类型、从属关系、权限等等标准进行;默认为查找指定路径下的所有文件;
处理动作:
    对符合查找条件的文件做出操作,例如删除等操作;默认为输出至标准输出;

这里面查找条件和处理动作是需要我们详细了解的

查找条件  

  • 表达式:选项和测试

测试:结果通常为布尔模式

 

1、根据文件名查找
    -name "pattern":精准匹配
    -iname "pattern":忽略大小写
    pattern 支持glob风格的通配符;
    *:匹配任意长度的任意字符
    ?:匹配任意单个字符
    []:匹配指定范围内的任意单个字符
    [^]:匹配指定范围外的任意单个字符
    -regex pattern:基于正则表达式模式查找文件,匹配是整个路径,而非基名
        一般不用,不是找路径的,找路径直接用locate就可以了

2、根据文件从属关系查找: -user USERNAME:查找属主为指定用户的所有文件; -group GROUPNAME:查找属组指定组的所有文件 -uid UID:查找属主为指定的UID的所有文件; -gid GID:查找属主为指定的GID的所有文件; -nouser:查找没有属主的文件 -nogroup:查找没有属组的文件 3、根据文件的类型查找: -type TYPE: f,d,l,b,c,p,s ~]# find /dev -type b -ls 这里的-ls 类似于ls命令 4、组合测试: 与:-a,默认组合逻辑; ~]# find /tmp -nouser -type f ~]# find /tmp -nouser -a -type f 或:-o ~]# find /tmp -nouser -o -type f 非:-not,! ~]# find /tmp -not -type f -ls ~]# find /tmp ! -type f -ls
  !A -a !B = !(A -o B) !A -o !B = !(A -a B) 5、根据文件的大小查查找: -size [+|-]#UNIT 常用单位:k,M,G 注意:单位换算后的结果通常是非精确的数值,例如(#-1,#]这个单位范围内的文件都会被换算为# #UNIT:(#-1,#) 属于本体开区间内的; -#UNIT:[0,#-1] +#UNIT:(#,oo) 6、根据时间戳查找: 说明: #:[#,#+1] 相当于这天24小时或者这分钟60秒之内的时间 -#:(0,#) 相当于最近第#天之内的时间 +#:(oo,#-1] 相当于第#天以前的时间 以''为单位: -atime [+|-]# -mtime [+|-] -ctime [+|-] 以"分钟"为单位: -amin [+|-] -mmin [+|-] -cmin [+|-] 7、根据权限查找: -perm [/|-]mode mode:精确权限匹配 /mode:任何一类用户(u,g,o)的权限中的任何一位(r,w,x)符合条件则满足; 9位权限之间存在""关系; -mode:每一类用户(u,g,o)的权限中的每一位(r,w,x)同时符合条件即满足;

 很多人对时间戳查找比较模糊些,那下图是否可以感受更清晰些:

 

处理动作:

处理动作:
    -print:输出至标准输出;默认的动作;
    -ls:类似对查找到的文件执行"ls -l"命令,输出文件的详细信息;
    -delete:删除查找到的文件;谨慎使用
    -fls /PATH/TO/SOMEFIL:把查找到的所有文件的长格式信息保存至指定文件中;
    -ok COMMAND {} \;   :对查找到的文件执行由COMMAND表示的命令;每次操作的都由用户确认
    -exec COMMAND {} \;   : 对查找到的文件执行由COMMAND标识的命令;
        ~]# find ./ -perm /002 -exce mv {} {}.degange \;
    这里的{}代表应用找到的文件列表;
1、查找/var目录下属主为root,且属组为mail的所有文件或目录;
    ~]# find /var -user root -a -group mail -ls

2、查找/usr目录下不属于root, bin或hadoop的所有文件或目录;用两种方法;
    ~]# find /usr -not -user root -a -not -user bin -a -not -user hadoop
    ~]# find /usr -not \( -user root -o -user bin -o -user hadoop \) -ls
    
3、查找/etc目录下最近一周内其内容修改过,且属主不是root用户也不是hadoop用户的文件或目录;
    ~]# find /etc -mtime -7 -a -not \( -user root -o -user hadoop \) -ls
    ~]# find /etc -mtime -7 -a -not -user root -a -not -user hadoop -ls
    
4、查找当前系统上没有属或属组,且最近一周内曾被访问过的文件或目录;
    ~]# find  /  \( -nouser -o -nogroup \)  -atime  -7  -ls
    
5、查找/etc目录下大于1M且类型为普通文件的所有文件;
    ~]# find /etc -size +1M -type f -exec ls -lh {} \;
    
6、查找/etc目录下所有用户都没有写权限的文件;
    ~]# find /etc -not -perm /222 -type f -ls                    
    
7、查找/etc目录至少有一类用户没有执行权限的文件;
    ~]# find /etc -not -perm -111 -type f -ls
    
8、查找/etc/init.d/目录下,所有用户都有执行权限,且其它用户有写权限的所有文件;
    ~]# find /etc -perm -113 -type f -ls
热身练习

 

注意:find传递查找到的文件路径至后面的命令时,是先查找出所有符合条件的文件路径,并一次性传递给后面的命令;
        但是有些命令不能接受过长的参数,此时命令执行会失败;另一种方式可规避此问题:
       find | xargs COMMAND

xargs与find 的exec选项的比较

1,使用find 的exec选项去处理匹配到的选项时,find 一次性将匹配到得参数传给exec执行。但有的系统,
对exec 传的参数长度有限制,这样在find 命令执行几分钟后会报溢出,错误信息通常是“参数列太长”或“参数列溢出"。
2,xargs 与find 命令合用的时候,find 把匹配到得命令传递给xargs ,xargs 每次只获取一部分文件,而不是全部。分批处理。
3, 使用exec选项,会为匹配的每个文件处理分配个进程,并不是将匹配到的文件作为一个参数一次执行,这样就会触发多个进程,进而使系统性能下降,影响处理效率。
4,xargs则只有一个进程、但xargs 处理是否分批 ,批次大小,也会受系统些可调参数影响。
Xargs用法详解

1. 简介

    之所以能用到这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如:

    find /sbin -perm +700 |ls -l       这个命令是错误的
    find /sbin -perm +700 |xargs ls -l   这样才是正确的

    xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了~他的用法其实也还满简单的!就来看一看先!

2. 选项解释

-0 当sdtin含有特殊字元时候,将其当成一般字符,像/'空格等;
-a file 从文件中读入作为sdtin;
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止;
-p 当每次执行一个argument的时候询问一次用户;
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的;***
-t 表示先打印命令,然后再执行。(例五)
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替;
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了;
-s num 命令行的最大字符数,指的是xargs后面那个命令的最大命令行字符数;
-L 从标准输入一次读取num行送给Command命令 ,-l和-L功能一样
-l  同-L;
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符; ***
-x  exit的意思,如果有任何 Command 行大于 -s Size 标志指定的字节数,停止运行 xargs 命令;
-P 修改最大的进程数,默认是1,为0时候为as many as it can ;

3. 应用举例

-0 :当sdtin含有特殊字元时候,将其当成一般字符,想/'空格等:
    $ echo "/ /  "|xargs echo
    / /
    $ echo "/ /  "|xargs -0 echo
    / /  

-a file 从文件中读入作为sdtin:
    ~]# cat test 
    #!/bin/sh
    echo "hello world/n"
    ~]# xargs -a test echo
    #!/bin/sh echo hello world/n

-e flag 分析到含有flag这个标志的时候就停止:
    ~]# cat txt
    /bin tao shou kun
    ~]# cat txt|xargs -E 'shou' echo
    /bin tao

-p 执行一个argument的时候询问一次:
    ~]# cat txt|xargs -p echo
    echo /bin tao shou kun ff ?...y
    /bin tao shou kun ff

-n num 一次用的argument的个数 默认所有:
    ~]# cat txt|xargs -n1 echo
    /bin
    tao
    shou
    kun
    ~]# cat txt|xargs  echo
    /bin tao shou kun

-t 表示先打印命令,然后再执行:
    ~]# cat txt|xargs -t echo
    echo /bin tao shou kun 
    /bin tao shou kun

-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替:
    

-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了:
    ~]# echo ""|xargs -t mv
    mv 
    mv: missing file operand
    Try `mv --help' for more information.
    ~]# echo ""|xargs -t -r  mv
    (直接退出)

-s num 命令行的最大字符数,指的是xargs后面那个命令的最大命令行字符数:
    ~]# cat 1.txt.bak |xargs  -s 9 echo
    aaa
    bbb
    ccc
    ddd
    a b
    ~]# cat 1.txt.bak |xargs  -s 4 echo
    xargs: can not fit single argument within argument list size limit      #length(echo)=4
    ~]# cat 1.txt.bak |xargs  -s 8 echo
    xargs: argument line too long      #length(echo)=4,length(aaa)=3,length(null)=1,total_length=8

-L 从标准输入一次读取num行送给Command命令 ,-l和-L功能一样:
    [root@localhost test]# cat 1.txt.bak 
    aaa bbb ccc ddd
    a b
    ccc 
    dsdd
    [root@localhost test]# cat 1.txt.bak | xargs -L4 echo
    aaa bbb ccc ddd a b ccc dsdd
    [root@localhost test]# cat 1.txt.bak | xargs -L2 echo
    aaa bbb ccc ddd a b
    ccc dsdd


-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符
    ~]# cat 1.txt.bak | xargs -L1 echo
    aaa bbb ccc ddd
    a@b
    abc
    ~]# cat 1.txt.bak | xargs -d"@" echo
    aaa bbb ccc ddd
    a b
    abc


    ~]# cat 1.txt.bak | xargs -d'@' echo
    aaa bbb ccc ddd
    a b
    abc
xargs命令

 

 转载请注明出处:http://www.cnblogs.com/jasperhsu/p/5059000.html

posted on 2015-12-19 13:16  徐长伟  阅读(351)  评论(0编辑  收藏  举报