除了在一个目录结构下查找文件这种基本的操作,你还可以用find命令实现一些实用的操作,使你的命令行 之旅更加简易。本文将介绍15种无论是于新手还是老鸟都非常有用的Linux find命令。
首先,在你的home目录下面创建下面的空文件,来测试下面的find命令示例。
21 | backup MybashProgram.sh MyCProgram.c |
22 | create_sample_files.sh mycprogram.c Program.c |
25 | MybashProgram.sh mycprogram.c MyCProgram.c Program.c |
1. 用文件名查找文件这是find命令的一个基本用法。下面的例子展示了用MyCProgram.c作为查找名在当前目录及其子目录中查 找文件的方法。 2.用文件名查找文件,忽略大小写这是find命令的一个基本用法。下面的例子展示了用MyCProgram.c作为查找名在当前目录及其子目录中查 找文件的方法,忽略了大小写。 3. 使用mindepth和maxdepth限定搜索指定目录的深度在root目录及其子目录下查找passwd文件。 2 | ./usr/share/doc/nss_ldap-253/pam.d/ passwd |
在root目录及其1层深的子目录中查找passwd. (例如root — level 1, and one sub-directory — level 2) 在root目录下及其最大两层深度的子目录中查找passwd文件. (例如 root — level 1, and two sub-directories — level 2 and 3 ) 在第二层子目录和第四层子目录之间查找passwd文件。
4. 在find命令查找到的文件上执行命令下面的例子展示了find命令来计算所有不区分大小写的文件名为“MyCProgram.c”的文件的MD5验证和。 {}将会被当前文件名取代。 1 | find -iname "MyCProgram.c" - exec md5sum {} \; |
2 | d41d8cd98f00b204e9800998ecf8427e ./mycprogram.c |
3 | d41d8cd98f00b204e9800998ecf8427e ./backup/mycprogram.c |
4 | d41d8cd98f00b204e9800998ecf8427e ./backup/MyCProgram.c |
5 | d41d8cd98f00b204e9800998ecf8427e ./MyCProgram.c |
5. 相反匹配显示所有的名字不是MyCProgram.c的文件或者目录。由于maxdepth是1,所以只会显示当前目录下的文件和目录。 1 | find -maxdepth 1 -not -iname "MyCProgram.c" |
4 | ./create_sample_files.sh |
6. 使用inode编号查找文件任何一个文件都有一个独一无二的inode编号,借此我们可以区分文件。创建两个名字相似的文件, 例如一个有空格结尾,一个没有。 4 | [Note: There is a space at the end] |
从ls的输出不能区分哪个文件有空格结尾。使用选项-i,可以看到文件的inode编号,借此可以区分这两个文件。 你可以如下面所示在find命令中指定inode编号。在此,find命令用inode编号重命名了一个文件。 1 | find -inum 16187430 - exec mv {} new- test - file -name \; |
4 | 16187430 new- test - file -name |
你可以在你想对那些像上面一样的糟糕命名的文件做某些操作时使用这一技术。例如,名为file?.txt的文件名
字中有一个特殊字符。若你想执行“rm file?.txt”,下面所示的所有三个文件都会被删除。所以,采用下面的 步骤来删除"file?.txt"文件。 2 | file1.txt file2.txt file ?.txt |
找到每一个文件的inode编号。 如下所示: 使用inode编号来删除那些具有特殊符号的文件名。 1 | find -inum 804180 - exec rm {} \; |
5 | [Note: The file with name "file?.txt" is now removed] |
7. 根据文件权限查找文件下面的操作时合理的: - 找到具有指定权限的文件
- 忽略其他权限位,检查是否和指定权限匹配
- 根据给定的八进制/符号表达的权限搜索
此例中,假设目录包含以下文件。注意这些文件的权限不同。 3 | -rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all |
4 | -rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read |
5 | ---------- 1 root root 0 2009-02-19 20:31 no_for_all |
6 | -rw------- 1 root root 0 2009-02-19 20:29 ordinary_file |
7 | -rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read |
8 | ----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read |
找到具有组读权限的文件。使用下面的命令来找到当前目录下对同组用户具有读权限的文件,忽略该文件 的其他权限。 1 | find . -perm -g=r - type f - exec ls -l {} \; |
2 | -rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read |
3 | -rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all |
4 | ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read |
5 | -rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read |
找到对组用户具有只读权限的文件。 1 | find . -perm g=r - type f - exec ls -l {} \; |
2 | ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read |
找到对组用户具有只读权限的文件(使用八进制权限形式)。 1 | find . -perm 040 - type f - exec ls -l {} \; |
2 | ----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read |
|