shell基础二:查找技巧,find及xargs的使用

使用find时,只要把想要的操作写在一个文件里,就可以用exec来配合find查找,很方便的

(在有些操作系统中只允许- e x e c选项执行诸如l s或ls -l这样的命令)。大多数用户使用这一选项是为了查找旧文件并删除它们。建议在真正执行r m命令删除文件之前,最好先用l s命令看一下,确认它们是所要删除的文件。

e x e c选项后面跟随着所要执行的命令或脚本,然后是一对儿{ },一个空格和一个\,最后是一个分号。

为了使用e x e c选项,必须要同时使用p r i n t选项。如果验证一下f i n d命令,会发现该命令只输出从当前路径起的相对路径及文件名。

例如:为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在f i n d命令的- e x e c选项中

  1. # find . -type f -exec ls -l {} \;
  2. -rw-r--r--    1 root     root        34928 2003-02-25  ./conf/httpd.conf
  3. -rw-r--r--    1 root     root        12959 2003-02-25  ./conf/magic
  4. -rw-r--r--    1 root     root          180 2003-02-25  ./conf.d/README

复制代码

上面的例子中,f i n d命令匹配到了当前目录下的所有普通文件,并在- e x e c选项中使用ls -l命令将它们列出。

在/ l o g s目录中查找更改时间在5日以前的文件并删除它们:

  1. $ find logs -type f -mtime +5 -exec rm {} \;

复制代码

记住,在s h e l l中用任何方式删除文件之前,应当先查看相应的文件,一定要小心!当使用诸如m v或r m命令时,可以使用- e x e c选项的安全模式。它将在对每个匹配到的文件进行操作之前提示你。

在下面的例子中, f i n d命令在当前目录中查找所有文件名以. L O G结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示。

  1. $ find . -name "*.conf"  -mtime +5 -ok rm {} \;
  2. < rm ... ./conf/httpd.conf > ? n

复制代码

按y键删除文件,按n键不删除。

任何形式的命令都可以在- e x e c选项中使用。

在下面的例子中我们使用g r e p命令。f i n d命令首先匹配所有文件名为“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后执
行grep命令看看在这些文件中是否存在一个sam用户。

  1. # find /etc -name "passwd*" -exec grep "sam" {} \;
  2. sam:x:501:501::/usr/sam:/bin/bash

复制代码

查找当前用户主目录下的所有文件,下面两种方法都可以使用:

  1. $ find $HOME -print
  2. $ find ~ -print

复制代码

为了在当前目录中文件属主具有读、写权限,并且文件所属组的用户和其他用户具有读权限的文件,可以用:

  1. $ find . -type f -perm 644 -exec ls -l {} \;

复制代码

为了查找系统中所有文件长度为0的普通文件,并列出它们的完整路径,可以用:

  1. $ find / -type f -size 0 -exec ls -l {} \;

复制代码

查找/var/logs目录中更改时间在7日以前的普通文件,并在删除之前询问它们:

  1. $ find /var/logs -type f -mtime +7 -ok rm {} \;

复制代码

为了查找系统中所有属于root组的文件,可以用:

  1. $find . -group root -exec ls -l {} \;
  2. -rw-r--r--    1 root     root          595 10月 31 01:09 ./fie1

复制代码

下面的find命令将删除当目录中访问时间在7日以来、含有数字后缀的admin.log文件。该命令只检查三位数字,所以相应文件的后缀不要超过999。
先建几个admin.log*的文件 ,才能使用下面这个命令

  1. $ find . -name "admin.log[0-9][0-9][0-9]" -atime -7  -ok
  2. rm {} \;
  3. < rm ... ./admin.log001 > ? n
  4. < rm ... ./admin.log002 > ? n
  5. < rm ... ./admin.log042 > ? n
  6. < rm ... ./admin.log942 > ? n

复制代码

为了查找当前文件系统中的所有目录并排序,可以用:

  1. $ find . -type d  |sort

复制代码

为了查找系统中所有的r m t磁带设备,可以用:

  1. $ find /dev/rmt -print

复制代码

  1. 原书为:
  2. 为了查找当前文件系统中的所有目录并排序,可以用:
  3. $ find . -type d  -loacl -mount |sort
  4. 已更正为:
  5. $ find . -type d |sort

复制代码

xargs

在使用f i n d命令的- e x e c选项处理匹配到的文件时, f i n d命令将所有匹配到的文件一起传递给e x e c执行。但有些系统对能够传递给e x e c的命令长度有限制,这样在f i n d命令运行几分钟之后,就会出现溢出错误。错误信息通常是“参数列太长”或“参数列溢出”。这就是x a rg s命令的用处所在,特别是与f i n d命令一起使用。

F i n d命令把匹配到的文件传递给x a rg s命令,而x a rg s命令每次只获取一部分文件而不是全部,不像- e x e c选项那样。这样它可以先处理最先获取的一部分文件,然后是下一批,并如此继续下去。

在有些系统中,使用- e x e c选项会为处理每一个匹配到的文件而发起一个相应的进程,并非将匹配到的文件全部作为参数一次执行;这样在有些情况下就会出现进程过多,系统性能下降的问题,因而效率不高;

而使用x a rg s命令则只有一个进程。另外,在使用x a rg s命令时,究竟是一次获取所有的参数,还是分批取得参数,以及每一次获取参数的数目都会根据该命令的选项及系统内核中相应的可调参数来确定。

来看看x a rg s命令是如何同f i n d命令一起使用的,并给出一些例子。

下面的例子查找系统中的每一个普通文件,然后使用x a rg s命令来测试它们分别属于哪类文件

#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

复制代码

用g r e p命令在所有的普通文件中搜索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

复制代码

用g r e p命令在当前目录下的所有普通文件中搜索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

复制代码

注意,在上面的例子中, \用来取消f i n d命令中的*在s h e l l中的特殊含义。

时间: 2024-10-10 05:12:37

shell基础二:查找技巧,find及xargs的使用的相关文章

shell基础二十篇

shell基础二十篇 编者按:由 wingger  整理的 shell基础十二篇 以及L_kernel补充的第十三--二十篇,涉及shell 编程及使用的各个方面,又附有大量的例子,极适合初学者系统学习.如果配合網中人的shell 十三問? ,效果更加明显. 这里是其中的第十章 sed.  其他各章可察看相应的 link. shell基础1:文件安全与权限 http://bbs.chinaunix.net/thread-434579-1-1.html 附:Linux的用户和用户组管理 http:

shell基础二十篇 一些笔记

shell基础二十篇 转自 http://bbs.chinaunix.net/thread-452942-1-1.html 研讨:Bash 内建命令 read read -p "how old r u? " ageecho $ageread -p "some words? " -a wordsecho ${words[*]}read -p "Password: " -s passwd echo $passwd read -t 5 authecho

shell基础二

1.shell脚本 新建文本,后缀名sh,例如:abc.sh 注意: 在脚本第一行需要写      #!/bin/bash #! 规定写法,说明使用何种解释器执行源代码 # 表示注释 注意: php也可以写shell脚本 2.shell脚本执行 一,赋予脚本可执行的权限   chmod +x ./test.sh    #使用脚本执行 ./test.sh                    #执行脚本 必须在脚本第一行指定shell解释器类型 二,使用shell解释器执行(不推荐) 不需要赋予权

01. Shell基础和使用技巧(工具+常用bash命令加速操作)

Shell脚本介绍和常用工具 Shell脚本 Shell脚本:实际就是windows里的批处理脚本,多条可一次执行的Shell命令集合.Linux上的脚本可以用很多种语言实现,bash shell是比较简单的一种,更高阶的可以用其他脚本语言,比如Python. Shell脚本对系统的管理能力非常强大,甚至可以使用Shell结合php实现Web管理Linux系统功能:可以自己写一个Web页面(示例:基于Php),对系统进行管理,包括查看删除用户,配置网络,发送邮件,重启系统,一键备份,一键搭建服务

shell基础(二)

echo命令 Shell 的 echo 指令是用于字符串的输出. #!/bin/sh read name #读取标准输入的行 echo "$name It is a test" echo -e "Yeah! \c" # -e 开启转义 \c 不换行 echo "It is a test" printf命令 printf用作格式化字符串,还可以制定字符串的宽度.左右对齐方式等.默认printf不会像 echo 自动添加换行符,我们可以手动添加 \n

shell基础(转)

shell基础1:文件安全与权限 http://bbs.chinaunix.net/forum/viewtopic.php?t=434579&highlight=wingger 附:Linux的用户和用户组管理 http://bbs.chinaunix.net/forum/viewtopic.php?t=438660&highlight=wingger shell基础二:查找技巧,find及xargs的使用http://bbs.chinaunix.net/forum/viewtopic.p

Linux Shell常用技巧(七) find xargs

Linux Shell常用技巧(七) find xargs 十六. 文件查找命令find: 下面给出find命令的主要应用示例:    /> ls -l     #列出当前目录下所包含的测试文件    -rw-r--r--. 1 root root 48217 Nov 12 00:57 install.log    -rw-r--r--. 1 root root      37 Nov 12 00:56 testfile.dat    -rw-r--r--. 1 root root 10530

linux基础正则表达式、shell基础、文件查找和压缩

linux基础正则表达式.shell基础.文件查找和压缩 1.shell编程显示电脑的基本信息,初级基础脚本.只适合6.7版本的. COLOR="\033[1;36m" COLOREND="\033[0m" echo -e "CPU type is $COLOR `lscpu |grep 'Model name'|tr -s ' '|cut -d: -f2`$COLOREND" echo -e "Disk space is $COLOR

Linux之shell基础

Shell基础 一.shell概述 1) shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求以便运行程序的界面系统级程序,用户可以用shell来启动.挂起.停止甚至是编写一些程序. 我们输入的abc...24个字符是通过shell对照ASCII码翻译成二进制来让计算机识别的.我们从操作界面上输入命令,这个命令回车之后把此命令对照ASCII码翻译成指定的二进制,通过shell翻译成计算机内核能识别的二进制,然后内核调用硬件来处理,处理完之后再通过shell反馈给用户. 2)