linux中 find 命令使用总结(转)
简化文件系统的管理
find 命令具有一长串令人生畏的选项和开关,它们会阻碍人们深入地学习该命令,但正是因为其范围广阔,真正的 Explorer 并不会被它们吓倒。一条好的通用原则在简化一个复杂问题时都会经过漫长的过程。启动一个 xterm,并尝试执行下面的命令:
$ find . -name *.gif -exec ls {} ;
-exec 参数定义了将对这些文件进行什么操作。该示例告诉计算机进行如下操作:
- .)。
- 定位所有名称以 .gif 结尾的文件(图形文件)。
- 列出所有查找到的文件,使用
ls
命令。
需要对 -exec
参数进行更深入地研究。当查找到匹配搜索条件的文件名时,find
命令执行ls {}
字符串,用文件名和路径代替文本{}.
假设在搜索中查找到 saturn.gif 文件,find
将执行如下所示的命令:
$ ls ./gif_files/space/solar_system/saturn.gif
find 命令可以让 UNIX 文件系统的管理工作变得更加容易。例如,如果您使用了 -fstype
参数,find
命令可以根据查找到的文件所处的文件系统的类型来对命令进行相应的处理。在 find
命令对查找到的文件执行相应命令前将对您进行提示,这通常是非常有用的,您可以使用 -ok
参数告诉它继续执行该操作,接下来我们将对其进行介绍。
可选的执行
-exec一样,但它会提示您是否要对文件运行相应的命令。假设您想要删除 home 目录中的大部分 .txt 文件,但希望能够逐个文件地执行该操作。像 UNIX 中的 rm
命令那样的删除操作是很危险的,因为当使用像find
这样的自动化处理方式来查找文件时,它可能一不小心会删除重要的文件,您也许希望在删除这些系统查找到的文件之前对其进行仔细检查。
find 命令通过列出文件名提示您确认操作时输入 Y
或者 y
:
$ find $HOME/. -name *.txt -ok rm {} ;
Y或者 y.
如果您按下 Enter 键,系统将不会删除该文件。清单 1 显示了一些示例结果:
清单 1. 示例结果
< rm ... /home/bill/./.kde/share/apps/karm/karmdata.txt > ? < rm ... /home/bill/./archives/LDDS.txt > ? < rm ... /home/bill/./www/txt/textfile1.txt > ? < rm ... /home/bill/./www/txt/faq.txt > ? < rm ... /home/bill/./www/programs/MIKE.txt > ? < rm ... /home/bill/./www/programs/EESTRING.txt > ? . . . |
系统将在每个问号之后暂停,在本示例中,每次都按下了 Enter 键以继续处理下一个文件。(没有删除任何文件。)-ok
参数允许您控制每个查找到的文件的自动化处理过程,这样就添加了一种避免自动删除文件的安全措施。
-ok参数时涉及到过多的文件,那么一个好的方法是先运行带 -exec
的 find
命令以列出所有将要删除的文件,然后在经过检查确保其中不会删除重要的文件后,再次运行该命令,其中用 rm
代替 ls. -exec
和 -ok
都非常有用,您必须确定在当前情况下哪一个能够更好的工作。请记住,安全第一!
创造性地使用 find
find命令执行各种各样的任务。本部分内容提供了使用 find
命令来管理文件系统的几种方式的示例。
-exec命令。然而,您完全可以根据自己需要在 find 命令的 -exec
子句中使用这样的命令。
清除临时文件
find 命令来清除目录或子目录中在正常使用过程中生成的临时文件,这样可以节省磁盘空间。要实现该操作,请使用下面的命令:
$ find . ( -name a.out -o -name '*.o' -o -name 'core' ) -exec rm {} ;
-name. 该列表可以扩展为包括您需要清除的系统中的任何临时文件类型。在代码的编译和连接过程中,程序员及其工具会生成示例中的那些文件类型:a.out, *.o
和 core.
其他的用户通常也会生成类似的临时文件,可以使用如 *.tmp, *.junk
等文件掩码来对命令进行相应的编辑。您可能还发现将命令放入一个称作 clean
的脚本中非常有用,当需要清除一个目录中的内容的时候就可以执行该脚本。
复制目录中的内容
find和 cpio
命令,如下所示:
清单 2. 组合使用 find 和 cpio 命令
$ cd /path/to/source/dir $ find . | cpio -pdumv /path/to/destination/dir |
$ find $HOME/. -name *.txt -exec head -n 1 -v {} ; > report.txt $ less < report.txt |
维护 LOG 和 TMP 文件的存储空间
cron任务中:
清单 4. 维护 LOG 和 TMP 文件存储空间
$ find $LOGDIR -type d -mtime +0 -exec compress -r {} ; $ find $LOGDIR -type d -mtime +5 -exec rm -f {} ; |
(-mtime +0) 进行了修改的数据的目录(-type d), 对它们进行压缩 (compress -r {})
以节省磁盘空间。如果这些目录超过了一个工作周 (-mtime +5)
,第二个命令则将其删除 (rm -f {})
,以便增加磁盘上的可用空间。通过这种方式,cron 任务自动地根据您所指定的时间窗口对目录进行维护。
复制复杂的目录树
find和cpio;
清单 5. 复制复杂的目录树
$ cd /source/directory $ find . -depth -print | cpio -o -O /target/directory |
查找不指向任何地方的链接
find的 perl
解释器,如下所示:
$ find / -type l -print | perl -nle '-e || print';
perl解释器确定不指向任何地方 (-nle '-e || print')
的所有链接(-type l -print)
,关于 Unix Guru Universe 站点中这个技巧的更详细的信息,请参阅参考资料部分。如果您想要删除这些文件,可以进一步使用管道将输出传递到 rm -f {}
命令。当然,Perl 可以在大多数的 UNIX 工具包中找到,它是许多功能强大的解释性语言工具中的一种。
定位和重命名无法打印的目录
ls中包含 -i
开关,以获取该目录的索引节点的数值。然后,使用 find
将索引节点的数值转换为一个可以使用 mv
命令进行重命名的文件名:
清单 6. 定位和重命名无法打印的目录
$ ls -ail $ find . -inum 211028 -exec mv {} newname.dir ; |
列出长度为零的文件
$ find . -empty -exec ls {} ; |
rm命令来代替 ls
命令,以删除这些文件。
find命令的使用受到知识和创造性的限制。
结束语
find命令,可以轻松地浏览 UNIX 文件系统中丰富的内容。很值得花时间来试验该命令,并了解它能为您做些什么。正如本文中所列出的示例,您可以通过许多创造性的方式来使用 find,
这样可以轻松地浏览和管理文件系统,并且充满乐趣。
find pathname -options [-print -exec -ok]
pathname:查找路径
-option:主要选项如下:
-name:按照文件名称查找
-perm:按照文件权限查找
-prune:不在当前指定的路径查找。如果同时指定了-depth选项,则prune被忽略
-user:按照文件属主查找
-group:按照文件属组查找
-mtime -n +n:按照文件更改时间查找。-n 指距离现在时间n天以内;+n n天以外
-nogroup:查找无效属组文件
-nouser:查找无效属主文件
-newer file1 !file2:查找更改时间比file1新比file2旧的文件
-type:查找某一类型文件
b:块设备文件
d:目录
c:字符设备文件
P:管道文件
l:符号链接文件
f:普通文件
-size n[c]查找文件长度为n块的文件 有[c]表示文件长度以字节计
-depth:查找时,首先查找当前目录文件,然后再在其子目录查找
-fstype:查找位于某一类型文件系统中的文件,文件系统类型可在/etc/fstab中找到
-mount:查找文件不跨越文件系统mount点
-follow:如遇到链接文件,则跟踪至链接所指向文件
-cpio:对匹配的文件使用cpio命令,将文件备份到磁带设备中
-print:将匹配的文件输出到标准输出
-exec:对匹配的文件执行所给的shell命令。形式为:command { } ;注意{ }和;之间的空格
-ok:和-exec作用相同。只不过以一种更安全的模式执行该参数所给的shell命令。在执行每个命令之前,都会给出提示,让用户确定是否执行
·find path -option [ -print ] [ -exec -ok command ] {} ;
#-print 将查找到的文件输出到标准输出
#-exec command {} ; -----将查到的文件执行command操作,{} 和 ;之间有空格
#-ok 和-exec相同,只不过在操作前要询用户
-name filename #查找名为filename的文件
-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">-perm #按执行权限来查找
-user username #按文件属主来查找
-group groupname #按组来查找
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查找文件,-n指n天以内,+n指n天以前
-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 "[A-Z]*" -pri26nbsp; #对匹配的文件使用cpio命令,将他们备份到磁带设备中
-prune #忽略某个目录
$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字节)
$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 -name tom.txt -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型为vfat的文件
find /mnt -name t.txt ! -ftype vfat 在/mnt下查找名称为tom.txt且文件系统类型不为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 tmp.txt 在/home下查更新时间比tmp.txt近的文件或目录
find /home -anewer tmp.txt 在/home下查存取时间比tmp.txt近的文件或目录
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 -name tmp.txt -maxdepth 4 列出/home内的tmp.txt 查时深度最多为3层
find /home -name tmp.txt -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 -name tmp.txt -exec cat {} ;
find /tmp -name tmp.txt -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 ./conf/httpd.conf
-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" "$2}'
cnscn pts/0
[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"的文件名
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 ';'
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"