深度解析Linux查找文件極查詢高級命令詳解 - 學習筆記2012-2-6


  前言                                

Linux控制台情況下,想要查詢到想要的文件詳細大家都會使用簡單的命令去尋找(例如:find)

可是問題來了?我如果想准確查找某個文件??

例如要尋求這樣一個文件:名稱含有 ”ass” 字符,且是可執行文件,以及是在2天前由bajie這個用戶創建的。

親、這樣你如果執意去用 find 命令估計要手酸了……

  涉及命令如下                                

1、which

2、whereis

3、locate

4、find

  which命令詳解                                

釋義:which 指令會在環境變量$PATH設置的目錄里查找符合條件的文件

  首先要確認查找的文件路徑在 該用戶的 $PATH 環境變量內(每個用戶的 $PATH 變量時不同的)。

  首先如何查看用戶 $PATH 環境變量呢?

  Linux終端下輸入 echo $PATH 系統會在終端輸出當前用戶$PATH變量內容。

  例如筆者的 $PATH 如下:

案例1:(查詢 passwd 文件因為 passwd 路徑在$PATH內 )

[root@localhost root]# which -a passwd
/usr/bin/passwd

這里的 參數 -a 意思是查找所有符合條件的文件並輸出,而非直輸出第一個(重要)

案例2:(查詢不在 $PATH 內的文件發生如下錯誤)

[root@localhost root]# which mydata
/usr/bin/which: no mydata in (/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin)

關於which還有如下參數:

 -n<文件名長度>  指定文件名長度,指定的長度必須大於或等於所有文件中最長的文件名。
 -p<文件名長度>  與-n參數相同,但此處的<文件名長度>包括了文件的路徑。
 -w  指定輸出時欄位的寬度。
 -V  顯示版本信息

再啰嗦一句:一定確定要查找的文件在該用戶 $PATH 環境變量不了內!!錯了別找我。。。阿門~~

  whereis明顯詳解                                

釋義:在系統數據庫中存在文件結構查找文件

注:系統數據庫每天更新一次 (根據Linux發行版本不同可能有所區別)

優點:數據庫查找速度方面肯定比 find 物理硬盤查找的速度快N倍!

缺點:無法查詢數據庫中不存在 或 物理硬盤新建(未超過一天),數據庫不存在的文件。

 該命令日常使用相對較為頻繁

參  數:
 -b  只查找二進制文件。 
 -B<目錄>  只在設置的目錄下查找二進制文件。 
 -f  不顯示文件名前的路徑名稱。 
 -m  只查找說明文件。 
 -M<目錄>  只在設置的目錄下查找說明文件。 
 -s  只查找原始代碼文件。 
 -S<目錄>  只在設置的目錄下查找原始代碼文件。 
 -u  查找不包含指定類型的文件。

案例1:

[root@localhost root]# whereis passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.lock /usr/share/man/man1/passwd.1.gz /usr/share/man/man5/passwd.5.gz
[root@localhost root]# whereis -b passwd
passwd: /usr/bin/passwd /etc/passwd /etc/passwd.lock

可以看到第一個無 -b 命令查找到5個文件,第二個命令只查找到3個 (-b為只查找二進制文件)

 速度明顯比find快。。。親、自己去體驗吧。。

 

  locate命令詳解                                

釋義:查找文件(數據庫內查找)

參數:

-i :忽略查找文件名的大小寫

-r :后面可接正則表達式的顯示方式

用法很簡單,直接 locate 文件的部分名稱 即可。

 

問題來了:剛才我創建了3個文件,我只記得2個,還有一個是wukong開頭的其他的忘了。。。

怎么辦?? whereis ? ?那你肯定找不到。。。為什么??你懂得。

怎么辦??運行命令 updatedb(更新系統數據庫)

再使用whereis 哦了~~

updatedb 命令詳解:

該命令運行后 命令回去讀取 /etc/updatedb.conf 配置文件,然后去硬盤里進行查找文件操作,最后更新整個數據庫文件(/var/lib/mlocate 內的數據庫文件)。

因為updatedb回去硬盤上查找文件,速度可能會等幾分鍾。。。

  find命令詳解                                

注:該命令由於效率問題不常用 (以上命令查不到情況下,可使用 find 直接查找硬盤文件)

特點:直接查找硬盤 准確 (ps:該函數查不到,那你就絕望吧。。)

用法:find [PATH] [option] [action]

參數:

1、時間有關參數:-atime -ctime -mtime 以下以 -mtime為例

  -mtime n :n為數字,意義在n天之前的 “一天之內” 被更改過的文件;

  -mtime +n :列出在n天之前(不含n天本身)被更改過的文件;

  -mtime -n :列出在n天之內(不含n天)被更改過的文件;

  -newer file :file為一個存在的文件,列出比file文件還要新的文件名。

案例1:

[root@localhost root]# find / -mtime 0
/
/lost+found
/boot
/boot/lost+found
/boot/grub
/boot/grub/grub.conf
/boot/grub/fat_stage1_5
/boot/grub/ffs_stage1_5

………………(太多了不列出來了...)

注意命令后面的 0 意思是文件修改時間不超過24小時 (從現在開始到24小時前),

3天前24小時內 命令為:find / -mtime 3 (具體釋義詳見下圖)

案例2:[root@localhost root]# find /etc -newer /etc/passwd

--newer 命令對應分辨2個文件的新舊程度很重要

find 高級應用:

2、與用戶和用戶組有關的參數:

-uid n:n為用戶賬戶的id 即 uid ,用戶uid記錄在 /etc/passwd文件內

-gid n:n為用戶組的id即gid ,用戶組gid記錄在 /etc/group文件內

-user name:name為用戶名,查找XX用戶的文件

-group name:name為用戶組名,查找屬於XX用戶組的文件

-nouser :尋找不屬於當前系統用戶的文件(僵屍文件。。。)

-nogroup :尋找不屬於當前系統用戶組的文件

案例1:find /etc -user bajie

查找 /etc目錄下屬於用戶bajie的文件

案例2:find / -nouser

查找僵屍文件。。。。(並不可怕,也可能是編譯文件產生的或網絡下載的)

3、與文件權限及名稱有關的參數:

--name filename:filename為文件名

--size [+-]SIZE:查找比SIZE還要大(+),或下(-)的文件,SIZE大小規格有:c:代表byte,k代表1024bytes. 要找50KB還要大的文件:"-size +50k"

  (還有M G)不知道為什么我用不成功。。。

--type TYPE:查找符合類型的文件。 類型有:一般文件 f ,設備文件(b ,c) ,目錄(d),連接文件(l),socket(s),FIFO(p)

--perm mode:查找文件權限剛回等於mode的文件

--perm -mode:查找文件權限必須 包含 mode權限的文件

  需要查找 -rwxr--r--,即0774的文件,使用 --perm -0774

--perm +mode:查找文件權限符合 任意 mode權限的文件

  需要查找 -rwsr-xr-x,即-perm +755 時,但有一個文件屬性為 -rw-------也會被列出來,因為他有 -rw...的屬性存在。

注:--perm可查詢除 rwx 以外的隱藏權限文件,這里不探討隱藏權限

 

今天就寫到這了。。。明天探討關於linux除rwx屬性外的其他隱藏屬性。

歡迎大家積極討論。。小生倍受鼓舞,感表涕零。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM