find命令查找目录名中查找名为变量

【图文】查找命令 111122linux_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
查找命令 111122linux
登录百度文库,专享文档复制特权,财富值每天免费拿!
你可能喜欢博主最新文章
博主热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)请问,FindPic 找图命令中区域坐标可以用变量么? _ 有问有答 - 按键精灵论坛
软件版本:2014.05软件大小:21.6M更新时间:07-04
软件版本:3.2.9软件大小:62.5M更新时间:12-07
软件版本:1.3.1软件大小:29.2M更新时间:09-29
软件版本:1.1.0软件大小:12.3M更新时间:12-29
查看: 895|回复: 2
试了好久也不好用,是不是不能用呢??FindPic 0,0,,&D:\新建文件夹\,.bmp&,0.9,xx,yyIf xx & 0 And yy & 0 ThenEnd IfDelay 500FindPic 135,200,xx,yy+20,&D:\新建文件夹\2.bmp&,0.9,intX,intYIf intX & 0 And intY & 0 Then
MessageBox &11111&
Delay 500MoveTo intX,intYEnd If
管理人员按键论坛的管理团队专属勋章学有所成学有所成勋章,新手步入按键学堂的第一枚勋章黄瓜勋章(永久)体验商业小精灵活动的奖励年全勤论坛连续打卡签到365次以上(365天)幸运草勋章(永久)商业小精灵限时活动勋章。微博达人(90天)完成新浪微博加V的奖励,结合活动不定期开放申请。按键精灵开发者6级(新浪V认证)通过新浪微博加V后自动发放,并替换普通的认证6级勋章。 按键14周年庆纪念勋章按键14周年庆纪念勋章(360天)单身汪勋章单身贵族的专属勋章双十一绝版纪念勋章双十一绝版纪念勋章猴年勋章猴年专属“大圣”勋章过大年勋章俩小福娃给大家拜年啦!
范围用变量是可以正常使用的
错误可能出在 你第一个找图没找到 可以试试 直接赋值变量
然后在用变量当做范围找图
为了庆祝按键精灵安卓版v3.0的发布,特开展分享得好礼活动哦!http://bbs.anjian.com/showtopic-.aspx
闽网文 (-037号下次自动登录
现在的位置:
& 综合 & 正文
find与grep命令简介及正则表达式
find与grep命令简介及正则表达式
  两个更为有用的命令和正则表达式
  在我们开始学习新的Shell编程知识之前,我们先来看一下两个更为有用的两个命令,这两个命令虽然并不是Shell的一部分,但是在进行Shell编程时却会经常用到.随后我们会来看一下正则表达式.
  我们先来看的是find命令.这个命令对于我们用来查找文件时是相当有用的,但是对于Linux新手来说却有一些难于使用,在一定程序是由于他所带的选项,测试,动作类型参数,而且一个参数的执行结果会影响接下来的参数.在我们深入这些选项和参数之前,我们先来看一个非常简单的例子.假如在我们的机子上有一个文件wish.我们来进行这个操作时要以root身份来运行,这样就可以保证我们可以搜索整个机子:
# find / -name wish -print/usr/bin/wish#
  正如我们可以想到的,他会打印出搜索到的结果.很简单,是不是?然而,他却需要一定的时间来运行,因为他也会同时搜索网络上的Window机器上的磁盘.Linux机器会挂载大块的Window机器的文件系统.他也会同时那些位置,虽然我们知道我们要查找的文件位于Linux机器上.这也正是第一个选项的用武之地.如果我们指定了-mount选项,我们就可以告诉find命令不要搜索挂载的目录.
# find / -mount -name wish -print/usr/bin/wish#
这样我们仍然可以搜索这个文件,但是这一次并没有搜索挂载的文件系统.
find命令的完整语法如下:
find [path] [options] [tests] [actions]
path是一个很简单的部分:我们可以使用绝对路径,例如/bin,或者是使用相对路径,例如.. .如果我们需要我们还可以指定多个路径,例如 find /var /home
主要的一些选项如下:-depth
在查看目录本身以前要先搜索目录中的内容-follow
跟随符号链接-maxdepths N
在搜索一个目录时至多搜索N层-mount(或-xdev)
不要搜索其他的文件系统
  下面的是一些test的选项.我们可以为find命令指定大量的测试,并且每一个测试会返回真或是假.当find命令工作时,他会考查顺序查找到的文 件,并且会在这个文件上按顺序进行他们所定义的测试.如果一个测试返回假,find命令会停止他当前正在考查的文件并继续进行下面的动作.我们在下表中列 出的只是一些我们最常用到的测试,我们可以通过查看手册页得到我们可以利用find命令使用的可能的扩展列表项.
N天以前访问的文件-mtime N
N天以前修改的文件-name pattern
除了路径,与指定的类型匹配的文件名.为了保证指定的类型传递给find命令而并不是立即被Shell赋值,指定的类型必须用引号进行引用.-newer otherfile
与otherfile文件相比要新的文件-type C
C类型的文件,而这里的C可以指定的一种类型.最常用的是d代表目录,而f是指普通的文件.对于其他的文件类型,我们可以查看手册页.-user username
指定的用户所拥有的文件我们也可以使用运算符进行测试的组合.大多数的有两种格式:短格式和长格式.!
测试的反-a
所有的测试必须为真-o
测试中某一个为真
  我们可以使用括号来强行改变测试和运算符的次序.因为这些对于Shell来说有着特殊的意义,所以我们也需要使用反斜线将他们作为一个整体进行引用. 另外, 如果我们为文件名指定了匹配类型,我们也必须用引号进行引用,这样就可以避免他们被Shell进行扩展,从而可以将他们直接传递给find命令.所以如果 我们要写一个这样的测试,要查找比X文件要近或者是以一个范围开头的文件,我们要写成下面的形式:
/(-newer X -o -name “_*” /)
现在我们要试着在当前的目录下查找最近修改日期比while2更近的文件,我们可以用下面的命令:
$ find . -newer while2 -print../elif3./words.txt./words2.txt./_trap$
  我们在上面所用的命令看起来似乎不错,但是我们却同时也搜索了当前的目录文件,而这并不是我们所希望的,我们所感兴趣只是常规文件.所以我们可以加上另外一个测试-type f:
$ find . -newer while2 -type f -print./elif3./words.txt./words2.txt./_trap$
  这些命令是如何进行工作的呢?我们指定find命令应该在当前的目录下进行查找(.),而我们所要查找的是比while2更新的文件(-newer while2),而且如果已经传递了测试,还要测试这个文件是否为一个常规文件(-type -f).最后,我们使用我们以前用过的动作,-print,仅仅是来验证我们所找到的文件.
  下面我们要查找的文件或者是以下划线开头的或者是要比while2文件新的文件,但是也必须为一个常规文件.这个例子可以向我们展示如何来进行测试的组合:
$ find . /( -name “_*” -or -newer while2 /) -type f -print./elif3./words.txt./words2.txt./_break./_if./_set./_shift./_trap./_unset./_until$
  这时我们可以看到这并不是一件很难的事情,不是这样吗?我们必须转义圆括号,这样他就不会被Shell所保护,同时用引号引用*,这样他就可以直接传递给find命令了.
  既然我们现在能够可靠的查找文件,下面我们就来看一下当我们查找指定的文件时我们可以进行的一些协作.我们要再一次强调,我们在这里所列出的只是一些最常用的选项,我们可以查看手册页得到全部的集合.
-exec command
执行一个命令.这是我们最常执行的动作.-ok command
与-exec相类似,所不同的只是他会提示用户在执行将要执行的命令之前进行命令的确认.-print
打印出文件名-ls
使用ls命令列出当前的文件-exec和-ok命令会同一行的参数子序列作为他的参数的一部分,直到遇到一个终结符/;序列.对于-exec和-ok来说字符串{}是珍上特殊的类型,而且会为当前文件的绝对路径所替换.
这样的解释也许并不是太认人容易理解,但是一个例子也许可以很好的来说明这些.
如下面的一个简单的例子:
$ find . -newer while2 -type f -exec ls -l {} /;-rwxr-xr-x
275 Feb 8 17:07 ./elif3-rwxr-xr-x
336 Feb 8 16:52 ./words.txt-rwxr-xr-x
1274 Feb 8 16:52 ./words2.txt-rwxr-xr-x
504 Feb 8 18:43 ./_trap$
  正如我们现在所看到的,find命令是相当有用的.要用好这个命令只需要一些简单的练习.然而这样的练习也许要付一定的代价,所以我们应做一些find命令的实验.
  我们将要看到的第二个非常有用的命令为grep命令,这是一个并不常见的名字,他是通用正则表达式解析器的简称(General Regular Expression Parser).我们使用find命令在我们的系统是查找所需的文件,但是我们却要使用grep命令在文件中查找指定的字符串.而事实上,最常用的做法就 是当我们在使用find命令时将grep作为一个命令传递给-exec.
grep命令可以带选项,匹配的模式以及我们要在其中查找的文件:grep [options] PATTERN [FILES]如果并没有指定文件名,他就会搜索标准输入.让我们从grep命令的主要的选项开始.我们在这里列出的只是一些主要的选项,我们可以从手册中得到更为详细的内容说明.
打印出匹配行的总数,而不是打印出匹配的行-E
打开扩展表达式-h
禁止将在其中查找到匹配内容的文件名作为输出行的前缀-i
忽略大小写-l
列出带用匹配行的文件名,而不是输出实际的匹配行-v
将匹配类型转换为选择不匹配的行而不是匹配的行如下面的一些例子:$ grep in words.txtWhen shall we three meet again. In thunder, lightning, or in rain?I come, Graymalkin!$ grep -c in words.txt words2.txtwords.txt:2words2.txt:14$ grep -c -v in words.txt words2.txtwords.txt:9words2.txt:16$
  第一个例子中并没有指定选项,grep命令只是简单在的words.txt文件中查找字符串in,并且打印出所匹配的行.在这里并没有打印出文件名,这是因为在这里我们只是使用了一个文件.在第二个例子中打印出在两个不同的中匹配行的总数,在这种情况就要打印出文件名.在最后的一个例子中我们使用了-v选项来转换查找的条件并且打印出在两个文件中不匹配的总行数.
正则表达式
  正是我们所看到的,grep命令的基本用法是比较容易掌握的.现在我们要来看一下基本的正则表达式,这会允许我们做一些更为复杂的匹配.正如我们在前面所提到的,正则表达式是用在Linux或是共他的一些开源中的语言.我们可以在vi或是在编写Perl脚本时使用.
在正则表达式的使用过程中,一些字符会被以不同的方式进行处理.最常见的一些用法如下:
在一行的开头$
在一行的结尾.
任意一个单一字符[]
方括号中所包含是字母的范围,其中的任何一个都可以进行匹配,例如a-e的字母范围,或者是我们可以使用^来进行反义.如果我们要将他们作为普通的字符来使用就要在这些字符前面加上/.所以如果我们要查找一个$字符,我们就要使用/$来进行查找.
下面的是一些可以在方括号中使用的比较有用的特殊匹配:
字母数字字符[:alpha:]
字母[:ascii:]
ASCII字符[:blank:]
空格或是Tab[:cntrl:]
ASCII码控制字符[:digit:]
数字[:graph:]
非控制,非空格字符[:lower:]
小写字母[:print:]
可打印字符[:punct:]
标点字符[:space:]
空白字符,包括垂直Tab[:upper:]
大写字符[:xdigit:]
十六进制数字
  另外,如果同时使用-E选项指定了扩展匹配,在正则表达式的后面也许会跟一些其他的控制匹配类型组合的字符.如果我们只是想将他们作为普通的字符进行使用,我们也要在其前面加上转义符/.
可选的匹配,但是最多匹配一次*
必须匹配0个或是多个项目+
必须匹配1个或是多个项目{n}
必须匹配n次{n,}
必须匹配n次或是更多次{n,m}
匹配范围为n次到m次,包括m次
  这些内容看起来有一些复杂,但是如果我们循序渐进,我们就会发现事实上这些内容并不如我们在第一眼看到时那样的复杂.最简单的掌握正则表达式的方法就是简单的试一些例子:
如果我们要查找以字符e结尾的行我们可以用下面的命令:
$ grep e$ words2.txtArt thou not, fatal vision, sensibleI see thee yet, in form as palpableNature seems dead, and wicked dreams abuse$
  正如我们所看到的,这个命令会搜索出以e结尾的匹配行.现在假设我们要查找以字母a结尾的单词.要达到这个目的,我们在方括号中使用特殊的匹配.在这样的情况下,我们要使用[[:blank:]],这会测试一个空格或是一个Tab:
$ grep a[[:blank:]] words2.txtIs this a dagger which I see before me,A dagger of the mind, a false creation,Moves like a ghost. Thou sure and firm-set earth,$
  现在假设我们要查找一个以Th开头的三个字母的单词.在这种情况下,我们需要同时使用[[:space:]]来决定一个单词的结尾并使用.来匹配另外的一个字母:
$ grep Th.[[:space:]] words2.txtThe handle toward my hand? Come, let me clutch thee.The curtain’ witchcraft celebratesThy very stones prate of my whereabout,$
  最后我们要使用扩展的grep命令来查找10个字符长的小写字母的单词.在这里我们要指定一个字符的范围的来匹配a到z,同时指定字符的10次重复:
$ grep -E [a-z]/{10/} words2.txtProceeding from the heat-oppressed brain?And such an instrument I was to use.The curtain’ witchcraft celebratesThy very stones prate of my whereabout,$
  我们在这里只是接触正则表达式一些相对来说更为重要的一部分.正如在Linux中的其他的大多数的内容,在这之外会许多的文档来帮助我们要发现更为详细的内容,但是学习正则表达式的最好的方法就是要实验这些表达式.
  当我们编写脚本时,我们常常需要在Shell脚本中取得命令执行结果的结果来使用.也就说我们需要执行一个命令并将这个命令的输出结果放在一个变量 中.这时我们可以使用我们在前面的set命令的例子中所介绍的$(command)语法.这也是一个相对较老的格式,而最常使用的用法是 `command`格式.
  所有新的脚本应使用$(...)的格式,这可以用来避免一些相当复杂的在反引号命令中使用$,`,/所造成的转换规则.如果在`...`结构中使用了 反引号,我们就需要使用/进行转义.这些相对模糊的字符会使得程序感到迷惑,有时甚至是一些经验丰富的程序也不得不进行一些试验以使得在反引号命令中的引 号可以正确的进行工作.
$(command)命令的结果只是简单的命令的输出.在这里我们要注意的是这并不是这个命令的返回状态,而是输出的字符串.如下面的例子:
#!/bin/shecho The current directory is $PWDecho The current users are $(who)exit 0
  因为当前的目录是一个Shell环境变量,所以第一行并不需要使用这种命令执行结构.然而,who命令的执行结果,如果希望他在这个脚本中可见,我们就要使用这种命令结构.
如果我们希望将他们的结果放在一个变量中,我们可以像平常一样将他们赋值给一个变量:
whoisthere=$(who)echo $whoisthere
  将一个命令的执行结果放在一个脚本变量中的能力是相当强大的,因为这样就可以很容易的在脚本中使用现在的命令并取得他们的输出.如果你发现在你正在试 着转换一个标准命令在标准输出上的输出结果的参数集合并将他们作为一个程序的参数,你就会发现命令xargs会帮助你完成这一切.可以查看手册页得到更深 更详细的内容.有时会出现的一个问题就是我们要调用的命令会在我们所希望的文本出现之前输出了一些空白符,或者是比我们所希望的更多的内容.在这样的情况下,我们可以使用我们在前面所说到的set命令.
  我们已经使用了expr命令,这可以允许处理简单的算术命令,但是他的执行是相当的慢的,因为在处理expr命令时需要调用一个新的Shell.
  一个新的更好的替换就是$((...))扩展.通过将我们所希望的表达式包在括号里以便在$((...))中进行赋值,我们可以进行更为有效的简单算术.
如下面的例子:
#!/bin/shx=0while [ “$x” -ne 10 ]; do
x=$(($x+1))doneexit 0
我们在前面已经看到了参数分配与扩展的最简单形式,在那里我们是这样写的:
foo=fredecho $foo
  当我们要在一个变量的结尾处加上另外的一个字符时却会发生问题.假设我们要写一个简短的脚本来处理名为1_tmp和2_tmp的文件,我们可以试着用下面的脚本来处理:
#!/bin/shfor i in 1 2do
my_secret_process $i_tmpdone
但是在每一个循环中,我们会得到下面的信息:
my_secret_process: too few arguments
发生了什么错误呢?
  问题就在于Shell会试着将变量$i_tmp用他的变量值进行替换,但是却并不存在这个变量.而Shell并不会认为这是一个错误,而只是用空值来 进行替换,所以并没有参数传递给my_secret_process.要将$i的扩展保护为变量的一部分,我们需要将i放在一对花括号中:
#!/bin/shfor i in 1 2do
my_secret_process ${i}_tmpdone
  这样以后在第一个循环中,i的值会用${i}进行替换,从而给出一个实际的文件名.这样我们就已经将一个参数的值替换为一个字符串了.
  我们可以在Shell中进行许多的替换.常常这样的方法会为参数的处理问题提供一个优雅的解决方法.
常用到的一些如下表:
${parm:-default}
如果一个参数为空,则将他设定为一个默认值.${#parm}
给出参数的长度.${parm%word}
从末尾开始,移除与word相匹配的最小部分并返回其余的部分.${parm%%word}
从末尾开始,移除与word相匹配的最长部分并返回其余的部分.${parm#word}
从开头开始,移除与word相匹配的最小部分并返回其余的部分.${parm##word}
从开头开始,移除与word相匹配的最长部分并返回其余的部分.
  这些替换对于我们要处理字符串来说是相当有用的.而最后的四个可以用来移除字符串中的部分内容,而这对于处理文件名和路径是更为有用的.如下面的一些例子中所示的:
#!/bin/shunset fooecho ${foo:-bar}foo=fudecho ${foo:-bar}foo=/usr/bin/X11/startxecho ${foo#*/}echo ${foo##*/}bar=/usr/local/etc/local/networksecho ${bar%local*}echo ${bar%%local*}exit 0
如果我们运行这个脚本我们会得到下面的输出结果:
barfudusr/bin/X11/startxstartx/usr/local/etc/usr
  第一个句子,${foo:-bar},会为foo的值指定为bar,因为当这个语句开始执行时并没有为foo指定任何值.foo的值会保持不变直到他遇到unset语句.
在这里我们有一些需要我们注意的内容:
${foo:=bar}将会设置变量$foo.这个字符串运算符会检测foo存在并且不为空值.如果他不为空,则会返回他的值,但是如果是相反的情况,就会将foo的值设为bar并且会返回替换的结果值.${foo:?bar}会打印出foo: bar,而如果foo并不存在或是他被设为空值则会退出命令.最后,${foo:+bar},如果foo存在并且不为空则会返回bar.{foo#*/}语句进行匹配并且只是移除左面的内容(在这里我们要记住*匹配0个或是多个字符).{foo##*/}进行匹配并会移除尽可能多的内容,所以他会移除了最右面的/以及他前面的所有字符.{bar%local*}语句匹配从右面开始直到第一次出现local的字符,而{bar%%local*}会从右面开始匹配尽可能多的字符,直到第一次发现local.
  因为Unix和Linux都比较强的依赖于过滤的概念,所以我们常常要将一个操作的执行结果进行手工重定向.假设我们要使用cjpeg命令将一个GIF的文件转换为JPEG的文件:
$ cjpeg image.gif & image.jpg
也许有时我们会在大量的文件上进行这样的操作.这时我们如何自动重定向?我们可以很容易的这样来做:
#!/bin/shfor image in *.gifdo
cjpeg $image & ${image%%gif}jpgdone
这个脚本可以将当前目录下的每一个GIF文件转换成为JPEG文件.
【上篇】【下篇】12490人阅读
find & path & & expression & & cmd &
path: 所要搜索的目录及其所有子目录。默认为当前目录。expression: 所要搜索的文件的特征。cmd: 对搜索结果进行特定的处理。
如果什么参数也不加,find默认搜索当前目录及其子目录,并且不过滤任何结果(也就是返回所有文件),将它们全都显示在屏幕上。
find命令常用选项及实例
-name 按照文件名查找文件。
find /dir -name filename
在/dir目录及其子目录下面查找名字为filename的文件
find . -name "*.c" 在当前目录及其子目录(用“.”表示)中查找任何扩展名为“c”的文件
-perm 按照文件权限来查找文件。
find . -perm 755 –print 在当前目录下查找文件权限位为755的文件,即文件属主可以读、写、执行,其他用户可以读、执行的文件
-prune 使用这一选项可以使find命令不在当前指定的目录中查找,如果同时使用-depth选项,那么-prune将被find命令忽略。
find /apps -path "/apps/bin" -prune -o –print 在/apps目录下查找文件,但不希望在/apps/bin目录下查找
find /usr/sam -path "/usr/sam/dir1" -prune -o –print 在/usr/sam目录下查找不在dir1子目录之内的所有文件
-depth:在查找文件时,首先查找当前目录中的文件,然后再在其子目录中查找。
find / -name "CON.FILE" -depth –print 它将首先匹配所有的文件然后再进入子目录中查找
-user 按照文件属主来查找文件。
find ~ -user sam –print 在$HOME目录中查找文件属主为sam的文件
-group 按照文件所属的组来查找文件。
find /apps -group gem –print 在/apps目录下查找属于gem用户组的文件
-mtime -n +n 按照文件的更改时间来查找文件, -n表示文件更改时间距现在n天以内,+n表示文件更改时间距现在n天以前。
find / -mtime -5 –print 在系统根目录下查找更改时间在5日以内的文件
find /var/adm -mtime +3 –print 在/var/adm目录下查找更改时间在3日以前的文件
-nogroup 查找无有效所属组的文件,即该文件所属的组在/etc/groups中不存在。
find / –nogroup -print
-nouser 查找无有效属主的文件,即该文件的属主在/etc/passwd中不存在。
find /home -nouser –print
-newer file1 ! file2 查找更改时间比文件file1新但比文件file2旧的文件。-type 查找某一类型的文件,
b - 块设备文件。
d - 目录。
c - 字符设备文件。
p - 管道文件。
l - 符号链接文件。
f - 普通文件。
find /etc -type d –print 在/etc目录下查找所有的目录
find . ! -type d –print 在当前目录下查找除目录以外的所有类型的文件
find /etc -type l –print 在/etc目录下查找所有的符号链接文件
-size n[c] 查找文件长度为n块的文件,带有c时表示文件长度以字节计。
find . -size +1000000c –print 在当前目录下查找文件长度大于1 M字节的文件
find /home/apache -size 100c –print 在/home/apache目录下查找文件长度恰好为100字节的文件
find . -size +10 –print 在当前目录下查找长度超过10块的文件(一块等于512字节)
-mount:在查找文件时不跨越文件系统mount点。
find . -name “*.XC” -mount –print 从当前目录开始查找位于本文件系统中文件名以XC结尾的文件(不进入其他文件系统)-follow:如果find命令遇到符号链接文件,就跟踪至链接所指向的文件-exec,find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为’command’ {} \;,注意{}和\;之间的空格$ find ./ -size 0 -exec rm {} \; 删除文件大小为零的文件
$ rm -i `find ./ -size 0`
$ find ./ -size 0 | xargs rm -f &
为了用ls -l命令列出所匹配到的文件,可以把ls -l命令放在find命令的-exec选项中:
$ find . -type f -exec ls -l {} \;
在/logs目录中查找更改时间在5日以前的文件并删除它们:
find /logs -type f -mtime +5 -exec rm {} \;
-ok,和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。
find . -name "*.conf"
-mtime +5 -ok rm {
} \; 在当前目录中查找所有文件名以.LOG结尾、更改时间在5日以上的文件,并删除它们,只不过在删除之前先给出提示
说明: 如果你要寻找一个档案的话,那么使用 find 会是一个不错的主意。不过,由于 find 在寻找数据的时候相当的耗硬盘,所以没事情不要使用 find 啦!有更棒的指令可以取代呦,那就是 whereis 与 locate 咯~
一些常用命令
1. find . -type f -exec ls -l {} \;
查找当前路径下的所有普通文件,并把它们列出来。
2. find logs -type f -mtime +5 -exec rm {} \;
删除logs目录下更新时间为5日以上的文件。
3.find . -name "*.log" -mtime +5 -ok rm {} \;
删除当前路径下以。log结尾的五日以上的文件,删除之前要确认。
4. find ~ -type f -perm 4755 -print
查找$HOME目录下suid位被设置,文件属性为755的文件打印出来。
说明: find在有点系统中会一次性得到将匹配到的文件都传给exec,但是有的系统对exec的命令长度做限制,就会报:”参数列太长“,这就需要使用xargs。xargs是部分取传来的文件。
5. find / -type f -print |xargs file
xargs测试文件分类
6. find . -name "core*" -print|xargs echo " "&/tmp/core.log
将core文件信息查询结果报存到core。log日志。
7. find / -type f -print | xargs chmod o -w
8. find . -name * -print |xargs grep "DBO"
grep [选项] pattern [文件名]
命令中的选项为:
-? 同时显示匹配行上下的?行,如:grep -2 pattern filename 同时显示匹配行的上下2行。-b,—byte-offset 打印匹配行前面打印该行所在的块号码。-c,—count 只打印匹配的行数,不显示匹配的内容。-f File,—file=File 从文件中提取模板。空文件中包含0个模板,所以什么都不匹配。-h,—no-filename 当搜索多个文件时,不显示匹配文件名前缀。-i,—ignore-case 忽略大小写差别。-q,—quiet 取消显示,只返回退出状态。0则表示找到了匹配的行。-l,—files-with-matches 打印匹配模板的文件清单。-L,—files-without-match 打印不匹配模板的文件清单。-n,—line-number 在匹配的行前面打印行号。-s,—silent 不显示关于不存在或者无法读取文件的错误信息。-v,—revert-match 反检索,只显示不匹配的行。-w,—word-regexp 如果被\&和&引用,就把表达式做为一个单词搜索。-V,—version 显示软件版本信息。ls -l | grep '^a' 通过管道过滤ls -l输出的内容,只显示以a开头的行。
grep 'test' d* 显示所有以d开头的文件中包含test的行。
grep 'test' aa bb cc 显示在aa,bb,cc文件中匹配test的行。
grep '[a-z]' aa 显示所有包含每个字符串至少有5个连续小写字符的字符串的行。
grep 'w(es)t.*' aa 如果west被匹配,则es就被存储到内存中,并标记为1,然后搜索任意个字符(.*),这些字符后面紧跟着另外一个es(),找到就显示该行。如果用egrep或grep -E,就不用""号进行转义,直接写成'w(es)t.*'就可以了。
grep -i pattern files :不区分大小写地搜索。默认情况区分大小写
grep -l pattern files :只列出匹配的文件名,
grep -L pattern files :列出不匹配的文件名,
grep -w pattern files :只匹配整个单词,而不是字符串的一部分(如匹配‘magic’,而不是‘magical’),
grep -C number pattern files :匹配的上下文分别显示[number]行,
grep pattern1 | pattern2 files :显示匹配 pattern1 或 pattern2 的行,
grep pattern1 files | grep pattern2 :显示既匹配 pattern1 又匹配 pattern2 的行。
pattern为所要匹配的字符串,可使用下列模式
. 匹配任意一个字符
* 匹配0 个或多个*前的字符
^ 匹配行开头
$ 匹配行结尾
[] 匹配[ ]中的任意一个字符,[]中可用 - 表示范围,
例如[a-z]表示字母a 至z 中的任意一个
\ 转意字符
【xargs定位参数位置 | xargs控制参数位置 | 如何定位控制xargs参数位置】
管道 + xargs用于把上游输出转换为下游参数输入。
例如 ls *.bak | xargs rm -f
xargs默认把输入作为参数放到命令的最后,但是很多命令需要自己定位参数的位置,比如拷贝命令cp {上游结果} destFolder
解决方法:
xargs 使用大写字母i 定义参数指示符 -I &指示符&,然后用这个参数指示符定位参数插入的位置, 例如:
ls *.bak | xargs -I % cp % /tmp/test
注释:这里使用%作为指示符,第一个%可以理解为声明,第二个%可以理解为调用。你也可以用其他字符,比如 ls
*.bak | xargs -I {} cp {} /tmp/test
之所以能用到xargs这个命令,关键是由于很多命令不支持|管道来传递参数,而日常工作中有有这个必要,所以就有了xargs命令,例如:
find /sbin -perm +700 | ls -l
这个命令是错误的
find /sbin -perm +700 | xargs ls -l
这样才是正确的
xargs 可以读入 stdin 的资料,并且以空白字元或断行字元作为分辨,将 stdin 的资料分隔成为 arguments 。 因为是以空白字元作为分隔,所以,如果有一些档名或者是其他意义的名词内含有空白字元的时候, xargs 可能就会误判了~
-0 当sdtin含有特殊字元时候,将其当成一般字符,像/ ‘ 空格等
root@localhost:~/test#echo "//"|xargs
root@localhost:~/test#echo "//"|xargs -0 echo
-a file 从文件中读入作为sdtin
root@localhost:~/test#cat test#!/bin/shecho "hello world/n"
root@localhost:~/test#xargs -a test echo#!/bin/sh echo hello world/n
root@localhost:~/test#
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
root@localhost:~/test#cat txt
/bin tao shou kun
root@localhost:~/test#cat txt|xargs -E 'shou' echo
-p 当每次执行一个argument的时候询问一次用户。
root@localhost:~/test#cat txt|xargs -p echoecho /bin tao shou kun ff ?...y
/bin tao shou kun ff
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的
root@localhost:~/test#cat txt|xargs -n1 echo
root@localhost:~/test3#cat txt|xargs
/bin tao shou ku
-t 表示先打印命令,然后再执行。
root@localhost:~/test#cat txt|xargs -t echoecho /bin tao shou kun
/bin tao shou kun
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给{},可以用{}代替。
$ ls | xargs -t -i mv {} {}.bak
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
root@localhost:~/test#echo ""|xargs -t -r
root@localhost:~/test#
-s num 命令行的最大字符数,指的是xargs后面那个命令的最大命令行字符数
root@localhost:~/test#cat test |xargs -i -x
-s 14 echo "{}"
xargs: argument line too long
root@localhost:~/test#
-L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。-l 同-L-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符
root@localhost:~/test#cat txt |xargs -i -p echo {}echo /bin tao shou kun ?...y
root@localhost:~/test#cat txt |xargs -i -p -d " " echo {}echo /bin ?...y
echo tao ?.../bin
echo shou ?...tao
root@localhost:~/test#cat test |xargs -i -p -d " " echo {}echo exp1
root@localhost:~/test#cat test |xargs -i -p echo {}echo exp1 ?...y
echo exp5 ?...exp1
echo file ?...exp5
-x exit的意思,主要是配合-s使用。-P 修改最大的进程数,默认是1,为0时候为as many as it can
其他查找命令
1. locate命令
locate命令其实是“find -name”的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
locate命令的使用实例:
$ locate /etc/sh
搜索etc目录下所有以sh开头的文件。
$ locate -i ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
2. whereis命令
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
whereis命令的使用实例:
$ whereis grep
grep: /bin/grep /usr/share/man/man1p/grep.1p.gz /usr/share/man/man1/grep.1.gz
3. which命令
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which命令的使用实例:
$ which grep
文章:14篇
阅读:251487
阅读:6721
文章:14篇
阅读:113192
阅读:3408}

我要回帖

更多关于 find命令递归查找 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信