15條 linux Find 命令實際使用方法

 This article is written by SathiyaMoorthy

作者: SathiyaMoorthy

Apart from thebasic operation of looking for files under a directory structure, youcan also perform several practical operations using find command thatwill make your command line journey easy.
Find命令除了在目錄結構中查找文件之外,還可以用來做一些其他比較有實際意義的操作。

In this article, let us review 15 practical examples of Linux find command that will be very useful to both newbies and experts.
本文中的15條tips,對老鳥和菜鳥都會很有幫助

First, create the following sampleempty files under your home directory to try some of the find commandexamples mentioned below.
首先在你的HOME目錄下建立一些空的文件,並嘗試下面的一些命令。
# vim create_sample_files.sh  //使用vi創建文件,並輸入下面的內容
touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c

mkdir backup
cd backup

touch MybashProgram.sh
touch mycprogram.c
touch MyCProgram.c
touch Program.c

# chmod +x create_sample_files.sh  //添加可運行屬性

# ./create_sample_files.sh                //運行腳本

# ls -R                                                  //查看執行的結果
.:
backup                  MybashProgram.sh  MyCProgram.c
create_sample_files.sh  mycprogram.c      Program.c

./backup:
MybashProgram.sh  mycprogram.c  MyCProgram.c  Program.c

1. Find Files Using Name 根據文件名查找This is a basic usage of the find command. This example finds allfiles with name ? MyCProgram.c in the current directory and all it’ssub-directories.
這個是Find命令最基本的操作,下面的例子是在當前目錄和它所有子目錄中查找MyCProgramm.c
# find -name "MyCProgram.c"
./backup/MyCProgram.c
./MyCProgram.c

2. Find Files Using Name and Ignoring Case 在1的基礎上忽略文件名的大小寫This is a basic usage of the find command. This example finds allfiles with name ? MyCProgram.c (ignoring the case) in the currentdirectory and all it’s sub-directories.
這也是Find命令的基本操作之一.下面的例子是在當前目錄及所有子目錄中查找MyCProgram.c(忽略大小寫)
# find -iname "MyCProgram.c"
./mycprogram.c
./backup/mycprogram.c
./backup/MyCProgram.c
./MyCProgram.c

3. Limit Search To Specific Directory Level Using mindepth and maxdepth     查找指定目錄並且設置查找的目錄深度
Find the passwd file under all sub-directories starting from root directory.
下面的例子是在根目錄及所有子目錄中查找passwd文件
# find / -name passwd
./usr/share/doc/nss_ldap-253/pam.d/passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
Find the passwd file under root and one level down. (i.e root ? level 1, and one sub-directory ? level 2)
查找根目錄和根目錄的和只展開一級的子目錄中查找

# find -maxdepth 2 -name passwd
./etc/passwd
Find the passwd file under root and two levels down. (i.e root ? level 1, and two sub-directories ? level 2 and 3 )
在根目錄和根目錄下展開兩級查找passwd文件
# find / -maxdepth 3 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd
./etc/passwd
Find the password file between sub-directory level 2 and 4.
在根目錄的第二級和第四級之間查找
# find -mindepth 3 -maxdepth 5 -name passwd
./usr/bin/passwd
./etc/pam.d/passwd

4. Executing Commands on the Files Found by the Find Command.     查找到文件後,執行其他的命令
In the example below, the find command calculates the md5sum of allthe files with the name MyCProgram.c (ignoring case). {} is replaced bythe current file name.
下面的例子展示了在查找到文件後,計算文件的MD5值
# find -iname "MyCProgram.c" -exec md5sum {} \;
d41d8cd98f00b204e9800998ecf8427e  ./mycprogram.c
d41d8cd98f00b204e9800998ecf8427e  ./backup/mycprogram.c
d41d8cd98f00b204e9800998ecf8427e  ./backup/MyCProgram.c
d41d8cd98f00b204e9800998ecf8427e  ./MyCProgram.c

5. Inverting the match. 查找不匹配的文件Shows the files or directories whose name are not MyCProgram.c.Since the maxdepth is 1, this will look only under current directory.
查找文件名不是MyCProgramm.c的文件,注意由於maxdepth是1,將只在當前目錄中查找。
# find -maxdepth 1 -not -iname "MyCProgram.c"
.
./MybashProgram.sh
./create_sample_files.sh
./backup
./Program.c

6. Finding Files by its inode Number. 根據inode number查找Every file has an unique inode number, using that we can identifythat file. Create two files with similar name. i.e one file with aspace at the end.
某些時候,有些文件的文件名非常相似,肉眼比較難以分辨,這時候可以根據他們唯一的inode number進行查找
# touch "test-file-name"

# touch "test-file-name "         //這個文件名最後有一個空格

[Note: There is a space at the end]

# ls -1 test*
test-file-name
test-file-name

From the ls output, you cannot identify which file has the spaceat the end. Using option -i, you can view the inode number of the file,which will be different for these two files.
使用ls命令查看的時候,我們不能分辨這兩個文件,使用ls命令的選項-i則可以查看他們的inode number
# ls -i1 test*
16187429 test-file-name
16187430 test-file-name
You can specify inode number on a find command as shown below.In this example, find command renames a file using the inode number.
在使用find命令的時候可以指定inode number
# find -inum 16187430 -exec mv {} new-test-file-name \;

# ls -i1 *test*
16187430 new-test-file-name
16187429 test-file-name
You can use this technique when you want to do some operationwith the files which are named poorly as shown in the example below.For example, the file with name ? file?.txt has a special character init. If you try to execute “rm file?.txt”, all the following three fileswill get removed. So, follow the steps below to delete only the“file?.txt” file.
這個技巧還可以適用於當文件名中存在特殊字符的情況
# ls
file1.txt  file2.txt  file?.txt
Find the inode numbers of each file.# ls -i1
804178 file1.txt
804179 file2.txt
804180 file?.txt
Use the inode number to remove the file that had special character in it as shown below.
使用inodenumber刪除包含特殊字符的文件
# find -inum 804180 -exec rm {} \;

# ls

file1.txt  file2.txt
[Note: The file with name "file?.txt" is now removed]
7. Find file based on the File-Permissions根據文件的權限查找
Following operations are possible.
可以進行以下的這幾種操作

  • Find files that match exact permission
  • Check whether the given permission matches, irrespective of other permission bits
  • Search by giving octal / symbolic representation


For this example, let us assume that the directory contains thefollowing files. Please note that the file-permissions on these filesare different.
# ls -l
total 0
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
---------- 1 root root 0 2009-02-19 20:31 no_for_all
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
Find files which has read permission to group. Use the followingcommand to find all files that are readable by the world in your homedirectory, irrespective of other permissions for that file.
# find . -perm -g=r -type f -exec ls -l {} \;
-rw-r--r-- 1 root root 0 2009-02-19 20:30 ./everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 ./all_for_all
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
-rw-r----- 1 root root 0 2009-02-19 20:27 ./others_can_also_read
Find files which has read permission only to group.
# find . -perm g=r -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read
Find files which has read permission only to group [ search by octal ]
# find . -perm 040 -type f -exec ls -l {} \;
----r----- 1 root root 0 2009-02-19 20:27 ./others_can_only_read

8. Find all empty files (zero byte file) in your home directory and it’s subdirectoryMost files of the following command output will be lock-files and place holders created by other applications.
# find ~ -empty
List all the empty files only in your home directory.
# find . -maxdepth 1 -empty
List only the non-hidden empty files only in the current directory.
# find . -maxdepth 1 -empty -not -name ".*"

9. Finding the Top 5 Big FilesThe following command will display the top 5 largest file in the current directory and it’s subdirectory. This may take a while to execute depending on the total number of files the command has toprocess.查找當前目錄下(含子目錄)最大的5個文件
# find . -type f -exec ls -s {} \; | sort -n -r | head -5

10.Finding the Top 5 Small FilesTechnique is same as finding the bigger files, but the only difference the sort is ascending order.
# find . -type f -exec ls -s {} \; | sort -n  | head -5
In the above command, most probably you will get to see only theZERO byte files ( empty files ). So, you can use the following command to list the smaller files other than the ZERO byte files.
# find . -not -empty -type f -exec ls -s {} \; | sort -n  | head -5

11. Find Files Based on file-type using option -type

Find only the socket files.
# find . -type s
Find all directories
# find . -type d
Find only the normal files
# find . -type f
Find all the hidden files
# find . -type f -name ".*"
Find all the hidden directories
# find -type d -name ".*"

12. Find files by comparing with the modification time of other file.Show files which are modified after the specified file. The following find command displays all the files that are created/modified after ordinary_file.
# ls -lrt
total 0
-rw-r----- 1 root root 0 2009-02-19 20:27 others_can_also_read
----r----- 1 root root 0 2009-02-19 20:27 others_can_only_read
-rw------- 1 root root 0 2009-02-19 20:29 ordinary_file
-rw-r--r-- 1 root root 0 2009-02-19 20:30 everybody_read
-rwxrwxrwx 1 root root 0 2009-02-19 20:31 all_for_all
---------- 1 root root 0 2009-02-19 20:31 no_for_all
 查找創建時間或修改時間在ordinary_file以後的文件
#find -newer ordinary_file
.
./everybody_read
./all_for_all
./no_for_all

13. Find Files by SizeUsing the -size option you can find files by size.

Find files bigger than the given size
# find ~ -size +100M
Find files smaller than the given size
# find ~ -size -100M
Find files that matches the exact given size
# find ~ -size 100M
Note: ? means less than the give size, + means more than the given size, and no symbol means exact given size.
14. Create Alias for Frequent Find Operations If you find some thing as pretty useful, then you can make it as an alias. And execute it whenever you want.
爲常用的命令創建別名
Remove the files named a.out frequently.
# alias rmao="find . -iname a.out -exec rm {} \;"
# rmao

Remove the core files generated by c program.
# alias rmc="find . -iname core -exec rm {} \;"
# rmc
15. Remove big archive files using find commandThe following command removes *.zip files that are over 100M.
# find / -type f -name *.zip -size +100M -exec rm -i {} \;"
Remove all *.tar file that are over 100M using the alias rm100m(Remove 100M). Use the similar concepts and create alias like rm1g,rm2g, rm5g to remove file size greater than 1G, 2G and 5G respectively.
# alias rm100m="find / -type f -name *.tar -size +100M -exec rm -i {} \;"
# alias rm1g="find / -type f -name *.tar -size +1G -exec rm -i {} \;"
# alias rm2g="find / -type f -name *.tar -size +2G -exec rm -i {} \;"
# alias rm5g="find / -type f -name *.tar -size +5G -exec rm -i {} \;"

# rm100m
# rm1g
# rm2g
# rm5g

This article was written by SathiyaMoorthy, author of numbertotext Vim plugin, which will replace the numbers with the equivalent text inside Vim. The Geek Stuff welcomes your tips and guest articles.

Howdo you use find command? What is your favorite find command example?Please leave a comment and let us know. Also, if you would like to knowhow to use find command under a specific scenario, please let us knowyour questions in the comments section.

來源: http://blog.csdn.net/magicpang/archive/2009/03/17/3999704.aspx

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章