Linux系统下⽤find命令查最近修改过的⽂件
Linux的终端上,没有windows的搜索那样好⽤的图形界⾯⼯具,但find命令确是很强⼤的。
⽐如按名字查⼀个⽂件,可以⽤ find / -name targetfilename 。唉,如果只知道名字,不知道地点,这样也不失为⼀个野蛮有效的⽅法。
按时间查也有参数 -atime 访问时间 -ctime 改变状态的时间 -mtime修改的时间。但要注意,这⾥的时间是以24⼩时为单位的。
查看man⼿册后使⽤,你会很迷惑: -mtime n: Files data was last modified n*24 hours ago. 字⾯上的理解是最后⼀次修改发⽣在n个24⼩时以前的⽂件,但实际上
find ./ -mtime 0:返回最近24⼩时内修改过的⽂件。
find ./ -mtime 1 :返回的是前48~24⼩时修改过的⽂件。⽽不是48⼩时以内修改过的⽂件。
那怎么返回10天内修改过的⽂件?find还可以⽀持表达式关系运算,所以可以把最近⼏天的数据⼀天天的加起来:
find ./ -mtime 0 -o -mtime 1 -o -mtime 2 ……虽然⽐较⼟,但也算是个⽅法了。
还有没有更好的⽅法,我也想知道。
另外, -mmin参数-cmin / - amin也是类似的。
Find应⽤实例
查最近30分钟修改的当前⽬录下的.php⽂件
find . -name '*.php' -mmin -30
查最近24⼩时修改的当前⽬录下的.php⽂件
find . -name '*.php' -mtime 0
查最近24⼩时修改的当前⽬录下的.php⽂件,并列出详细信息
find . -name '*.inc' -mtime 0 -ls
查当前⽬录下,最近24-48⼩时修改过的常规⽂件。
find . -type f -mtime 1
查当前⽬录下,最近1天前修改过的常规⽂件。
find . -type f -mtime +1
·find  path  -option  [  -print ]  [ -exec  -ok  command ]  {} \;
find命令的参数;
pathname: find命令所查的⽬录路径。例如⽤.来表⽰当前⽬录,⽤/来表⽰系统根⽬录。
-print: find命令将匹配的⽂件输出到标准输出。
-exec: find命令对匹配的⽂件执⾏该参数所给出的shell命令。相应命令的形式为'command' { } \;,注意{ }和\;之间的空格。
-ok:和-exec的作⽤相同,只不过以⼀种更为安全的模式来执⾏该参数所给出的shell命令,在执⾏每⼀个命令之前,都会给出提⽰,让⽤户来确定是否执⾏。
#-print 将查到的⽂件输出到标准输出
#-exec  command  {} \;      —–将查到的⽂件执⾏command操作,{} 和 \;之间有空格
#-ok 和-exec相同,只不过在操作前要询⽤户
例:find . -name .svn | xargs rm -rf
====================================================
-name  filename            #查名为filename的⽂件
-perm                        #按执⾏权限来查
-user    username            #按⽂件属主来查
-group groupname            #按组来查
-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中不存
-newer  f1 !f2              ⽂件,-n指n天以内,+n指n天以前
-ctime    -n +n              #按⽂件创建时间来查⽂件,-n指n天以内,+n指n天以前
-nogroup                    #查⽆有效属组的⽂件,即⽂件的属组在/etc/groups中不存在
-nouser                      #查⽆有效属主的⽂件,即⽂件的属主在/etc/passwd中不存
-newer  f1 !f2              #查更改时间⽐f1新但⽐f2旧的⽂件
-type    b/d/c/p/l/f        #查是块设备、⽬录、字符设备、管道、符号链接、普通⽂件
-size      n[c]              #查长度为n块[或n字节]的⽂件
-depth                      #使查在进⼊⼦⽬录前先⾏查完本⽬录
-fstype                    #查更改时间⽐f1新但⽐f2旧的⽂件
-type    b/d/c/p/l/f        #查是块设备、⽬录、字符设备、管道、符号链接、普通⽂件
-
size      n[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 .  -perm  755  -print
$find  .  -perm -007  -exec ls -l {} \;  #查所有⽤户都可读写执⾏的⽂件同-perm 777
$find  . -type d  -print
$find  .  !  -type  d  -print
$find  .  -type l  -print
$find  .  -size  +1000000c  -print        #查长度⼤于1Mb的⽂件
$find  .  -size  100c        -print      # 查长度为100c的⽂件
$find  .  -size  +10  -print              #查长度超过期作废10块的⽂件(1块=512字节)
$cd /
$find  etc  home  apps    -depth  -print  | cpio  -ivcdC65536  -o  /dev/rmt0
$find  /etc -name "passwd*"  -exec grep  "cnscn"  {}  \;  #看是否存在cnscn⽤户
$find . -name "yao*"  | xargs file
$find  . -name "yao*"  |  xargs  echo    "" > /tmp/core.log
$find  . -name "yao*"  | xargs  chmod  o-w
======================================================
find  -name april*                    在当前⽬录下查以april开始的⽂件
find  -name  april*  fprint file        在当前⽬录下查以april开始的⽂件,并把结果输出到file中
find  -name ap* -o -name may*  查以ap或may开头的⽂件
find  /mnt  -  -ftype vfat  在/mnt下查名称为且⽂件系统类型为vfat的⽂件
find  /mnt  - ! -ftype vfat  在/mnt下查名称为且⽂件系统类型不为vfat的⽂件
find  /tmp  -name wa* -type l            在/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  -newer              在/home下查更新时间⽐近的⽂件或⽬录
find /home  -anewer              在/home下查存取时间⽐近的⽂件或⽬录
find  /home  -used  -2                  列出⽂件或⽬录被改动过之后,在2⽇内被存取过的⽂件或⽬录
find  /home  -user cnscn                列出/home⽬录内属于⽤户cnscn的⽂件或⽬录
find  /home  -uid  +501                  列出/home⽬录内⽤户的识别码⼤于501的⽂件或⽬录
find  /home  -group  cnscn              列出/home内组为cnscn的⽂件或⽬录
find  /home  -gid 501                  列出/home内组id为501的⽂件或⽬录
find  /home  -nouser                    列出/home内不属于本地⽤户的⽂件或⽬录
find  /home  -nogroup                  列出/home内不属于本地组的⽂件或⽬录
find  /home    -    -maxdepth  4  列出/home内的 查时深度最多为3层
find  /home  -  -mindepth  3  从第2层开始查
find  /home  -empty                    查⼤⼩为0的⽂件或空⽬录
find  /home  -size  +512k                查⼤于512k的⽂件
find  /home  -size  -512k              查⼩于512k的⽂件
find  /home  -links  +2                查硬连接数⼤于2的⽂件或⽬录
find  /home  -perm  0700                查权限为700的⽂件或⽬录
find  /tmp  -  -exec cat {} \;
find  /tmp  -name    -ok  rm {} \;
find    /  -amin    -10    # 查在系统中最后10分钟访问的⽂件
find    /  -atime  -2        # 查在系统中最后48⼩时访问的⽂件
find    /  -empty            # 查在系统中为空的⽂件或者⽂件夹
find    /  -group  cat        # 查在系统中属于 groupcat的⽂件
find    /  -mmin  -5        # 查在系统中最后5分钟⾥修改过的⽂件
find    /  -mtime  -1      #查在系统中最后24⼩时⾥修改过的⽂件
find    /  -nouser          #查在系统中属于作废⽤户的⽂件
find    /  -user    fred    #查在系统中属于FRED这个⽤户的⽂件
查当前⽬录下的所有普通⽂件
# find . -type f -exec ls -l {} \;
-rw-r–r–    1 root      root        34928 2003-02-25  ./f
-rw-r–r–    1 root      root        12959 2003-02-25  ./conf/magic
-rw-r–r–    1 root      root          180 2003-02-25  ./conf.d/README
查当前⽬录下的所有普通⽂件,并在- e x e c选项中使⽤ls -l命令将它们列出
=================================================
在/ l o g s⽬录中查更改时间在5⽇以前的⽂件并删除它们:
$ find logs -type f -mtime +5 -exec  -ok  rm {} \;
=================================================
查询当天修改过的⽂件
[root@book class]# find  ./  -mtime  -1  -type f  -exec  ls -l  {} \;
=================================================
查询⽂件并询问是否要显⽰
[root@book class]# find  ./  -mtime  -1  -type f  -ok  ls -l  {} \;
< ls … ./classDB.inc.php > ? y
-rw-r–r–    1 cnscn    cnscn      13709  1⽉ 12 12:22 ./classDB.inc.php
[root@book class]# find  ./  -mtime  -1  -type f  -ok  ls -l  {} \;
< ls … ./classDB.inc.php > ? n
[root@book class]#
=================================================
查询并交给awk去处理
[root@book class]# who  |  awk  ’{print $1"\t"$2}’
cnscn    pts/0
=================================================
awk—grep—sed
[root@book class]# df  -k |  awk ‘{print $1}’ |  grep  -v  ’none’ |  sed  s"/\/dev\///g"
⽂件系统
sda2
sda1
[root@book class]# 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  -n50  grep SYSCALL_VECTOR
B) grep  SYSCALL_VECTOR  /tmp/*.h | cut    -d’:'  -f1| uniq > filename
C) find  /tmp  -name "*.h"  -exec grep "SYSCALL_VECTOR"  {}  \; -print
2)find / -name filename -exec rm -rf {} \;
find / -name filename -ok rm -rf {} \;
3)⽐如要查磁盘中⼤于3M的⽂件:
find . -size +3000k -exec ls -ld {} ;
4)将find出来的东西拷到另⼀个地⽅
find *.c -exec cp ‘{}’ /tmp ‘;’
如果有特殊⽂件,可以⽤cpio,也可以⽤这样的语法:
find dir -name filename -print | cpio -pdv newdir
6)查2004-11-30 16:36:37时更改过的⽂件
# A=`find ./ -name "*php"` |  ls -l –full-time $A 2>/dev/null | grep "2004-11-30 16:36:37"
,  |
find 实例
四⽉ 18th, 2006
  要在/usr/linux中查所有的*.h,并在这些⽂件中查“SYSCALL_VECTOR",最后打印出所有包含"SYSCALL_VECTOR"的⽂件名,有以下⼏种⽅法实现
find /usr/linux -name "*.h" | xargs -n50 grep SYSCALL_VECTOR
grep SYSCALL_VECTOR /usr/linux/*.h | cut -d’:’ -f1 | uniq > filename
find /usr/linux -name "*.h" -exec grep "SYSCALL_VECTOR" {} \; -print
  我⽤find / -name filename| rm -rf,不成功,请问为什么不成功?
find / -name filename -exec rm -rf {} \;
find . -name filename |rm -rf试⼀下{} 表⽰你出来的结果。
\; 则相当于“宪法”,没什么说头,就是这么规定的,在 -exec 后⾯需要⼀个表⽰该命令终结的的符号。可以在 man find 中到答案。
要让rm识别find的结果,如下:
find / -name filename |xargs rm -rf
之所以find . -name filename |rm -rf不通过,是因为rm命令不接受从标准输⼊传过来的指令
查含特定字符串的⽂件
例如查当前⽬录下含有"the string you want find…"字符串的⽂件:
$find . -type f -exec grep “the string you want find…” {} ; -print
  从根⽬录开始查tmpfile,⼀旦查到马上删除
find / -name "tmpfile" -exec rm {} \;
  find 的perm问题
请问⼀下以下命令什么意思?关键是那个数字前的-,其他都还知道
find -name ".*" -perm -007
我知道
find -name ".*" -perm 755
这个是⽤来查权限位为755的隐藏⽂件
噢,对了还有,我上边的命令都省略了find的pathname参数 find默认是查当前⼯作⽬录的吗?
如果我⽤ -ok 替代 -exec, 那么还需要加上 {} \; 吗?
这个已经清楚,仍然需要,因为 -ok 只是 -exec 的提⽰模式,它只是多了⼀个确认操作的步骤,刚才没有读懂那⼏句E⽂的意思呵呵不好意思-007是指查所有⽤户都可读、写、执⾏的⽂件,要⼩⼼呀~~~
解释解释?
find -name ".*" -perm -007 和 find -name ".*" -perm 777 有区别吗?
-007是怎么来得呢?
不过有⼀个问题
我⽤ find . -perm -100 会列出当前⽬录 . , 这是为什么呢?
下⾯引⽤由explover在 2002/10/01 06:15am 发表的内容:
-007是指查所有⽤户都可读、写、执⾏的⽂件,要⼩⼼呀~~~
-007是查含其它⽤户(不同组,⾮属主)可读,写,执⾏的⽂件.并不⼀定要同组可读写,-是指最少权限为007.
下⾯引⽤由⼀颗⼩⽩菜在 2002/10/01 10:16am 发表的内容:
OK了,呵呵
不过有⼀个问题
我⽤ find . -perm -100 会列出当前⽬录 . , 这是为什么呢?
这种⽅法不会准确的出⽬录的. -100是指权限⾄少是属主可运⾏.
在unix系统下,你可以拥有对⽬录⽂件的执⾏权你才可以进⼊⼀个⽬录.这便是⽬录⽂件被列出的原因.
find . -perm -001 -print到往往是⽬录⽂件.
我的意思当然不是使⽤这种⽅法来⽬录,只不过不明⽩其中的 -100 意义了
那以此类推,是不是 -010是指权限⾄少是owner同组可执⾏的吗?也就是说其实这⾥的010和-是分开的,-表⽰⼀个⾄少的意思,⽽且010才是真正⽤来描述权限位的?
这样⼦就明⽩了谢谢你噢
  将find出来的东西拷到另⼀个地⽅?
find *.c -exec cp ‘{}’ /tmp ‘;’
如果有特殊⽂件,可以⽤cpio,也可以⽤这样的语法:
find dir -name filename -print | cpio -pdv newdir
  出磁盘中某个⼤⼩范围内的⽂件
⽐如要查磁盘中⼤于3M的⽂件:
find . -size +3000k -exec ls -ld {} ;
  如何⽤find查某⼀天更改的⽂件?
可以使⽤这⼀⾏命令来实现:
A=`find ~ -print` | ls -l –full-time $A 2>/dev/null | grep "Jun 27" | grep 1998
  使⽤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 "*" -exec judgetime {} \;
注意时间格式为24⼩时制。
thank you ,如果我要精确到分钟呢
touch -t 04241112 starttemp #精确到12分钟
touch -t 04241220 endtemp #截⽌到12点20
find [dir] -newer starttemp -a ! -newer endtemp -exec ls -l {} \;
newer?
那昨天12:10⽂件如何呢?
每天执⾏的时候,⽤当天的⽇期和时间戳替换⼀下不就⾏了吗?
我不知道他是不是把所有的11:00~12:00的都出来,是不是只执⾏⼀次还是每天都执⾏?
这种情况俺猜想是⾃⼰的东西放在哪忘了,只记得当时是深夜了。
有道理!
不愧是斑⽵!
不光知道怎么解决问题,还知道在什么情况下出现这类问题,佩服佩服!
问题⼜出现了。创建这个⽂件的时候。本来应该是时间的⼀栏现在写上了2002,⽽不是12:00.
等到12:00过了吧!
  删除指定⽇期的⽂件
find ./ -name ⽂件名 -exec rm -f {} \;
例:删除当前30天内没⽤过的⽂件,⽤如下命令:
find / -atime +30 -exec rm -f {} \;
我⾃⼰试着写了⼀⼩段SHELL,也⽤ll ,grep, rm ⼏个命令,⽤起来还差强⼈意。
对过滤出来的⽂件名列表中⽤了⼀个FOR语句,再执⾏rm 。现在我想把这段SHELL 扩展⼀下让它每天定时运⾏将 n 天前的⽂件删掉,有没有⼈能给我⼀些提⽰,谢谢!
还有个问题,对于前⾯那位朋友提到的"find / -atime +30 -exec rm -f {} \;
"⽅法,我很早就试过⼏次,不过好像都不太对,参数 -atime n 是查n天前被访问过的⽂件,我不明⽩的是这⾥的时间参照点是什么,以及这个n天是怎么计算的。
find查命令的使用问题⼆、对于"ll |cut -f 1" 这个命令我是不是⽤错了,我只想取出 ll 中列出的⽂件名,但⽤cut -f 命令做不到,我只好换⽤ ll |cut -c 59- 这种⽅式得到我要的⽂件名,but it’s a pool idear !我也试过⽤awk ,好像也不对,看看⼤家可不可以给我⼀些⼩⼩的提醒,TKS SO MUCH
问题三、如何改变 I结点的⽇期格式我现在的系统显⽰的格式是:
-rw-r—– 1 msahz01 users 2253 2002年2⽉ 2⽇ poheader.i
我想把这换成
-rw-rw-rw- 1 house users 2193 Apr 19 2001 hkdisp.p
如何才能做到这点?
awk 应该可以
ll | awk ‘{print $9}’
删除多少天之前的⽂件
find /yourpath -mtime +31 -exec rm {} \;
find /yourpath -mtime +366 -exec rm {} \;
find中, -ctime, -mtime及其-atime有何区别
请问 -ctime 和 -mtime 有什么关系 ?
如果⽗⽬录的 ctime 改变, 那它下⾯的⽂件的 ctime 就会⾃动都改了吗 ?
-ctime 和 -mtime ,-atime 这些信息是存在哪⼉呢 ?
我⽤ -mtime -1 到了新建或改的⽂件.
但怎样才能到⼀天内 mv 来的⽂件呢( 它们的时间是原有的时间,早于⼀天 ) ?
⽤-newer选项啊。
你可以先touch⼀个你想要的时间的⽂件如下:
$ touch -t 08190800 test
$ ls -l test
-rw-r–r– 1 dba other 0 Aug 19 08:00 test

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。