当前位置: 首页 > Linux

[LinuxTools]查询工具

时间:2023-04-06 07:10:39 Linux

findformatfindpath-命令参数[输出形式]path:告诉find在哪里找到你想要的命令参数:参考如下输出形式:多种输出形式,-print,-printf,-print,-exec,-ok,-ls等参数说明-name按文件名搜索文件。-perm按文件权限查找文件。-user按所有者查找文件。-prune使用该选项使查找命令不在当前指定的目录中搜索。如果同时使用-depth选项,-prune选项会被find命令忽略。-group按文件所属的组查找文件。-mtime-n+n根据文件的更改时间查找文件,-n表示文件更改时间是从现在起n天以内,+n表示文件更改时间是从现在起n天前,如果是n,表示从现在开始的第n个天空。find命令也有-atime和-ctime选项,但它们与-mtime选项类似,所以这里只介绍-mtime选项。-nogroup查找不具有有效组的文件,即该文件所属的组在/etc/groups中不存在。-nouser查找没有有效所有者的文件,即文件的所有者不存在于/etc/passwd中。-较新的文件1!file2查找更改时间比file1新但比file2早的文件。-type查找某种类型的文件,如:b-块设备文件。d-目录。c-一个字符设备文件。p-管道文件。l-符号链接文件。f-普通文件。s-socketfile-sizen[c]搜索文件长度为n块的文件,c表示文件长度以字节为单位。-depth查找文件时,首先在当前目录中查找文件,然后在其子目录中查找。-fstype查找位于特定类型文件系统中的文件。这些文件系统类型通常可以在配置文件/etc/fstab中找到,其中包含了本系统中文件系统的信息。-mount查找文件时不要跨文件系统挂载点。-follow如果find命令遇到符号链接文件,则跟随链接指向的文件。-cpio在匹配文件上使用cpio命令将它们备份到磁带设备。输出形式-execfind命令在匹配的文件上执行此参数给出的其他linux命令。对应命令的形式为'command-and'{}\;注意{}和\;之间的空格。它以;终止作为结束标志,所以这条命令后面的分号是必不可少的。考虑到分号在各个系统中含义不同,所以在前面加一个反斜杠。{}花括号代表之前find找到的文件名。-ok和-exec功能一样,只不过是和人交互。在执行OK之前,他们会确认是否要执行。常见例子#查看$HOME下的.txt文件并显示find~-name"*.txt"#查看大写字母开头的文件find.-name"[A-Z]*"#检查两个小写字母和两个以数字开头的txt文件find.-name"[a-z][a-z][0–9][0–9].txt"#检查755权限的文件$find.-perm755#查找774权限的文件并修改执行lsl命令find。-perm774-execlsl{}\;#设置目录为750find/www-typed-execchmod750{}\;#设置非目录文件为并设置为640find/www!-typed-execchmod640{}\;#查找大于10Mb的文件find/-size+10000k#查找昨天修改过的文件(仅昨天)find/-mtime1#删除找到的文件find/-name*.php-execrm-i{}\;#在当前目录下查找文件,不在aaa结尾的目录下,不在gz结尾的目录下查找find.-name"*.gz"-prune-o\(\!-nameaaa\)#查找5分钟内修改过的文件find.-mmin-5#查找变化时间比log2012.log更新但比log2017.log更早的文件find-newerlog2012.log!-较新的日志2017。log#查找变化时间比log2012.log文件更新的文件find.-newerlog2012.log-print#find命令从文件系统的根目录开始,查找名为CON.FILE的文件。find/-name"CON.FILE"-depth-print#使用find命令时,可能希望先匹配所有文件,然后在子目录中搜索。可以使用depth选项使find命令执行此操作。一个原因是在使用find命令将文件系统备份到磁带时,希望先备份所有文件,再备份子目录下的文件。#搜索文件并按升序仅显示文件名。查找./-name"null_*"-execbasename{}\;|sort#在当前目录下查找.log文件,找到包含“error”的行find./-typef-name"*.log"|xargsgrep-r"error"#找到文件并移动到指定目录find.-name"*.log"-execmv{}..\;#把找到的文件移动到上层目录#如果想在test目录下找文件,又不想在test/test3目录下找findtest-path"test/test3"-prune-o-print#避免多个文件夹:在test中查找,忽略test4和test3目录findtest\(-pathtest/test4-o-pathtest/test3\)-prune-o-print#括号表示表达式组合。\表示引号,即指示shell不要对后面的字符进行特殊解释,留给find命令解释其含义。#查找某个文件,在-o后加上-name等选项findtest\(-pathtest/test4-o-pathtest/test3\)-prune-o-name"*.log"-print#-oIt表示or,-a表示and,-not表示相反#在$HOME目录下查找属主为zhouzhou的文件find~-userzhouzhou-printxargs是在使用find命令的-exec选项时匹配的当找到文件时,find命令将所有匹配的文件传递给exec执行。但是有些系统对可以传给exec的命令长度有限制,所以find命令运行几分钟后,就会出现溢出错误。错误消息通常是“参数列太长”或“参数列溢出”。这就是xargs命令发挥作用的地方,尤其是find命令。xargs也被称为管道命令、构造参数等,它是一个给命令传递参数的过滤器,也是一个组合多个命令的工具。它将数据流分成足够小的块,以便于过滤器和命令进行处理。简单的说就是将其他命令给它的数据作为参数传递给它后面的命令。find命令将匹配到的文件传递给xargs命令,而xargs命令每次只获取文件的一部分而不是全部,不像-exec选项那样。这样它就可以先处理第一批获取的文件,然后再处理下一批,依此类推。在某些系统中,使用-exec选项会启动一个相应的进程来处理每一个匹配的文件,而不是一次性将所有匹配的文件作为参数执行;这样,在某些情况下会出现进程过多,系统性能下降的问题,所以效率不高;使用xargs命令时,只有一个进程。另外,使用xargs命令时,是一次获取所有参数还是分批获取,以及每次获取参数的个数,将根据该命令的选项和系统内核中对应的可调参数来决定。主要参数-i用{}替换传递的数据-istring用字符串替换传递的数据-n[number]设置每次传递多少行数据-n选项限制单个命令行的参数个数-t显示执行详情-p交互模式-Pn最大允许线程数为n-s[size]设置传递参数的最大字节数(小于131072字节)-x大于-s最大长度设置结束xargs命令执行xargsinstance#将当前目录下的php文件,改名[root@localhost~]#ls|grep.php|xargs-imv{}{}.bakfind结合xargsexample#找到系统中的每一个普通文件,然后用xargs命令分别测试它们属于什么类型的文件[root@localhosttest]#ll总计312-rw-r--r--1rootroot30210811-0306:19log2012.log-rw-r--r--1rootroot011-1222:25log2013.log-rw-r--r--1rootroot011-1222:25log2014.logdrwxr-xr-x6rootroot409610-2701:58scfdrwxrwxrwx2rootroot409611-1219:32test3drwxrwxrwx2rootroot409611-1219:32test4[root@localhosttest]#找到.-typef-打印|xargsfile./log2014.log:empty./log2013.log:empty./log2012.log:ASCIItext#删除当前文件夹中的tmp文件find./-name"*.tmp"|xargs-irm-rf{}#删除该目录下的所有普通文件find./-typef-print0|xargs-0rm#在整个系统中查找内存信息转储文件(coredump),然后保存结果在/tmp/core.log文件中找到/-name"core"-print|xargsecho"">/tmp/core.log#查找当前目录下所有具有读、写、执行权限的文件,并取回对应的写权限find.-perm-7-打印|xargschmodo-w#使用grep命令在所有正常文件中搜索单词hostnamefind.-typef-打印|xargsgrep"hostname"#使用grep命令在当前目录下的所有普通文件中查找hostnames这个词find.-name\*-typef-打印|xargsgrep"hostnames"#注意:\用于取消shell中find命令中*的特殊含义#使用xargs执行mvfind。-名称“*.log”|xargs-imv{}test4#findXargs提示后执行xargs:argumentlinetoolong解决办法find.-typef-atime+0-print0|xargs-l1-trm-f#-l1是一次处理一个;-t是在处理前打印出命令#使用-i参数默认输出用{}替换,-i参数可以指定其他替换字符,比如例子中的[][root@localhosttest]#ll总共12[root@localhosttest4]#find.-名称“文件”|xargs-I[]cp[]..[root@localhosttest4]#lltotal304-rw-r--r--1rootroot30210811-1222:54log2012.log-rw-r--r--1rootroot6111-1222:54log2013.log-rw-r--r--1rootroot011-1222:54log2014.log[root@localhosttest4]#cd..[root@localhosttest]#lltotal316-rw-r--r--1rootroot30210811-1306:03log2012.log-rw-r--r--1rootroot6111-1306:03log2013.log-rw-r--r--1rootroot011-1306:03log2014.logdrwxr-xr-x6rootroot409610-2701:58scfdrwxrwxr-x2rootroot409611-1305:50test3drwxrwxr-x2rootroot409611-1305:50test4#使用xargs的-p参数,执行安全模式,这样每一行都必须确认才能进行下一步[root@localhosthome]#lltotal60-rw-r--r--1rootroot47919Sep514:14log1.txt.bak.bak-rw-r--r--1rootroot32Sep514:14sort2。TXT。bak.bak-rw-r--r--1rootroot57Sep514:14sort.txt.bak.bakdrwxr-xr-x2rootroot6Sep514:15testdrwxr-xr-x3rootroot208月29日18:52wwwroot-rwxr--r--1rootroot14Sep514:14yha.txt.bak.bak[root@localhosthome]#find.-名称\*.bak|xargs-p-imv{}./test/mv./log1.txt.bak.bak./test/?...ymv./sort2.txt.bak.bak./test/?...ymv。/排序.txt。bak.bak./test/?...ymv./yha.txt.bak.bak./test/?...ylocatelocate命令实际上是“find-name”的另一种写法,但是比后者快的原因就是它不搜索具体的目录,而是搜索一个数据库(/var/lib/locatedb),里面包含了本地所有的文件信息Linux系统自动创建这个数据库,每天更新一次,所以用locate命令是找不到最新变化的文件的。为了避免这种情况,可以在使用locate之前使用updatedb命令手动更新数据库。注意这个命令需要安装yum-yinstallmlocateupdatedb#注意是mac中的另一种调用方式/usr/libexec/locate.updatedb常见的例子#搜索etc目录下所有sh开头的文件locate/etc/sh#搜索用户主目录下所有m开头的文件locate~/m#搜索用户主目录下所有m开头的文件,不区分大小写。locate-i~/mwhereiswhereis命令只能用来搜索程序名,只能搜索二进制文件(-b,也就是说看某个命令在什么目录),man描述文件(参数-m)和源代码文件(参数-s)。如果省略该参数,则返回所有信息。命令参数-b定位可执行文件。-m定位帮助文件。-s定位源代码文件。-u在默认路径中搜索除可执行文件、源代码文件和帮助文件以外的文件。-B指定搜索可执行文件的路径。-M指定搜索帮助文件的路径。-S指定搜索源代码文件的路径。常用例子whereis-msvn#找出文档的路径whereis-ssvn#找到源文件whereis-bsvn#找到svn命令所在的目录whichwhichcommand用于搜索路径中的系统由命令的PATH变量位置指定并返回第一个搜索结果。也就是说,通过which命令,可以看到某个系统命令是否存在,以及命令执行到哪里了。常见例子#查找文件,显示命令路径whichpwd#使用which查找which[root@localhosthome]#whichaliaswhich='alias|/usr/bin/which--tty-only--read-alias--show-dot--show-tilde'/usr/bin/alias/usr/bin/which#有两个,其中一个是alias这就是所谓的“命令别名”,意思是其输入将等于后面的字符串命令typetype命令,实际上并不是搜索命令。用来区分一个命令是由shell本身提供的,还是由shell外部的一个独立的二进制文件提供的。如果命令是外部命令,使用-p参数显示命令的路径,相当于which命令。参数-a显示一个名字的所有可能-t判断一个名字当前是否是别名、关键字、函数、内置、文件-p检查外部命令的执行路径-P检查内部命令路径返回别名alias关键字关键字,Shell保留Word函数函数,Shell函数builtin内置命令,Shell内置命令文件file,磁盘文件,外部命令unfoundCommonexamplenotfound[root@localhosthome]#typecdcdisashellbuiltin#cdistheshell的内置命令(build-in)[root@localhosthome]#typelocateis/usr/bin/locate[root@localhosthome]#type-plocate/usr/bin/locate