shell 常用命令整理

一、mkdir命令
1、用途:创建目录
2、参数:
(1)、-p :如果路径中的某些目录不存在,则会自动创建目录,默认的mode由执行环境中的umask决定,即mode = 0777 - umask;无参数则路径中的目录不存在则将无法创建
(2)、-m : 指定目录的权限;
3、例子:
  1. 示例一
  2. [root@jfht ~]# umask 
  3. 0022
  4. [root@jfht ~]# mkdir dir1 
  5. [root@jfht ~]# ls -l dir1 
  6. 总计 0

  7. ls命令跟上-d参数才能打印目录本身的信息。 
  8. [root@jfht ~]# ls -ld dir1 
  9. drwxr-xr-x 2 root root 4096 07-20 20:44 dir1

  10. 权限设置mode=0755=0777-0022 
  11. [root@jfht ~]#



  12. 示例二
  13. [root@jfht ~]# mkdir -m 0700 dir2 
  14. [root@jfht ~]# ls -ld dir2 
  15. drwx------ 2 root root 4096 07-20 20:47 dir2
  16. [root@jfht ~]# 



  17. 示例三

  18. [root@jfht ~]# mkdir dir3/x/y/
  19. mkdir: 无法创建目录 “dir3/x/y/z”: 没有那个文件或目录
  20. [root@jfht ~]# mkdir -p dir3/x/y/
  21. [root@jfht ~]# ls -ld dir3 
  22. drwxr-xr-x 3 root root 4096 07-20 20:48 dir3
  23. [root@jfht ~]# ls -ld dir3/
  24. drwxr-xr-x 3 root root 4096 07-20 20:48 dir3/x
  25. [root@jfht ~]# ls -ld dir3/x/
  26. drwxr-xr-x 3 root root 4096 07-20 20:48 dir3/x/y
  27. [root@jfht ~]# ls -ld dir3/x/y/
  28. drwxr-xr-x 2 root root 4096 07-20 20:48 dir3/x/y/z
  29. [root@jfht ~]# 



  30. 示例四 一个命令创建项目的目录结构
  31. 这是来自ibm.com网站上的一个例子。http://www.ibm.com/developerworks/cn/aix/library/au-badunixhabits.html 



  32. [root@jfht ~]# mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a} 
  33. [root@jfht ~]# tree project/ 
  34. project/
  35. |-- bin
  36. |-- demo
  37. | `-- stat
  38. | `-- a
  39. |-- doc
  40. | |-- html
  41. | |-- info
  42. | `-- pdf
  43. |-- lib
  44. | `-- ext
  45. `-- src

  46. 11 directories, 0 files

二、cp命令

1、用途:复制文件或者目录

2、参数

a :相当于 -pdr 的意思;
-d :若来源文件为连结文件的属性(link file),则复制连结文件属性而非档案本身;
-f :为强制 (force) 的意思,若有重复或其它疑问时,不会询问使用者,而强制复制;
-i :若目的檔(destination)已经存在时,在覆盖时会先询问是否真的动作!
-l :进行硬式连结 (hard link) 的连结档建立,而非复制档案本身;
-p :连同档案的属性一起复制过去,而非使用预设属性;
-r :递归持续复制,用于目录的复制行为;
-s :复制成为符号连结文件 (symbolic link),亦即『快捷方式』档案;
-u :若 destination 比 source 旧才更新 destination !

3、例子

 

  1. 范例一:将家目录下的 .bashrc 复制到 /tmp 下,并更名为 bashrc
  2. [root@linux ~]# cd /tmp
  3. [root@linux tmp]# cp ~/.bashrc bashrc
  4. [root@linux tmp]# cp -i ~/.bashrc bashrc
  5. cp: overwrite `basrhc’? n
  6. # 重复作两次动作,由于 /tmp 底下已经存在 bashrc 了,加上 -i 参数,
  7. # 则在覆盖前会询问使用者是否确定!可以按下 n 或者 y 呢!
  8. # 但是,反过来说,如果不想要询问时,则加上 -f 这个参数来强制直接覆盖!

  9. 范例二:将 /var/log/wtmp 复制到 /tmp 底下
  10. [root@linux tmp]# cp /var/log/wtmp . <==想要复制到目前的目录,最后的 . 不要忘
  11. [root@linux tmp]# ls -/var/log/wtmp wtmp
  12. -rw-rw-r– 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
  13. -rw-r–r– 1 root root 71808 Jul 18 21:58 wtmp
  14. # 注意到了吗?!在不加任何参数的情况下,档案的所属者会改变,连权限也跟着改变了~
  15. # 这是个很重要的特性!要注意喔!还有,连档案建立的时间也不一样了!
  16. # 如果您想要将档案的所有特性都一起复制过来,可以加上 -a 喔!
  17. [root@linux tmp]# cp -a /var/log/wtmp wtmp_2
  18. [root@linux tmp]# ls -/var/log/wtmp wtmp_2
  19. -rw-rw-r– 1 root utmp 71808 Jul 18 12:46 /var/log/wtmp
  20. -rw-rw-r– 1 root utmp 71808 Jul 18 12:46 wtmp_2
  21. # 瞭了吧!整个资料特性完全一模一样ㄟ!真是不赖~这就是 -a 的特性!

  22. 范例三:复制 /etc/ 这个目录下的所有内容到 /tmp 底下
  23. [root@linux tmp]# cp /etc/ /tmp
  24. cp: omitting directory `/etc’ <== 如果是目录,不能直接复制,要加上 -r 的参数
  25. [root@linux tmp]# cp -/etc/ /tmp
  26. # 还是要再次的强调喔! -r 是可以复制目录,但是,档案与目录的权限会被改变~
  27. # 所以,也可以利用 cp -a /etc /tmp 来下达指令喔!

  28. 范例四:将范例一复制的 bashrc 建立一个连结档 (symbolic link)
  29. [root@linux tmp]# ls -l bashrc
  30. -rw-r–r– 1 root root 395 Jul 18 22:08 bashrc
  31. [root@linux tmp]# cp -s bashrc bashrc_slink
  32. [root@linux tmp]# cp -l bashrc bashrc_hlink
  33. [root@linux tmp]# ls -l bashrc*
  34. -rw-r–r– 2 root root 395 Jul 18 22:08 bashrc
  35. -rw-r–r– 2 root root 395 Jul 18 22:08 bashrc_hlink
  36. lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
  37. # 那个 bashrc_slink 是由 -s 的参数造成的,建立的是一个『快捷方式』,
  38. # 所以您会看到在档案的最右边,会显示这个档案是『连结』到哪里去的!
  39. # 至于那个 bashrc_hlink 有趣了!建立了这个档案之后, bashrc 与 bashrc_hlink
  40. # 所有的参数都一样,只是,第二栏的 link 数改变成为 2 了~而不是原本的 1 喔!
  41. # 这两种连结的方式的异同,我们会在下一章里面进行介绍的!

  42. 范例五:若 ~/.bashrc 比 /tmp/bashrc 新才复制过来
  43. [root@linux tmp]# cp -u ~/.bashrc /tmp/bashrc
  44. # 这个 -u 的特性,是在目标档案与来源档案有差异时,才会复制的。
  45. # 所以,比较常被用于『备份』的工作当中喔! ^_^

  46. 范例六:将范例四造成的 bashrc_slink 复制成为 bashrc_slink_2
  47. [root@linux tmp]# cp bashrc_slink bashrc_slink_2
  48. [root@linux tmp]# ls -l bashrc_slink*
  49. lrwxrwxrwx 1 root root 6 Jul 18 22:31 bashrc_slink -> bashrc
  50. -rw-r–r– 1 root root 395 Jul 18 22:48 bashrc_slink_2
  51. # 这个例子也是很有趣喔!原本复制的是连结档,但是却将连结档的实际档案复制过来了
  52. # 也就是说,如果没有加上任何参数时,复制的是源文件,而非连结文件的属性!
  53. # 若要复制连结文件的属性,就得要使用 -d 或者 -a 的参数了!

  54. 范例七:将家目录的 .bashrc 及 .bash_history 复制到 /tmp 底下
  55. [root@linux tmp]# cp ~/.bashrc ~/.bash_history /tmp
  56. # 可以将多个数据一次复制到同一个目录去!
  57. 这个 cp 的功能很多,而由于我们常常在进行一些数据的复制,所以也会常常用到这个指令的。 一般来说,我们如果去复制别人的数据 (当然,该档案您必须要有 read 的权限才行啊! ^_^) 时, 总是希望复制到的数据最后是我们自己的,所以,在预设的条件中, cp 的来源档与目的档的权限是不同的,目的档的拥有者通常会是指令操作者本身。举例来说, 上面的范例二中,由于我是 root 的身份,因此复制过来的档案拥有者与群组就改变成为 root 所有了! 这样说,可以明白吗?! ^_^

  58. 由于具有这个特性,因此,当我们在进行备份的时候,某些需要特别注意的特殊权限档案, 例如密码文件 (/etc/shadow) 以及一些设定档,就不能直接以 cp 来复制,而必须要加上 -a 或者是 -p 等等可以完整复制档案权限的参数才行!另外,如果您想要复制档案给其它的使用者, 也必须要注意到档案的权限(包含读、写、执行以及档案拥有者等等), 否则,其它人还是无法针对您给予的档案进行修订的动作喔!注意注意!

  59. 至于上面的范例当中,第四个范例是最有趣的,使用 -l 及 -s 都会建立所谓的连结档 (link file), 但是这两种连结档确有不一样的展现情况。这是怎么一回事啊? 那个 -l 就是所谓的 hard link ,至于 -s 则是 symbolic link ,鸟哥这里先不介绍, 因为这个涉及 i-node 的相关知识,我们还没有介绍到,下一章再来讨论这个 link 的问题喔! 总之,由于 cp 有种种的档案属性与权限的特性,所以,在复制时,您必须要清楚的了解到:
  60.  是否需要完整的保留来源档案的信息?
  61.  来源档案是否为连结档 (symbolic link file)
  62.  来源档是否为特殊的档案,例如 FIFO, socket 等?
  63.  来源文件是否为目录?

三、mv命令

(1)、用途:移动或更名文件或目录

(2)、参数:

 -b或--backup  若需覆盖文档,则覆盖前先行备份。
 -f或--force  若目标文档或目录和现有的文档或目录重复,则直接覆盖现有的文档或目录。
 -i或--interactive  覆盖前先行询问用户。
 -S或
 --suffix=  和-b参数一并使用,可指定备份文档的所要附加的字尾。
 -u或--update  在移动或更改文档名时,若目标文档已存在,且其文档日期比源文档新,则不覆盖目标文档。
 -v或--verbose  执行时显示周详的信息。
 -V=或
 --version-control=  和-b参数一并使用,可指定备份的方法。
 --help  显示帮助。
 --version  显示版本信息。

(3)、例子

 

  1. [root@xm_41 mv]# ll
  2. 总计 8
  3. -rw-r--r-- 1 root root 5 10-15 15:25 into
  4. -rw-r--r-- 1 root root 4 10-15 15:25 out

  5. [root@xm_41 mv]# mv -b into out
  6. mv:是否覆盖“out”? y
  7. [root@xm_41 mv]# ll
  8. 总计 8
  9. -rw-r--r-- 1 root root 5 10-15 15:25 out
  10. -rw-r--r-- 1 root root 4 10-15 15:25 out~
  11. -b参数的时候,会对覆盖的文件进行自动的备份,默认是后面加~;此时覆盖的时候还会进行提示

  12. [root@xm_41 mv]# mv -b -S bak into out
  13. mv:是否覆盖“out”? y
  14. [root@xm_41 mv]# ll
  15. 总计 4
  16. -rw-r--r-- 1 root root 0 10-15 15:28 out
  17. -rw-r--r-- 1 root root 5 10-15 15:25 outbak
  18. 若有参数-b同时加入-S的参数并在后面指定备份加的字符
  19. [root@xm_41 mv]# mv -b -S bak into out
  20. mv:是否覆盖“out”? y

  21. [root@xm_41 mv]# ll
  22. 总计 4
  23. -rw-r--r-- 1 root root 0 10-15 15:28 out
  24. -rw-r--r-- 1 root root 5 10-15 15:25 outbak
  25. 若是加参数-f就不会再进行提示;默认情况是-i进行询问;

  26. [root@xm_41 mv]# mv -u out outbak 
  27. [root@xm_41 mv]# ll
  28. 总计 4
  29. -rw-r--r-- 1 root root 0 10-15 15:30 out
  30. -rw-r--r-- 1 root root 5 10-15 15:31 outbak
  31. 采用-u的参数,发现out比outbak旧,才是就不进行覆盖了
    1. [root@xm_41 mv]# mv -u out outbak 
    2. [root@xm_41 mv]# ll
    3. 总计 4
    4. -rw-r--r-- 1 root root 0 10-15 15:30 out
    5. -rw-r--r-- 1 root root 5 10-15 15:31 outbak
    6. mv可以用来更改名字,若是指定文件或目录是不存在的

四、rm命令

(1)、用途:删除文件或者目录

(2)、参数

 -d或--directory  直接把欲删除的目录的硬连接数据删成0,删除该目录。
 -f或--force  强制删除文件或目录。
 -i或--interactive  删除既有文件或目录之前先询问用户。
 -r或-R或--recursive  递归处理,将指定目录下的所有文件及子目录一并处理。
 -v或--verbose  显示指令执行过程。
 --help  在线帮助。
 --version  显示版本信息

(3)、例子(才用法同mv的例子差不多,不在一一进行举例) 

五、ls命令

(1)、用途:列出目录

(2)、参数

-a 列出目录下的所有文件,包括以 . 开头的隐含文件。
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-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 在标准输出上输出版本信息并退出。

(3)、例子

 

  1. 只列出子目录
  2. 1. ls -| grep /$ 或者 alias sub = "ls -F | grep /$"(linux)
  3. 2. ls -| grep "^d" 或者 ls -lL | grep "^d" (Solaris)

  4. 计算当前目录下的文件数和目录数
  5. 下面命令可以分别计算当前目录下的文件和目录个数:
  6. # ls -* |grep "^-"|wc ----- to count files
  7. # ls -* |grep "^d"|wc ------ to count dir

  8. 显示彩色目录列表
  9. 打开/etc/bashrc, 加入如下一行:
  10. alias ls="ls --color"
  11. 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下:
  12. 1. 蓝色-->目录
  13. 2. 绿色-->可执行文件
  14. 3. 红色-->压缩文件
  15. 4. 浅蓝色-->链接文件
  16. 5. 灰色-->其他文件

  17. ls -tl --time-style=full-iso sshd
  18. ls -ctl --time-style=long-iso

  19. ls 命令的含义是list显示当前目录中的文件名字。注意不加参数它显示除隐藏文件外的所有文件及目录的名字。

  20.        1)ls –a 显示当前目录中的所有文件,包含隐藏文件

  21. ]# ls –a

  22. . .gnome2 .nautilus

  23. .. .gnome2_private oracle_rpm

  24. .bash_profile .gtkrc-1.2-gnome2 tnsnames.ora

  25. .bashrc .ICEauthority types.h

  26.        注意隐藏文件是在文件名字以“.”(英文句号)开头的文件。

  27.       

  28.        2)ls –l 显示文件及其详细信息。

  29. ]# ls –l

  30. total 5

  31. -rw-r--r-- 1 root root 1668 Oct 3 2007 anaconda-ks.cfg

  32. drwxr-xr-x 2 root root 4096 Nov 6 00:04 aa

  33. 显示的文件详细信息分别代表什么呢?以上面蓝色部分为例。

  34. total 5 代表当前目录下文件大小的总和为5K(每个目录的大小都按4K算)

  35. drwxr-xr-x 第一个字符有3种情况:“-”表示普通文件,“d”代表目录,“l”代表连接文件,“b”代表设备文件。

  36. 后面的9个字符每3个为一组,分别代表文件所有者、文件所有者所在用户组、其它用户对文件拥有的权限。每组中3个字符分别代表读、写、执行的权限,若没有其中的任何一个权限则用“-”表示。执行的权限有两个字符可选“x”代表可执行,“s”代表套接口文件。

  37. 紧接着的数字2代表 “aa”这个目录下的目录文件数目(这个数目=隐藏目录数目+普通目录数目)。我们进入“aa”目录用命令 ls –al (为了看到隐藏文件我们加上-a这个参数)

  38. ]# ls -al

  39. total 8

  40. drwxr-xr-x 2 root root 4096 Nov 6 00:04 .

  41. drwxr-x--- 14 root root 4096 Nov 6 00:04 ..

  42. (上面的第3行中的2代表当前目录中有子目录2个,即...

  43. 上面的第4行中的14代表这个目录的上一层目录中有14个子目录。)


  44. 再接下来的root代表这个文件(目录)的属主为 用户root

  45. 再接下来的root代表这个文件(目录)所属的用户组为 组root

  46. 4096 代表文件的大小(字节数),目录的大小总是为4096字节。

  47. Nov 6 00:04 代表文件(目录)的修改时间。

  48. aa代表文件(目录)在名字。


  49. 3)文件名颜色的含义

  50. 默认色代表普通文件。 例:install.log

  51. 绿色代表可执行文件。 例:rc.news

  52. 红色代表tar包文件。 例:vim-7.1.tar.bz2

  53.        蓝色代表目录文件。 例:aa

  54.        水红代表图象文件。 例:Sunset.jpg

  55.        青色代表链接文件。 例:rc4.d (此类文件相当于快捷方式)

  56.        黄色代表设备文件。 例:fd0

  57.       

  58. 4)几个比较常用的参数。

  59.        -t 按最后修改时间排序。

  60.        -S 按文件大小排序。(大写的S)

  61.        -r 排序时按倒序。

  62.        -h 显示文件大小时增加可读性 (例:1K 234M 2G)

五 find和xargs命令

Linuxsir文章写得很好直接转载了,链接地址:http://www.linuxsir.org/main/?q=node/137
前言:关于find命令

一、find 命令格式

二、find命令的例子;

三、xargs
四、find 命令的参数;

五、关于本文
六、相关文档


+++++++++++++++++++++++++++++++++++++++++++++++++
正文
+++++++++++++++++++++++++++++++++++++++++++++++++


版权声明

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

六 diff命令
(1)、用途:比对两个文件的不同
(2)、参数:
-a:将所有的文件当做文本来处理
-b:忽略空格造成的不同
-B:忽略空行照成的不同
-c:使用纲要输出格式
-H:利用试探法加速对大文件的搜索
-I:忽略大小写的变化
-n:输出RCS格式
-N:或–new-file  在比较目录时,若文件A仅出现在某个目录中,www.linuxidc.com会显示:Only in目录;文件A若使用-N参数,则diff会将文件A与一个空白的文件比较。
-r:或–recursive  比较子目录中的文件。
-u:-U<列数>或–unified=<列数>  以合并的方式来显示文件内容的不同。
-y:命令(长格式为 –side-by-side)可以将屏幕分成左右两部分,来比较两个文件之间的差异

猜你喜欢

转载自blog.csdn.net/hf1203/article/details/52129074