linux中的文件查找方法

liunux中文件查找的方法


我們經常在linux要查找某個文件,但不知道放在哪裏了,可以使用下面的一些命令來搜索。這些是從網上找到的資料,因爲有時很長時間不會用到,當要用的時候經常弄混了,所以放到這裏方便使用。

常用的查找命令有:
which 查看可執行文件的位置
whereis 查看文件的位置
locate 配合數據庫查看文件位置
find 實際搜尋硬盤查詢文件名稱


 一、which 
語法:
[root@redhat ~]# which 可執行文件名稱
例如:
[root@redhat ~]# which passwd
/usr/bin/passwd

我們知道在命令行當中,連續輸入兩次tab鍵就能夠知道用戶有多少命令可以下達。那你知不知道這些命令的完整文件名放在哪裏?which和type可以幫助你找到執行檔的信息。這個指令是根據PATH這個環境變量所定義的路徑去搜尋執行文件,所以,重點是找出執行檔文件而已!which加-a選項是將所有由PATH目錄中可以找到的指令均列出,而不止第一個被找到的指令名稱,則可以列出所有的可以找到的同名執行文件,而非僅顯示第一個而已!有一個範例最有趣,怎麼cd這個常用的命令竟然找不到,爲什麼呢?這是因爲cd是bash內建的指令,但是which預設是找PATH內定義的目錄,所以當然找不到的!那怎麼辦呢?我們可以用type命令查找!

二、whereis 
語法:
[root@redhat ~]# whereis [-bmsu] 文件或者目錄名稱
參數說 明:
-b : 只找二進制文件
-m: 只找在說明文件manual路徑下的文件
-s : 只找source源文件
-u : 沒有說明文檔的文件
例如:
[root@redhat ~]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
將和passwd文件相關的文件都查找出來

[root@redhat ~]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd
只將二進制文件 查找出來



 三、 locate 
語法:
[root@redhat ~]# locate 文件或者目錄名稱
例 如:
[root@redhat ~]# locate passwd
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_DB_war/DB.war/jsp/as/user/passwd.jsp
/home/weblogic/bea/user_projects/domains/zhanggongzhe112/myserver/stage/_appsdir_admin_war/admin.war/jsp/platform/passwd.jsp
/lib/security/pam_unix_passwd.so
/lib/security/pam_passwdqc.so
/usr/include/rpcsvc/yppasswd.x
/usr/include/rpcsvc/yppasswd.h
/usr/lib/perl5/5.8.5/i386-linux-thread-multi/rpcsvc/yppasswd.ph
/usr/lib/kde3/kded_kpasswdserver.la
/usr/lib/kde3/kded_kpasswdserver.so
/usr/lib/ruby/1.8/webrick/httpauth/htpasswd.rb
/usr/bin/vncpasswd
/usr/bin/userpasswd
/usr/bin/yppasswd
…………


和find相比,whereis查找的速度非常快,這是因爲linux系統會將系統內的所有文件都記錄在一個數據庫文件中,當使用whereis和下面即將介紹的locate時,會從數據庫中查找數據,而不是像find命令那樣,通過遍歷硬盤來查找,效率自然會很高。但是該數據庫文件並不是實時更新,默認情況下時一星期更新一次,因此,我們在用whereis和locate查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因爲數據庫文件沒有被更新。在Linux底下也有相當優異的搜索指令!通常find不很常用的!因爲速度慢之外,也會產生很多硬盤的I/O操作!通常我們都是先使用whereis或者是locate來查找,如果真的找不到了,才以find來查找!爲什麼呢?因爲whereis與locate是利用數據庫來查找數據,所以相當的快速,而且並沒有實際的搜尋硬盤,比較省時間。這個locate的使用更簡單,直接在後面輸入要索的文件名稱,就能夠得到結果。上面的例子來說,我輸入locatepasswd,那麼在完整文件名(包含路徑名稱)當中,只要有passwd在其中,就會被顯示出來!如果你忘記某個檔案的完整檔名時,這也是個很方便好用的命令,但是,這個東西還是有使用上的限制的,爲什麼呢?你會發現使用locate時會有限制的因爲/var/lib/mlocate,就是文件數據庫更新不會很及時。


locate:
非實時,模糊匹配,查找是根據全系統文件數據庫進行的;
FC4的系統上默認是一天更新一次數據庫
# updatedb, 手動生成文件數據庫
速度快

find:
實時
精確
支持衆多查找標準
遍歷指定目錄中的所有文件完成查找,速度慢;


查找路徑:默認爲當前目錄
查找標準:默認爲指定路徑下的所有文件
處理運作:默認爲顯示




四、find

1、find命令的一般形式爲;


find 查找路徑 查找標準 查找到以後的處理運作
find pathname -options [ -exec -ok ...]

2、find命令的參數;

pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
-print: find命令將匹配的文件輸出到標準輸出。
-exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式爲'command' { } \;,注意{ }和\;之間的空格。
-ok: 和-exec的作用相同,只不過以一種更爲安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。

3、find命令選項

-name :按照文件名查找文件
For example:在/etc目錄下查找文件名passwd的文件
# find /etc -name 'passwd'
-iname:按照文件名查找文件,且不區分大小寫
For example:在/etc目錄下查找文件名passwd的文件
# find /etc -iname 'passwd'

-user:按照文件屬主來查找文件
For example:在/tmp目錄下查找屬主爲hdoop的文件或目錄
# find /etc -user hdoop

-group :按照文件所屬的組來查找文件
For example:在/tmp目錄下查找屬組爲hbase的文件或目錄
# find /tmp -group hbase

-uid:UID:當某個用戶被刪除,用戶所屬的文件UID沒有被刪除,在這個情況下就可以使用此選項
For example:用戶hdoop的UID爲600,如果將hdoop用戶刪除,那如何在/tmp查找文件或目錄的屬主爲hdoop以前的文件呢
# find /tmp -uid 600

-gid:GID:當某個組被刪除,用戶所屬的文件GID沒有被刪除,在這個情況下就可以使用此選項
For example:組hbase的GIDD爲666,如果將hbase組刪除,那如何在/tmp查找文件或目錄的屬組爲hbase以前的文件呢
# find /tmp -gid 666


-nouser:查找沒有有效所屬主的文件,即該文件所屬的主在/etc/passwd中不存在
For example:查找/tmp目錄沒有屬主的文件
# find /tmp -nouser

-nogrouop:查找沒有有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
# find /tmp -nogroup

-type:以文件類型查找文件
在Linux文件系統中常用到的文件類型有:
b:塊設備文件
d:目錄
c:字符設備文件
p:管道文件
l:符號鏈接文件
f:普通文件
s:套接字設備文件
p:管道設備文件
For example:查找/tmp目錄下所有普通文件
# find /tmp -type f

-size: [+|-]文件大小查找文件
默認單位是字節,當我們去找10M的文件時,所有9點幾兆的文件都滿足條件。
#k:(#代表數字)
#M:(#代表數字)
#G:(#代表數字)
For example:查找/tmp目錄下文件大小爲10MB的文件
# find /tmp -size 10M
組合條件:
-a:與條件
-o:或條件
-not:非條件
For example:查找/tmp目錄下沒有屬主並且類型爲目錄的文件
# find /tmp -nouser -a -type d -ls
假如把-a換成-o選項:則說明沒有屬主或是目錄文件,兩個選項滿足一個即可。
# find /tmp -not -type d
說明在/tmp目錄查找非目錄類型的文件
查找/tmp目錄下,非目錄類型,並且還不是套接字類型的文件
# find /tmp -not -type d -a -not -type s
# find /tmp -not \( -type -d -o -type -s \)
兩者都可以實現目的:

根據時間戳查找符合的文件:

-ctime [+/-]n:查找系統中最後n天被改變文件狀態的文件(單位:天)
+5:至少有五天沒有訪問過
-5:五天內被訪問過
5:如果不加[+/-]:剛好五天被放過
-atime [+/-]n:查找系統中最後n天被訪問的文件(單位:天)
同上解釋:
-mtime [+/-]n:查找系統中最後n天小時被改變文件數據的文件(單位:天)



-cmin [+/-]n:查找系統中最後N分鐘被改變文件狀態的文件(單位:分鐘)
+8:至少8分鐘沒有訪問過的文件
-8:8分鐘之內訪問過的文件
8 :正好8分鐘訪問的文件
-amin [+/-]n:查找系統中最後N分鐘訪問的文件(單位:分鐘)
同上解釋:
-mmin [+/-]n:查找系統中最後N分鐘被改變文件數據的文件(單位:分鐘)
同上解釋:

-perm MODE(格式爲十進制格式):根據文件權限來查找文件
MODE:精確匹配
/MODE:只要有以爲權限匹配即可
-MODE:文件權限完全包含此MODE時纔給予顯示

動作:默認動作爲print,表示顯示出來
-printe
-ls:類此ls -l的形式顯示出每個被匹配到的文件的詳細信息
-ok COMMOND {} \; 只不過每一步操作都需要用戶確認是否操作
-exec COMMOND {} \; 不需要用戶確認信息
當使用find命令的-exec選項處理匹配到的文件時,find命令將所有匹配到的文件一起傳遞給exec來執行。
For example:查找當前目錄其它用戶具有讀執行的文件並且將其它用戶寫權限去掉,並顯示匹配到的文件詳細信息
# find ./ -perm -006 -exec chmod o-w {} \; -ls
# find ./ -perm -006 -ok chmod o-w {} \; -ls
以上兩個命令都可以實現此結果
For example:查找/tmp目下屬組具有寫權限的文件,把源文件該爲在原來的基礎上後面加上.new
# find /tmp -perm -020 -exec mv {} {}.new \;即可完成
For example:在/logs目錄中查找更改時間在10日以前的文件並刪除它們:
# find logs -type f -mtime +10 -exec rm { } \;
注:在一次強調下動作的注意事項:
find命令在當前目錄中查找所有文件名以.LOG結尾、更改時間在5日以上的文件,並刪除它們,只不過在刪除之前先給出提示。
# find . -name "*.conf" -mtime +5 -ok rm { } \;
按y鍵刪除文件,按n鍵不刪除。
所以當使用mv或者是rm的時候,記住一定要使用-ok來提示我們每一步的操作是否移動、更改、刪除等信息

下面我們來用相應的實例來介紹下find相關高級用法:
1、查找/var目錄下屬主爲root並且屬組爲mail的所有文件;
# find /var -user root -group mail

2、查找/usr目錄下不屬於root,bin,或student的文件;
# find /usr -not -user root -a -not -user bin -a -not -user student
# find /usr -not \( -user root -o -user bin -o -user student \)

3、查找/etc目錄下最近一週內內容修改過且不屬於root及student用戶的文件;
# find /etc -mtime -7 -not \ ( -user root -o -user student \)
# find /etc -mtime -7 -not -user root -a -not -user student

4、查找當前系統上沒有屬主或屬組且最近1天內曾被訪問過的文件,並將其屬主屬組均修改爲root;
# find / \( -nouser -o -nogroup \) -a -atime -1 -exec chown root:root {} \;

5、查找/etc目錄下大於1M的文件,並將其文件名寫入/tmp/etc.largefiles文件中;
# find /etc -size +1M >> /tmp/etc.largefiles

6、查找/etc目錄下所有用戶都沒有寫權限的文件,顯示出其詳細信息;
# find /etc -not -perm /222 -ls
7、find命令首先匹配所有文件名爲“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然後執行grep命令看看在這些文件中是否存在一個hdoop用戶。
# find /etc -name "passwd*" -exec grep "hdoop" { } \;
hdoop:x:501:501::/home/hdoop:/bin/bash

8、find命令將刪除當目錄中訪問時間在7日以來、含有數字(數字爲三位數)後綴的admin.log文件。
# find . -name "admin.log[0-9][0-9][0-9]" -atime -7 -ok
注:在做此題目時,自己可以創建相應地文件來進行測試
 

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