当前位置: 首页 > 科技观察

关于查找命令的15个超级有用示例

时间:2023-03-17 20:56:15 科技观察

find命令用于在Linux命令行中搜索文件和目录。find是最强大和最常用的命令之一,也是选项最多的命令之一,它有50多个选项,很容易混淆,尤其是当它与exec或xargs命令一起使用时。作为系统管理员或软件开发人员,在命令行工作时难免会用到find命令。所以,与其畏难逃避,不如从中前行,拥抱它的力量。在本文中,我们将分享一些有关find命令的常见示例。但在此之前,让我们看一下它的语法以及如何使用它。Linux中的find命令find命令的一般语法是:find[要搜索的目录][选项][表达式]方括号[]中的所有内容都是可选的,即可以不带任何选项和参数进行搜索。运行查找命令。但是这样只会打印出当前路径下的所有文件和目录,用处不大吧?让我们仔细看看它的参数。directorytosearch:要搜索的目录,基本上就是我们要开始搜索的地方。默认情况下,搜索是递归的(也搜索子目录),从当前位置开始;options:选项,指定搜索类型,可以按文件名、文件类型、修改时间等进行搜索,这里有50多个选项;表达式:指定的搜索词。如果要按文件名查找,那么搜索词就是文件名;如果要查找名称与表达式匹配的文件,请在此处使用表达式。请参阅以下示例:查找。-typef-namemyfile此命令将在当前目录及其子目录中搜索,查找名为myfile的文件(不是目录)。选项-typef表示只搜索文件,单点.表示当前目录。按名称查找文件和目录您可以按名称搜索文件和目录:find。-nameSEARCH_NAME由于没有指定文件类型,它搜索具有给定名称的文件和目录。以下示例查找名为mystuff的文件和目录:[gliu@fedorawork]$find-namemystuff./new/mystuff./mystuff仅查找文件或目录如果只想查找文件,则需要指定文件类型-女:寻找。-typef-nameSEARCH_NAME类型和名称的顺序无关紧要。在前面的例子中,只查找文件,可以使用如下命令:[gliu@fedorawork]$find-typef-namemystuff./mystuff如果只查找目录,那么指定type-d:find。-typed-nameSEARCH_NAME如上例所示,如果您只是查找目录,请使用以下命令:[gliu@fedorawork]$find-typed-namemystuff./new/mystuff执行不区分大小写的搜索默认情况下,查找命令区分大小写。如果我们想执行不区分大小写的搜索,我们可以使用-iname而不是-name:find。-typef-inameSEARCH_NAME这也可以与-d选项一起使用。[gliu@fedorawork]$find-inamemystuff./new/mystuff./MyStuff./mystuff按扩展名搜索(重要)find命令最常见的用途之一是查找指定类型的文件,或者按照带有要搜索的文件扩展名。比如我们要搜索当前目录下的所有C++文件,而C++文件的扩展名是.cpp,那么我们可以这样搜索:find.-typef-name"*.cpp"这样我们就告诉find命令要查找的类型是一个以.cpp结尾的文件。[gliu@fedora工作]$找到.-typef-name"*.cpp"./file.cpp./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream2/zstream_test.cpp。/.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/test.cpp./.cargo/registry/src/github.com-1ecc6299db9ec823/libz-sys-1.1.3/src/zlib/contrib/iostream/zf注意:使用find命令时,需要将表达式放在双引号内。为什么要将表达式放在双引号中?因为否则,shell会扩展通配符,将其替换为当前目录中所有以.cpp结尾的文件。例如当前目录下有两个文件:file1.cpp、file2.cpp,那么执行如下命令:find.-typef-name*.cpp将由shell扩展为:find。-typef-namefile1.cpp对于file2.cpp,shell会提示:find:pathsmustpreceedexpression:'file1.cpp'find:possibleunquotedpatternafterpredicate'-name'?另外,如果当前目录下只有一个扩展名为.cpp的文件,那也没关系。搜索具有多个扩展名(或条件)的多个文件上面的命令搜索具有给定扩展名的文件。那么如果要同时搜索不同扩展名的文件怎么办呢?您可以使用逻辑或(OR)-o来运行查找命令:find。-typef-name"*.cpp"-o-name"*.txt"这将搜索扩展名为.cpp或.txt的文件:[gliu@fedorawork]$find.-typef-name"*.txt"-o-name"*.cpp"./new.txt./file.cpp./new/new.txt./new/dir2/another.txt./new/dir1/new.txt./another.txt在指定目录下搜索文件我们上面的例子都是在当前目录下搜索,因为我们指定了.作为命令中的当前路径。点。可以替换为绝对路径或相对路径。这样我们就可以在不离开当前路径的情况下找到指定目录下的文件。[gliu@fedorawork]$find./new-namemystuff./new/mystuff在多个目录中搜索文件如果您认为您要查找的文件可能在多个位置,而不是多次运行find命令次,只需在find命令中输入只需指定要搜索的所有目录路径即可:find./location1/second/location-typef-name"pattern"来查找空文件和目录-empty选项允许您使用find命令查找空文件和目录。例如,要查找当前路径下的所有空文件和目录,可以使用以下命令:find。-empty也可以指定要搜索的文件类型,只搜索文件或目录:find。-empty-typef也可以与文件名结合使用:find。-empty-typef-name"*.cpp"查找大文件或小文件(根据文件大小搜索)根据文件大小进行搜索,可以找到大文件或小文件。但这仅适用于文件,不适用于目录。要根据文件的大小进行搜索,可以使用-size选项后接一个值N(即文件的大小),+N查找大于N的文件,-N查找小于N的文件。例如,要查找大小恰好为50KB的文件:find.-size50k在当前路径下查找大于1G的文件:find.-size+1G查找小于20字节的文件(注意单位是c而不是b):find.-size-20c要查找大于100MB但小于2GB的文件:查找.-size+100M-size-2G另外,也可以按名称搜索。例如,要在根目录下查找以.log结尾且大于500MB的文件,可以使用如下命令:find/-size+500M-name"*.log"文件大小值的单位N:c:bytes(字节)k:kilobytes(千字节)M:Megabytes(兆字节)G:Gigabytes(GB)查找最近修改的文件(根据修改或创建时间搜索)下面简单介绍一下mtime、atime和ctime的概念:mtime:上次修改文件的时间;ctime:文件创建的时间;atime:上次访问文件的时间。我们经常有查找最近修改过的文件的需求。这时候我们可以通过修改时间来查找文件。例如,要查找在3天(3*24H)内修改的所有文件:查找.-typef-mtime-3例如,要查找5天前创建的文件:find.-typef-ctime+5上面的命令是以天为单位的。那么如果你想搜索几分钟前修改过的文件怎么办?可以使用mmin、amin和cmin。例如,要查找在5分钟内修改过的文件,可以使用以下命令:find。-typef-mmin-5此外,还可以结合名称并指定时间上下限进行搜索。例如,以下命令将搜索在过去20分钟到30分钟内修改过的所有.java文件:-typef-mmin+20-mmin-30-name"*.java"查找具有特定文件权限的文件find命令允许您搜索具有特定权限的文件。find-permmode例如查找当前路径下权限模式为777的所有文件:find。-perm777查找具有读写权限的文件(完全匹配,如果文件权限为读、写、执行则不匹配):find.-perma=r+wfindfind根据文件的user也可以根据文件的ownership来查找。例如,要在当前路径中搜索用户John拥有的文件:find。-typef-userJohn当然也可以和其他选项(如文件大小、时间、名称等)结合使用:find.-typef-userJohn-name"*.cpp"不要递归搜索,只在当前目录中搜索默认情况下,find命令在当前位置的所有子目录中搜索。如果不需要,可以将搜索深度指定为1。这会将搜索仅限于当前目录,不包括任何子目录。寻找。-maxdepth1-typef-name"*.txt"从搜索中排除目录如果要从搜索中排除目录,可以将它与-path、-prune和-o:find结合使用。-path"./directory_exclude/*"-prune-o-nameSEARCH_NAME注意路径中的星号*,-prune选项在路径之后,-o选项在prune之后。基本上,prune命令要求不使用path指定的值,它总是与-o一起使用,以确保-o的右侧仅针对未排除的目录。使用find命令的输出(使用exec和xargs)到目前为止,我们已经介绍了使用find命令查找文件的一些标准方法。此外,还可以通过对find命令的结果执行一些操作来改进它。例如,找到符合特定名称模式的文件并立即重命名它们,或者找到空文件并删除它们。我们知道管道重定向可用于将一个命令的输出与另一个命令的输入结合起来。但这对find命令的输出不起作用,至少不能直接起作用。如果你想对find命令的结果进行操作,你有两个选择,exec和xargs。使用find和exec如果我们想使用ls-l列出find的结果,请参见以下示例:find。-typef-name"*.txt"-execls-l{}+以下是输出:[gliu@fedorawork]$find.-typef-name"*.txt"-execls-l{}+-rw-rw-r--1gliugliu39Oct1319:30./another.txt-rw-rw-r--1gliugliu13年10月35日15:36./new/dir1/new.txt-rw-rw-r--1gliugliu13年10月35日15:36./new/dir2/another.txt-rw-rw-r--1gliugliu13年10月35日18:51./new/mystuff/new.txt-rwxrwxrwx1gliugliu13年10月35日15:37./new/new.txt-rw-rw-r--1gliugliu13年10月35日18:16./new.txt不要忘记exec命令最后的{}+,注意{}和+之间的空格。花括号{}指的是find命令的结果,您可以将其视为{file1,file2,file3}。加号+用于终止exec命令。exec有另一个约定:find。-typef-name*.txt"-execls-l上面命令中,分号;用来代替加号+,分号前的反斜杠\用来转义特殊字符。{的优点}+是运行的命令少,相当于ls-lfile1file2file3;而{}\相当于运行ls-lfile1,ls-lfile2,ls-lfile3。但是,{}\;有在同一exec语句中多次使用{}的优点。例如,以下命令将重命名所有找到的具有.old扩展名的文件:find.-typef-name*.txt"-execmv{}{}。oldusingxargs许多Linux用户习惯于管道重定向。这个带有尾随{}+的exec命令对他们来说似乎不太习惯。这是xargs命令的值。你只需要将find命令的输出通过管道解析到xargs命令:find。xargs命令的使用,此外,你还可以使用find和grep命令。Find和grep是任何系统管理员或软件开发人员最常用和最有用的组合之一。可以使用find命令查找文件,然后使用grep命令搜索这些文件的内容。比如我们要搜索所有包含“Alice”这个词的txt文件,那么我们可以这样搜索:find.-typef-name"*.txt"-exec同样,也可以使用xargs命令:find。-typef-name"*.txt"当然,这是最简单的例子。如果您熟悉grep命令,则可以根据需要和喜好使用它。find命令的用法也有很多,我们列举了一些比较常用的。当您熟悉find命令后,您可以在各种情况下使用它。