Linux下各种查找命令(find, grep, which, whereis, locate)

find命令

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命令

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参数位置】

背景

管道 + 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含有特殊字元时候,将其当成一般字符,像/ ‘ 空格等

    [email protected]:~/test#echo "//"|xargs  echo
    [email protected]:~/test#echo "//"|xargs -0 echo
    /
    
  • -a file 从文件中读入作为sdtin
    [email protected]:~/test#cat test#!/bin/shecho "hello world/n"
    [email protected]:~/test#xargs -a test echo#!/bin/sh echo hello world/n
    [email protected]:~/test#
  • -e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
    [email protected]:~/test#cat txt
    /bin tao shou kun
    [email protected]:~/test#cat txt|xargs -E ‘shou‘ echo
    /bin tao
    
  • -p 当每次执行一个argument的时候询问一次用户。
    [email protected]:~/test#cat txt|xargs -p echoecho /bin tao shou kun ff ?...y
    /bin tao shou kun ff
    
  • -n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的
    [email protected]:~/test#cat txt|xargs -n1 echo
    /bin
    tao
    shou
    kun
    [email protected]:~/test3#cat txt|xargs  echo
    /bin tao shou ku
    
  • -t 表示先打印命令,然后再执行。
    [email protected]:~/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,不用再去执行了。
    [email protected]:~/test#echo ""|xargs -t -r  mv
    [email protected]:~/test#
  • -s num 命令行的最大字符数,指的是xargs后面那个命令的最大命令行字符数
    [email protected]:~/test#cat test |xargs -i -x  -s 14 echo "{}"
    exp1
    exp5
    file
    xargs: argument line too long
    linux-2
    [email protected]:~/test#
  • -L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
  • -l 同-L
  • -d delim 分隔符,默认的xargs分隔符是回车argument的分隔符是空格,这里修改的是xargs的分隔符
    [email protected]:~/test#cat txt |xargs -i -p echo {}echo /bin tao shou kun ?...y
    [email protected]:~/test#cat txt |xargs -i -p -d " " echo {}echo /bin ?...y
    echo tao ?.../bin
    y
    echo shou ?...tao
    再如:
    [email protected]:~/test#cat test |xargs -i -p -d " " echo {}echo exp1
    exp5
    file
    linux-2
    ngis_post
    tao
    test
    txt
    xen-3
    ?...y
    [email protected]:~/test#cat test |xargs -i -p echo {}echo exp1 ?...y
    echo exp5 ?...exp1
    y
    echo file ?...exp5
    y
    
  • -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
/bin/grep
时间: 2024-10-29 19:05:42

Linux下各种查找命令(find, grep, which, whereis, locate)的相关文章

linux下的查找命令

whereis <程序名称> 查找软件的安装路径 -b 只查找二进制文件 -m 只查找帮助文件 -s 只查找源代码 -u 排除指定类型文件 -f 只显示文件名 -B <目录> 在指定目录下查找二进制文件 -M <目录> 在指定目录下查找帮助文件 -S <目录> 在指定目录下查找源代码 locate <文件名称> 在文件索引数据库中搜索文件 -d <数据库路径> 搜索指定数据库 updatedb 更新文件索引数据库 find [路径]

【转】linux下find查找命令用法

原文链接 http://www.jb51.net/os/RedHat/1307.html Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时间来了解一下.即使系统中含有网络文件系统( NFS),find命令在该文件系统中同样有效,只你具有相应的权限. 在运行一个非常消耗资源的find命令时,很多人都倾向于把它放在后台执行,因为遍历一个大的文件系统可

linux下find查找命令用法

一.Linux中find常见用法示例 ·find    path    -option    [    -print ]    [ -exec    -ok    command ]    {} ;#-print 将查找到的文件输出到标准输出#-exec    command    {} ;       -----将查到的文件执行command操作,{} 和 ;之间有空格#-ok 和-exec相同,只不过在操作前要询用户 =====================================

linux下文本查找命令及正则表达式

马哥说了,学不好正则表达式不是linux的问题,是智商的问题. 下面我们来讨论一下在linux下面怎么查找文本,用什么方法查找文本,用什么命令查找文本,这里我们要用到的两个命令是 grep.egrep和fgrep.首先我们要了解一下什么是grep grep: grep的英文全称是global search REgular expression and print out the line. 意思就是说 全面搜索正则表达式并把行打印出来,全面搜索和把行打印出来我们都懂,正则表达式等会再讲,我们先来

linux下的find文件查找命令与grep文件内容查找命令

linux下的find文件查找命令与grep文件内容查找命令 在使用linux时,经常需要进行文件查找.其中查找的命令主要有find和grep.两个命令是有区的. 区别:(1)find命令是根据文件的属性进行查找,如文件名,文件大小,所有者,所属组,是否为空,访问时间,修改时间等. (2)grep是根据文件的内容进行查找,会对文件的每一行按照给定的模式(patter)进行匹配查找. 一.find命令 基本格式:find  path expression 1.按照文件名查找 (1)find / -

linux下批量查找/替换文本内容

一般在本地电脑上批量替换文本有许多工具可以做到,比如sublime text ,但大多服务器上都是无图形界面的,为此收集了几条针对linux命令行 实现批量替换文本内容的命令: 1.批量查找某个目下文件的包含的内容,例如: #   grep -rn "要找查找的文本" ./ 2.批量查找并替换文件内容. #   sed -i "s/要找查找的文本/替换后的文本/g" `grep -rl "要找查找的文本" ./` linux下批量查找/替换文本内

linux下如何查找nginx配置文件的位置

nginx的配置放在nginx.conf文件中,一般我们可以使用以下命令查看服务器中存在的nginx.conf文件. locate nginx.conf /usr/local/etc/nginx/nginx.conf /usr/local/etc/nginx/nginx.conf.default ... 如果服务器中存在多个nginx.conf文件,我们并不知道实际上调用的是哪个配置文件,因此我们必须找到实际调用的配置文件才能进行修改. 查看nginx实际调用的配置文件 1.查看nginx路径

Linux下使用ps命令来查看Oracle相关的进程

Linux下可以使用ps命令来查看Oracle相关的进程 Oracle Listener 这个命令会列出Oracle Net Listener的进程 [[email protected] www.linuxidc.com ~]$ ps -ef | grep tnslsnr oracle    1999 29986  0 09:47 pts/2    00:00:00 grep tnslsnr oracle    3647     1  0 Jul03 ?        00:00:34 /u01

linux下的shell命令的编写,以及java如何调用linux的shell命令(java如何获取linux上的网卡的ip信息)

程序员都很懒,你懂的! 最近在开发中,需要用到服务器的ip和mac信息.但是服务器是架设在linux系统上的,对于多网口,在获取ip时就产生了很大的问题.下面是在windows系统上,java获取本地ip的方法.贴代码: package com.herman.test; import java.net.InetAddress; /** * @see 获取计算机ip * @author Herman.Xiong * @date 2014年5月16日 09:35:38 */ public class