linux find 的用法

2024-08-30 09:49:43

在linu优美x中,fi富态nd命令用将相本无种虎虎有生气于在指定的不亦乐乎目录下查找坐观成败文件,语法满腔热忱瞬息万变为“fin落笔妙天下d指定目敢怒不敢言录指定规斜眼则”;当使不慌不忙用该命令不慈祥设置任何参打蛇打七寸数时,该命胁肩谄笑令将在当前浓黑时髦目录下查找单薄子目录与文豁达件,并且将臃肿黑瘦查找到的子遮前掩后目录和文件陶醉全部显示出病急乱求医来。

小编还为您整理了以下内容,可能对您也有帮助:

Linux中find常见用法示例

find命令的参数;

pathname:find命令所查找的目录路径。例如用.来表示当前目录,用/来表示系统根目录。

-print:find命令将匹配的文件输出到标准输出。

-exec:find命令对匹配的文件执行该参数所给出的shell命令。相应命令的形式为'command'{};,注意{}和;之间的空格。

-ok:和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的shell命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。

#-print将查找到的文件输出到标准输出

#-execcommand{};—–将查到的文件执行command操作,{}和;之间有空格

#-ok和-exec相同,只不过在操作前要询用户

例:find.-name.svn|xargsrm-rf

====================================================

-namefilename#查找名为filename的文件

-perm#按执行权限来查找

-userusername#按文件属主来查找

-groupgroupname#按组来查找

-mtime-n+n#按文件更改时间来查找文件,-n指n天以内,+n指n天以前

-atime-n+n#按文件访问时间来查GIN:0px"

-ctime-n+n#按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup#查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser#查无有效属主的文件,即文件的属主在/etc/passwd中不存

-newerf1!f2找文件,-n指n天以内,+n指n天以前

-ctime-n+n#按文件创建时间来查找文件,-n指n天以内,+n指n天以前

-nogroup#查无有效属组的文件,即文件的属组在/etc/groups中不存在

-nouser#查无有效属主的文件,即文件的属主在/etc/passwd中不存

-newerf1!f2#查更改时间比f1新但比f2旧的文件

-typeb/d/c/p/l/f#查是块设备、目录、字符设备、管道、符号链接、普通文件

-sizen[c]#查长度为n块[或n字节]的文件

-depth#使查找在进入子目录前先行查找完本目录

-fstype#查更改时间比f1新但比f2旧的文件

-typeb/d/c/p/l/f#查是块设备、目录、字符设备、管道、符号链接、普通文件

-sizen[c]#查长度为n块[或n字节]的文件

-depth#使查找在进入子目录前先行查找完本目录

-fstype#查位于某一类型文件系统中的文件,这些文件系统类型通常可在/etc/fstab中找到

-mount#查文件时不跨越文件系统mount点

-follow#如果遇到符号链接文件,就跟踪链接所指的文件

-cpio%;#查位于某一类型文件系统中的文件,这些文件系统类型通常可在/etc/fstab中找到

-mount#查文件时不跨越文件系统mount点

-follow#如果遇到符号链接文件,就跟踪链接所指的文件

-cpio#对匹配的文件使用cpio命令,将他们备份到磁带设备中

-prune#忽略某个目录

=====================================================

$find~-name"*.txt"-print#在$HOME中查.txt文件并显示

$find.-name"*.txt"-print

$find.-name"[A-Z]*"-print#查以大写字母开头的文件

$find/etc-name"host*"-print#查以host开头的文件

$find.-name"[a-z][a-z][0–9][0–9].txt"-print#查以两个小写字母和两个数字开头的txt文件

$find.-perm755-print

$find.-perm-007-execls-l{};#查所有用户都可读写执行的文件同-perm777

$find.-typed-print

$find.!-typed-print

$find.-typel-print

$find.-size+1000000c-print#查长度大于1Mb的文件

$find.-size100c-print#查长度为100c的文件

$find.-size+10-print#查长度超过期作废10块的文件(1块=512字节)

$cd/

$findetchomeapps-depth-print|cpio-ivcdC65536-o/dev/rmt0

$find/etc-name"passwd*"-execgrep"cnscn"{};#看是否存在cnscn用户

$find.-name"yao*"|xargsfile

$find.-name"yao*"|xargsecho""/tmp/core.log

$find.-name"yao*"|xargschmodo-w

======================================================

find-nameapril*在当前目录下查找以april开始的文件

find-nameapril*fprintfile在当前目录下查找以april开始的文件,并把结果输出到file中

find-nameap*-o-namemay*查找以ap或may开头的文件

find/mnt-nametom.txt-ftypevfat在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件

find/mnt-namet.txt!-ftypevfat在/mnt下查找名称为tom.txt且文件系统类型不为vfat的文件

find/tmp-namewa*-typel在/tmp下查找名为wa开头且类型为符号链接的文件

find/home-mtime-2在/home下查最近两天内改动过的文件

find/home-atime-1查1天之内被存取过的文件

find/home-mmin+60在/home下查60分钟前改动过的文件

find/home-amin+30查最近30分钟前被存取过的文件

find/home-newertmp.txt在/home下查更新时间比tmp.txt近的文件或目录

find/home-anewertmp.txt在/home下查存取时间比tmp.txt近的文件或目录

find/home-used-2列出文件或目录被改动过之后,在2日内被存取过的文件或目录

find/home-usercnscn列出/home目录内属于用户cnscn的文件或目录

find/home-uid+501列出/home目录内用户的识别码大于501的文件或目录

find/home-groupcnscn列出/home内组为cnscn的文件或目录

find/home-gid501列出/home内组id为501的文件或目录

find/home-nouser列出/home内不属于本地用户的文件或目录

find/home-nogroup列出/home内不属于本地组的文件或目录

find/home-nametmp.txt-maxdepth4列出/home内的tmp.txt查时深度最多为3层

find/home-nametmp.txt-mindepth3从第2层开始查

find/home-empty查找大小为0的文件或空目录

find/home-size+512k查大于512k的文件

find/home-size-512k查小于512k的文件

find/home-links+2查硬连接数大于2的文件或目录

find/home-perm0700查权限为700的文件或目录

find/tmp-nametmp.txt-execcat{};

find/tmp-nametmp.txt-okrm{};

find/-amin-10#查找在系统中最后10分钟访问的文件

find/-atime-2#查找在系统中最后48小时访问的文件

find/-empty#查找在系统中为空的文件或者文件夹

find/-groupcat#查找在系统中属于groupcat的文件

find/-mmin-5#查找在系统中最后5分钟里修改过的文件

find/-mtime-1#查找在系统中最后24小时里修改过的文件

find/-nouser#查找在系统中属于作废用户的文件

find/-userfred#查找在系统中属于FRED这个用户的文件

查当前目录下的所有普通文件

#find.-typef-execls-l{};

-rw-r–r–1rootroot349282003-02-25./conf/httpd.conf

-rw-r–r–1rootroot129592003-02-25./conf/magic

-rw-r–r–1rootroot1802003-02-25./conf.d/README

查当前目录下的所有普通文件,并在-exec选项中使用ls-l命令将它们列出

1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名

Linux-all,Linux|NoComments»

find实例

要在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名,有以下几种方法实现

find/usr/linux-name"*.h"|xargs-n50grepSYSCALL_VECTOR

grepSYSCALL_VECTOR/usr/linux/*.h|cut-d’:’-f1|uniqfilename

find/usr/linux-name"*.h"-execgrep"SYSCALL_VECTOR"{};-print

我用find/-namefilename|rm-rf,不成功,请问为什么不成功?

find/-namefilename-execrm-rf{};

find.-namefilename|rm-rf试一下{}表示你找出来的结果。

;则相当于“”,没什么说头,就是这么规定的,在-exec后面需要一个表示该命令终结的的符号。可以在manfind中找到答案。

要让rm识别find的结果,如下:

find/-namefilename|xargsrm-rf

之所以find.-namefilename|rm-rf不通过,是因为rm命令不接受从标准输入传过来的指令

查找含特定字符串的文件

例如查找当前目录下含有"thestringyouwantfind…"字符串的文件:

$find.-typef-execgrep“thestringyouwantfind…”{};-print

从根目录开始查tmpfile,一旦查到马上删除

find/-name"tmpfile"-execrm{};

find的perm问题

请问一下以下命令什么意思?关键是那个数字前的-,其他都还知道

find-name".*"-perm-007

我知道

find-name".*"-perm755

这个是用来查找权限位为755的隐藏文件

噢,对了还有,我上边的命令都省略了find的pathname参数find默认是查找当前工作目录的吗?

如果我用-ok替代-exec,那么还需要加上{};吗?

这个已经清楚,仍然需要,因为-ok只是-exec的提示模式,它只是多了一个确认操作的步骤,刚才没有读懂那几句E文的意思呵呵不好意思

-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~

解释解释?

find-name".*"-perm-007和find-name".*"-perm777有区别吗?

-007是怎么来得呢?

不过有一个问题

我用find.-perm-100会列出当前目录.,这是为什么呢?

下面引用由explover在2002/10/0106:15am发表的内容:

-007是指查找所有用户都可读、写、执行的文件,要小心呀~~~

-007是查找含其它用户(不同组,非属主)可读,写,执行的文件.并不一定要同组可读写,-是指最少权限为007.

下面引用由一颗小白菜在2002/10/0110:16am发表的内容:

OK了,呵呵

不过有一个问题

我用find.-perm-100会列出当前目录.,这是为什么呢?

这种方法不会准确的找出目录的.-100是指权限至少是属主可运行.

在unix系统下,你可以拥有对目录文件的执行权你才可以进入一个目录.这便是目录文件被列出的原因.

find.-perm-001-print找到往往是目录文件.

我的意思当然不是使用这种方法来找目录,只不过不明白其中的-100意义了

那以此类推,是不是-010是指权限至少是owner同组可执行的吗?也就是说其实这里的010和-是分开的,-表示一个至少的意思,而且010才是真正用来描述权限位的?

这样子就明白了谢谢你噢

将find出来的东西拷到另一个地方?

find*.c-execcp‘{}’/tmp‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:

finddir-namefilename-print|cpio-pdvnewdir

找出磁盘中某个大小范围内的文件

比如要查找磁盘中大于3M的文件:

find.-size+3000k-execls-ld{};

如何用find查找某一天更改的文件?

可以使用这一行命令来实现:

A=`find~-print`|ls-l–full-time$A2/dev/null|grep"Jun27"|grep1998

使用find命令查找某个时间段的shell怎么写。比如11点到12点的。thanks

创建一个脚本judgetime,内容如下:

ls-l$*|awk‘{split($8,hour,":");if((hour[1]23||hour[1]1)hour[1]24)print}’

到要查找的目录下,运行

find./-name"*"-execjudgetime{};

注意时间格式为24小时制。

thankyou,如果我要精确到分钟呢

touch-t04241112starttemp#精确到12分钟

touch-t04241220endtemp#截止到12点20

find[dir]-newerstarttemp-a!-newerendtemp-execls-l{};

newer?

那昨天12:10文件如何呢?

每天执行的时候,用当天的日期和时间戳替换一下不就行了吗?

我不知道他是不是把所有的11:00~12:00的都找出来,是不是只执行一次还是每天都执行?

这种情况俺猜想是自己的东西放在哪忘了,只记得当时是深夜了。

有道理!

不愧是斑竹!

不光知道怎么解决问题,还知道在什么情况下出现这类问题,佩服佩服!

问题又出现了。创建这个文件的时候。本来应该是时间的一栏现在写上了2002,而不是12:00.

等到12:00过了吧!

删除指定日期的文件

find./-name文件名-execrm-f{};

例:删除当前30天内没用过的文件,用如下命令:

find/-atime+30-execrm-f{};

我自己试着写了一小段SHELL,也用ll,grep,rm几个命令,用起来还差强人意。

对过滤出来的文件名列表中用了一个FOR语句,再执行rm。现在我想把这段SHELL扩展一下让它每天定时运行将n天前的文件删掉,有没有人能给我一些提示,谢谢!

还有个问题,对于前面那位朋友提到的"find/-atime+30-execrm-f{};

"方法,我很早就试过几次,不过好像都不太对,参数-atimen是查找n天前被访问过的文件,我不明白的是这里的时间参照点是什么,以及这个n天是怎么计算的。

问题二、对于"ll|cut-f1"这个命令我是不是用错了,我只想取出ll中列出的文件名,但用cut-f命令做不到,我只好换用ll|cut-c59-这种方式得到我要的文件名,butit’sapoolidear!我也试过用awk,好像也不对,看看大家可不可以给我一些小小的提醒,TKSSOMUCH

问题三、如何改变I结点的日期格式我现在的系统显示的格式是:

-rw-r—–1msahz01users22532002年2月2日poheader.i

我想把这换成

-rw-rw-rw-1houseusers2193Apr192001hkdisp.p

如何才能做到这点?

awk应该可以

ll|awk‘{print$9}’

删除多少天之前的文件

find/yourpath-mtime+31-execrm{};

find/yourpath-mtime+366-execrm{};

find中,-ctime,-mtime及其-atime有何区别

请问-ctime和-mtime有什么关系?

如果父目录的ctime改变,那它下面的文件的ctime就会自动都改了吗?

-ctime和-mtime,-atime这些信息是存在哪儿呢?

我用-mtime-1找到了新建或改的文件.

但怎样才能找到一天内mv来的文件呢(它们的时间是原有的时间,早于一天)?

用-newer选项啊。

你可以先touch一个你想要的时间的文件如下:

$touch-t08190800test

$ls-ltest

-rw-r–r–1dbaother0Aug1908:00test

然后

$find.-newertest-print

.

./.sh_history

$ls-l.sh_history

-rw——-1dbaother154Aug2017:39.sh_history

用touch可以写出你想要的任何时间的文件,然后用-newer,!-newer选项即可成功。

1.ctime含inode信息修改的时间.mtime只指文件内容建立或修改的时间.

2不会.

3.这些信息应该是存在文件系统的超级块里.

我查了书-ctime是指inode的改变(或称文件的状态改变).

请问inode存了哪些信息?

做了些小测试,-mtime改,-ctime一定也改.

改文件名,-ctime也会改.

谁能回答i-node存了哪些东西?

vi/usr/include/sys/inode.h

班主,我不能access/usr/include/sys/inode.h.

摘书如下:

Directoriescontaindirectoryentries.Eachentrycontainsafileorsubdirectorynameandanindexnodereferencenumber(i-nodenumber).Toincreasespeedandenhanceuseofdiskspace,thedatainafileisstoredatvariouslocationsinthecomputer’smemory.Thei-nodecontainstheaddressesusedtolocateallthescatteredblocksofdataassociatedwithafile.Thei-nodealsorecordsotherinformationaboutthefileincludingtimeofmodificationandaccess,accessmodes,numberoflinks,fileowner,andfiletype.

可我发现-atime改了,-ctime还没改.why?

(我先cat一个ASCII文件,再用-atime-1有它用-ctime-1居然没有它.)

着岂不跟inode信息改变,ctime就改矛盾吗?

我不同意你贴出来的那段文章,正如我提到的那样,atime,ctime,mtime是放到超级块里,在scounix下是一种叫stat的结构.(stat_32),不同的系统文件系统可能不同.

sco下inode的结构如下:

typedefstructinode

{

structinode*i_forw;/*inodehashchain*/

structinode*i_back;/*‘’*/

structinode*av_forw;/*freelistchain*/

structinode*av_back;/*‘’*/

int*i_fsptr;/*"typeless"pointertofsdependent*/

ino32_ti_number;/*inumber,1-to-1withdevaddress*/

ushorti_ftype;/*filetype=IFDIR,IFREG,etc.*/

shorti_fstyp;/*Filesystemtype*/

off_ti_size;/*sizeoffile*/

ushorti_uid;/*owner*/

ushorti_gid;/*groupofowner*/

ushorti_flag;

ushorti_want;/*i_flagextensiontoavoidMPraces*/

ushorti_count;/*referencecount*/

shorti_nlink;/*directoryentries*/

dev_ti_rdev;/*Rawdevicenumber*/

#definei_namtypei_rdev/*i_ftype==IFNAMsubtype*/

dev_ti_dev;/*devicewhereinoderesides*/

structmount*i_mton;/*ptrtomounttableentrythat*/

/*thisdirectoryismountedon*/

structregion*i_rp;/*ptrtosharedregionifany*/

structstdata*i_sp;/*ptrtoassociatedstream*/

structiisem*isem;/*ptrtoXENIXsemaphores*/

structiisd*isd;/*ptrtoXENIXshareddata*/

}i_un;

#definei_mntoni_un.i_mton/*i_ftype==IFDIRIMOUNT*/

#definei_rptri_un.i_rp/*i_ftype==IFREG||i_ftype==IFBLK*/

#definei_sptri_un.i_sp/*i_ftype==IFCHR||i_ftype==IFIFO*/

#definei_semi_un.isem/*i_ftype==IFNAMi_namtype==IFSEM*/

#definei_sdi_un.isd/*i_ftype==IFNAMi_namtype==IFSHD*/

structfstypsw*i_fstypp;/*ptrtofilesystemswitchFSPTR*/

long*i_filocks;/*pointertofilock(structure)list*/

unsignedlongi_mappages;/*numberofpagescurrentlycached*/

unsignedlongi_vcode;/*read-aheadblocksave(NFS)*/

shorti_wcnt;/*writeopencountorITEXTcount*/

structlockbi_cilock;/*tastosynchronizei_flagchanges*/

ushorti_rdlocks;/*countofnon-exclusivelockers*/

}inode_t;

所以,访问一个文件不能改变inode信息.

使用chown,chgrp,chmod命令可以很好的比较mtime和ctime

chown改变一个文件的属主,用ctime可以找到,用mtime便找不到.

试试看.

多谢斑竹!我是在Solaris上面试的.我是对-ctime不明白.

试的结果如下:

修改文件,-mtime改了,-ctime也会改.

访问文件,-atime改了,-ctime没变.

chown,chgrp,chmod,mv,都会使-ctime改变,但不影响-atime和-mtime.

touch可以改-mtimeand/or-atime,但touch-a只改访问时间时,-ctime也改了.

touch-m改修改时间时,-ctime当然也改了.

好象还有别的很多东西可以令-ctime改变,搞不清楚.

有什么方法可以显示-mtime,atime,ctime吗?

可以用-ctime来实现对目录的增量文件进行备份或transfer吗?

多谢!

没有什么工具显示,(可能是俺不知道)

把下面程序里的st_mtime换成st_ctime,或st_atime便可以得到你要的了.

#include

int

main(intargc,char**argv)

{

structstatbuf;

chardate[80];

charfname[80];

printf("Enterfilename(withfullpath)tocheckmtime:");

scanf("%s",fname);

stat(fname,buf);

printf("mtime(insec)of%s=%ldn",fname,buf.st_mtime);

strcpy(date,ctime((time_t*)(buf.st_mtime)));

printf("mtime(indate)of%s=%sn",fname,date);

}

至于文件备份,有什么不可以的么?

mtimels-l最近修改文件内容的时间

atimels-lu最近访问文件的时间

ctimels-li最近文件有所改变的状态,如文件修改,属性属主改变,节点,链接变化等,应该是不拘泥只是时间前后的改变

俺看了ls的帮助,以为只是按ctime或atime排序,显示的时间还是mtime.

仔细比较了一下,ayhan说的是对的.谢谢ayhan.

多谢ahyan提示!我在Solaris上试过如下:

mtime用ls-l看到

atime用ls-lu看到

ctime用ls-lc看到.(ls-li只有inodenumber)

摘书如下:

-cUsestimeoflastmodificationofthei-node(file

created,modechanged,andsoforth)forsorting(-t)

orprinting(-lor-n).

-uUsestimeoflastaccessinsteadoflastmodification

forsorting(withthe-toption)orprinting(withthe

-loption).

-iForeachfile,printsthei-nodenumberinthefirst

columnofthereport.

A)find/tmp-name"*.h"|xargs-n50grepSYSCALL_VECTOR

B)grepSYSCALL_VECTOR/tmp/*.h|cut-d’:'-f1|uniqfilename

C)find/tmp-name"*.h"-execgrep"SYSCALL_VECTOR"{};-print

2)find/-namefilename-execrm-rf{};

find/-namefilename-okrm-rf{};

3)比如要查找磁盘中大于3M的文件:

find.-size+3000k-execls-ld{};

4)将find出来的东西拷到另一个地方

find*.c-execcp‘{}’/tmp‘;’

如果有特殊文件,可以用cpio,也可以用这样的语法:

finddir-namefilename-print|cpio-pdvnewdir

6)查找2004-11-3016:36:37时更改过的文件

#A=`find./-name"*php"`|ls-l–full-time$A2/dev/null|grep"2004-11-3016:36:37"

=================================================

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

$findlogs-typef-mtime+5-exec-okrm{};

=================================================

查询当天修改过的文件

[root@bookclass]#find./-mtime-1-typef-execls-l{};

=================================================

查询文件并询问是否要显示

[root@bookclass]#find./-mtime-1-typef-okls-l{};

ls…./classDB.inc.php?y

-rw-r–r–1cnscncnscn137091月1212:22./classDB.inc.php

[root@bookclass]#find./-mtime-1-typef-okls-l{};

ls…./classDB.inc.php?n

[root@bookclass]#

=================================================

查询并交给awk去处理

[root@bookclass]#who|awk’{print$1"t"$2}’

cnscnpts/0

=================================================

awk—grep—sed

[root@bookclass]#df-k|awk‘{print$1}’|grep-v’none’|seds"//dev///g"

文件系统

sda2

sda1

[root@bookclass]#df-k|awk‘{print$1}’|grep-v’none’

文件系统

/dev/sda2

/dev/sda1