find 是 Linux 下最有用的命令之一,熟练的使用它对于提高工作效率很有帮助。下面结介绍它的一些用法
1. 最基本的 用法是:
find dir
这时,它将列出目录 dir下所有的文件和目录。
它相当于 find dir -print
如果使用 print0, 那么,每个匹配的文件名字之间用一个 '\0' 分割(默认用的是换行符)。如果文件名包含空格的话,可以使用 print0
2. 按名字搜索使用 -name 选项。如果要使用两个搜索标准来搜索满足其中之一的文件,可以使用 -o (or).
ls A file dir1 dir2 dir3 file file1 file2 picture1 picture2 picture3 charles@taotao:~/test$ find . \( -name "*dir*" -o -name "*file*" \) -print ./file2 ./A file ./file1 ./dir3 ./dir1 ./file ./dir2-path选项则会把匹配的文件名或者路径名搜出来。
3. -regex 使用正则匹配。
ls 1.txt A file b.mp3 dir1 dir3 file1 picture1 picture3 2.txt a.mp3 c.avi dir2 file file2 picture2 charles@taotao:~/test$ find . -regex ".*\(\.mp3\|\.avi\)$" ./a.mp3 ./b.mp3 ./c.avi4. 找出不符合搜索条件的文件,可以使用 !:
$ find . ! -name "*.txt" . ./file2 ./A file ./picture3 ./file1 ./picture2 ./dir3 ./a.mp3 ./dir1 ./picture1 ./file ./b.mp3 ./dir2 ./c.avi
默认下,find 会递归搜查制定路径下所有子目录。可以使用 -maxdepth 和 -mindepth指定最多要搜查到指定目录下的几级目录,从指定目录的几级目录开始搜索。
如果要仅仅搜索当前目录下的文件,使用 find . -maxdepth 1 ;如果要搜索除当前目录下的所有文件,使用 find . -mindepth 2
6. 根据文件类型搜索
用 -type 指定。 常用的有 -type f (搜索文件), -type d(目录), -type l (符号链接)
7. 根据文件时间。 -atime (上一次的访问时间), -mtime (文件内容的修改时间), -ctime(文件属性的修改时间)。时间单位是天。数字前 +表示大于,-表示小于。
find . -type f -atime -7 -print搜索最近7天内被访问的文件
另外还有分钟为单位的选项: -amin, -mmin, -cmin.用法类似。
8. 根据文件大小搜索。使用 -size选项。后面的数字同样可使用 +/-号。 数字后面跟后缀表示单位: b: 512 字节的 block; c: 字节; w: 2 字节; k: 1024 字节; M: 兆字节; G: 1024 兆
/media/DATA/video$ find . -type f -size +2G ./Home Alone 1990 720p BluRay DTS x264-MgB/Home Alone 1990 720p BluRay DTS x264-MgB.mkv ./My.Sassy.Girl.2001.720p.Blu-ray.x264.DTS-HDChina [PublicHD]/My.Sassy.Girl.2001.720p.Blu-ray.x264.DTS-HDChina.mkv ./The Godfather part I.mkv ./The Godfather Part 2 (1974) [1080p]/The.Godfather.Part.2.1974.1080p.BrRip.x264.BOKUTOX.YIFY.mp4找出所有大于2G的文件。
9. 删除匹配的文件: 用 -delete
/usr/local/bin$ ls gmplayer mplayer qemu-img qemu-nbd qemu-system-mipsel mencoder qemu-ga qemu-io qemu-system-arm virtfs-proxy-helper charles@taotao:/usr/local/bin$ find . -name "*qemu*" -delete find: cannot delete `./qemu-io': Permission denied find: cannot delete `./qemu-img': Permission denied find: cannot delete `./qemu-ga': Permission denied find: cannot delete `./qemu-system-arm': Permission denied find: cannot delete `./qemu-system-mipsel': Permission denied find: cannot delete `./qemu-nbd': Permission denied还可以用:
:/usr/local/bin$ find . -name "*qemu*" -exec rm {} \; rm: remove write-protected regular file `./qemu-io'?10.根据文件的属性(读写,执行权限)和所有者搜索. 使用 -perm 和 -user
~/test$ ls -l drwxrwxr-x 2 charles charles 4096 Oct 24 01:47 dir1 drwxrwxr-x 2 charles charles 4096 Oct 24 01:47 dir2 drwxrwxr-x 2 charles charles 4096 Oct 24 01:24 dir3 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 file -rw-rw-r-- 1 root root 0 Oct 24 01:24 file1 -rw-rw-r-- 1 root root 0 Oct 24 01:24 file2 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 picture1 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 picture2 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 picture3 charles@taotao:~/test$ find . -type f -user root ./file2 ./file111. 在 find 中执行其他的命令。 使用 -exec
比如,把上面的owner为 root的改为 charles,:
~/test$ sudo find . -type f -user root -exec chown charles:charles {} \; charles@taotao:~/test$ ls -l drwxrwxr-x 2 charles charles 4096 Oct 24 01:47 dir1 drwxrwxr-x 2 charles charles 4096 Oct 24 01:47 dir2 drwxrwxr-x 2 charles charles 4096 Oct 24 01:24 dir3 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 file -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 file1 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 file2 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 picture1 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 picture2 -rw-rw-r-- 1 charles charles 0 Oct 24 01:24 picture3{}是一个 place holder,它会被替换成搜索到的每个文件。
12. 忽略某些目录。 使用 -prune
find . -name "dir1" -prune -o -type f -print列出当前目录下除 dir1目录以外的所有文件。
13. 拷贝搜索到的文件到另外一个目录。
find . -type f -name "*.ko" -exec cp {} ~/tmp/ \;或者:
find . -type f -name "*.ko" | xargs -I {} cp {} ~/tmp