Linux中find常见用法示例
Linux中find常见用法示例
·findpath-option[-print][-exec-okcommand]{}\;
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命令将它们列出
=================================================
在/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
1)在/tmp中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名
A)find/tmp-name"*.h"|xargs-n50grepSYSCALL_VECTOR
B)grepSYSCALL_VECTOR/tmp/*.h|cut-d’:'-f1|uniq>filename
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"
Linux-all,Linux|NoComments»
find实例
四月18th,2006
要在/usr/linux中查找所有的*.h,并在这些文件中查找“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的文件名,有以下几种方法实现
find/usr/linux-name"*.h"|xargs-n50grepSYSCALL_VECTOR
grepSYSCALL_VECTOR/usr/linux/*.h|cut-d’:’-f1|uniq>filename
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==IFNAM&&i_namtype==IFSEM*/
#definei_sdi_un.isd/*i_ftype==IFNAM&&i_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=%ld\n",fname,buf.st_mtime);
strcpy(date,ctime((time_t*)&(buf.st_mtime)));
printf("mtime(indate)of%s=%s\n",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.