Linux文件查找命令總結(上篇)
目錄
- 前文
- which命令語法
- 命令格式
- 命令功能
- 命令參數
- which命令使用示例
- 查找文件、顯示命令路徑
- 用 which 去找出 which
- 找出 cd 這個命令
- whereis 命令語法
- 命令格式
- 命令功能
- 命令參數
- whereis命令使用示例
- 將和*文件相關的文件都查找出來
- 只將二進制文件 查找出來
- locate 命令語法
- 命令格式
- 命令功能
- 命令參數
- locate命令使用示例
- 查找和pwd****相關的所有文件
- 搜索etc目錄下所有以sh開頭的文件
- 搜索etc目錄下,所有以m開頭的文件
- find 命令語法
- 命令格式
- 命令功能
- 命令參數
- 命令選項
- find命令使用示例
- 查找指定時間內修改過的文件
- 根據關鍵字查找
- 按照目錄或文件的權限來查找文件
- 按類型查找
- 查找當前所有目錄并排序
- 按大小查找文件
- find命令之exec使用示例
- ls -l命令放在find命令的-exec選項中
- 在目錄中查找更改時間在n日以前的文件并刪除它們
- 在目錄中查找更改時間在n日以前的文件并刪除它們**,**在刪除之前先給出提示
- -exec中使用grep命令
- 查找文件移動到指定目錄
- 用exec選項執行cp命令
前文
關于Linux文件查找命令總結我們分別介紹了which命令、whereis命令、locate命令、find命令這四個命令,本篇向大家介紹的是:which命令、whereis命令、locate命令。
which命令語法
我們經常在linux要查找某個文件,但不知道放在哪里了,可以使用下面的一些命令來搜索:
- which 查看可執行文件的位置。
- whereis 查看文件的位置。
- locate 配合數據庫查看文件位置。
- find 實際搜尋硬盤查詢文件名稱。
- which命令的作用是,在PATH變量指定的路徑中,搜索某個系統命令的位置,并且返回第一個搜索結果。
- 也就是說,使用which命令,就可以看到某個系統命令是否存在,以及執行的到底是哪一個位置的命令。
命令格式
which 可執行文件名稱
命令功能
which指令會在PATH變量指定的路徑中,搜索某個系統命令的位置,并且返回第一個搜索結果。
命令參數
- -n 指定文件名長度,指定的長度必須大于或等于所有文件中最長的文件名。
- -p 與-n參數相同,但此處的包括了文件的路徑。
- -w 指定輸出時欄位的寬度。
- -V 顯示版本信息
which命令使用示例
查找文件、顯示命令路徑
命令:
which lsmod
輸出:
[root@localhost ~]# which pwd/bin/pwd[root@localhost ~]# which adduser/usr/sbin/adduser[root@localhost ~]#
說明:
which 是根據使用者所配置的 PATH 變量內的目錄去搜尋可運行檔的!
所以,不同的 PATH 配置內容所找到的命令當然不一樣的!
用 which 去找出 which
命令:
which which
輸出:
[root@localhost ~]# which whichalias which="alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde" /usr/bin/which[root@localhost ~]#
說明:
竟然會有兩個 which ,其中一個是 alias 這就是所謂的『命令別名』,意思是輸入 which 會等於后面接的那串命令!
找出 cd 這個命令
命令:
which cd
輸出:
? 說明:
cd 這個常用的命令竟然找不到?。槭裁茨??
這是因為 cd 是bash 內建的命令! 但是 which 默認是找 PATH 內所規范的目錄,所以當然一定找不到的!
whereis 命令語法
whereis命令只能用于程序名的搜索,而且只搜索二進制文件(參數-b)、man說明文件(參數-m)和源代碼文件(參數-s)。
如果省略參數,則返回所有信息。
和find相比,whereis查找的速度非???,這是因為linux系統會將 系統內的所有文件都記錄在一個數據庫文件中。
當使用whereis和下面即將介紹的locate時,會從數據庫中查找數據,而不是像find命令那樣,通 過遍歷硬盤來查找,效率自然會很高。
但是該數據庫文件并不是實時更新,默認情況下時一星期更新一次。
因此,我們在用whereis和locate 查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。
命令格式
whereis [-bmsu] [BMS 目錄名 -f ] 文件名
命令功能
whereis命令是定位可執行文件、源代碼文件、幫助文件在文件系統中的位置。
這些文件的屬性應屬于原始代碼,二進制文件,或是幫助文件。
whereis 程序還具有搜索源代碼、指定備用搜索路徑和搜索不尋常項的能力。
命令參數
-b 定位可執行文件。
-m 定位幫助文件。
-s 定位源代碼文件。
-u 搜索默認路徑下除可執行文件、源代碼文件、幫助文件以外的其它文件。
-B 指定搜索可執行文件的路徑。
-M 指定搜索幫助文件的路徑。
-S 指定搜索源代碼文件的路徑。
whereis命令使用示例
將和*文件相關的文件都查找出來
命令:
whereis svn
輸出:
[root@localhost ~]# whereis tomcattomcat:[root@localhost ~]# whereis svnsvn: /usr/bin/svn /usr/local/svn /usr/share/man/man1/svn.1.gz
說明:
tomcat沒安裝,找不出來,svn安裝找出了很多相關文件
只將二進制文件 查找出來
命令:
whereis -b svn
輸出:
[root@localhost ~]# whereis -b svnsvn: /usr/bin/svn /usr/local/svn[root@localhost ~]# whereis -m svnsvn: /usr/share/man/man1/svn.1.gz[root@localhost ~]# whereis -s svnsvn:[root@localhost ~]#
說明:
whereis -m svn 查出說明文檔路徑,whereis -s svn 找source源文件。
locate 命令語法
locate 讓使用者可以很快速的搜尋檔案系統內是否有指定的檔案。
其方法是先建立一個包括系統內所有檔案名稱及路徑的數據庫,之后當尋找時就只需查詢這個數據庫,而不必實際深入檔案系統之中了。
在一般的 distribution 之中,數據庫的建立都被放在 crontab 中自動執行。
命令格式
Locate [選擇參數] [樣式]
命令功能
locate命令可以在搜尋數據庫時快速找到檔案,數據庫由updatedb程序來更新,updatedb是由cron daemon周期性建立的,locate命令在搜尋數據庫時比由整個由硬盤資料來搜尋資料來得快,但較差勁的是locate所找到的檔案若是最近才建立或 剛更名的,可能會找不到,在內定值中,updatedb每天會跑一次,可以由修改crontab來更新設定值。(etc/crontab)
locate指定用在搜尋符合條件的檔案,它會去儲存檔案與目錄名稱的數據庫內,尋找合乎范本樣式條件的檔案或目錄錄,可以使用特殊字元(如”” 或”?”等)來指定范本樣式,如指定范本為kcpaner, locate會找出所有起始字串為kcpa且結尾為ner的檔案或目錄,如名稱為kcpartner若目錄錄名稱為kcpa_ner則會列出該目錄下包括 子目錄在內的所有檔案。
locate指令和find找尋檔案的功能類似,但locate是透過update程序將硬盤中的所有檔案和目錄資料先建立一個索引數據庫,在 執行loacte時直接找該索引,查詢速度會較快,索引數據庫一般是由操作系統管理,但也可以直接下達update強迫系統立即修改索引數據庫。
命令參數
- -e 將排除在尋找的范圍之外。
- -1 如果 是 1.則啟動安全模式。在安全模式下,使用者不會看到權限無法看到 的檔案。這會始速度減慢,因為 locate 必須至實際的檔案系統中取得檔案的 權限資料。
- -f 將特定的檔案系統排除在外,例如我們沒有到理要把 proc 檔案系統中的檔案 放在資料庫中。
- -q 安靜模式,不會顯示任何錯誤訊息。
- -n 至多顯示 n個輸出。
- -r 使用正規運算式 做尋找的條件。
- -o 指定資料庫存的名稱。
- -d 指定資料庫的路徑
- -h 顯示輔助訊息
- -V 顯示程式的版本訊息
locate命令使用示例
查找和pwd****相關的所有文件
命令:
locate pwd
輸出:
peida-VirtualBox ~ # locate pwd/bin/pwd/etc/.pwd.lock/sbin/unix_chkpwd/usr/bin/pwdx/usr/include/pwd.h/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.py/usr/lib/python2.7/dist-packages/twisted/python/fakepwd.pyc/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.py/usr/lib/python2.7/dist-packages/twisted/python/test/test_fakepwd.pyc/usr/lib/syslinux/pwd.c32/usr/share/help/C/empathy/irc-join-pwd.page/usr/share/help/ca/empathy/irc-join-pwd.page/usr/share/help/cs/empathy/irc-join-pwd.page/usr/share/help/de/empathy/irc-join-pwd.page/usr/share/help/el/empathy/irc-join-pwd.page
搜索etc目錄下所有以sh開頭的文件
命令:
locate /etc/sh
輸出:
peida-VirtualBox ~ # locate /etc/sh/etc/shadow/etc/shadow-/etc/shellspeida-VirtualBox ~ #
搜索etc目錄下,所有以m開頭的文件
命令:
locate /etc/m
輸出:
peida-VirtualBox ~ # locate /etc/m/etc/magic/etc/magic.mime/etc/mailcap/etc/mailcap.order/etc/manpath.config/etc/mate-settings-daemon
find 命令語法
Linux下find命令在目錄結構中搜索文件,并執行指定的操作。
Linux下find命令提供了相當多的查找條件,功能很強大。
由于find具有強大的功能,所以它的選項也很多,其中大部分選項都值得我們花時間來了解一下。
即使系統中含有網絡文件系統( NFS),find命令在該文件系統中同樣有效,只你具有相應的權限。
在運行一個非常消耗資源的find命令時,很多人都傾向于把它放在后臺執行,因為遍歷一個大的文件系統可能會花費很長的時間(這里是指30G字節以上的文件系統)。
命令格式
find pathname -options [-print -exec -ok …]
命令功能
用于在文件樹種查找文件,并作出相應的處理
命令參數
- pathname: find命令所查找的目錄路徑。例如用.來表示當前目錄,用/來表示系統根目錄。
- -print: find命令將匹配的文件輸出到標準輸出。
- -exec: find命令對匹配的文件執行該參數所給出的shell命令。相應命令的形式為’command’ { } ;,注意{ }和\;之間的空格。
- -ok: 和-exec的作用相同,只不過以一種更為安全的模式來執行該參數所給出的shell命令,在執行每一個命令之前,都會給出提示,讓用戶來確定是否執行。
命令選項
-name 按照文件名查找文件。
-perm 按照文件權限來查找文件。
-prune 使用這一選項可以使find命令不在當前指定的目錄中查找,如果同時使用-depth選項,那么-prune將被find命令忽略。
-user 按照文件屬主來查找文件。
-group 按照文件所屬的組來查找文件。
-mtime -n +n 按照文件的更改時間來查找文件, - n表示文件更改時間距現在n天以內,+ n表示文件更改時間距現在n天以前。find命令還有-atime和-ctime 選項,但它們都和-m time選項。
-nogroup 查找無有效所屬組的文件,即該文件所屬的組在/etc/groups中不存在。
-nouser 查找無有效屬主的文件,即該文件的屬主在/etc/passwd中不存在。
-newer file1 ! file2 查找更改時間比文件file1新但比文件file2舊的文件。
-type 查找某一類型的文件,諸如:
- b - 塊設備文件。
- d - 目錄。
- c - 字符設備文件。
- p - 管道文件。
- l - 符號鏈接文件。
- f - 普通文件。
-size n:[c] 查找文件長度為n塊的文件,帶有c時表示文件長度以字節計。-depth:在查找文件時,首先查找當前目錄中的文件,然后再在其子目錄中查找。
-fstype:查找位于某一類型文件系統中的文件,這些文件系統類型通常可以在配置文件/etc/fstab中找到,該配置文件中包含了本系統中有關文件系統的信息。
-mount:在查找文件時不跨越文件系統mount點。
-follow:如果find命令遇到符號鏈接文件,就跟蹤至鏈接所指向的文件。
-cpio:對匹配的文件使用cpio命令,將這些文件備份到磁帶設備中。
另外,下面三個的區別:
- -amin n 查找系統中最后N分鐘訪問的文件
- -atime n 查找系統中最后n*24小時訪問的文件
- -cmin n 查找系統中最后N分鐘被改變文件狀態的文件
- -ctime n 查找系統中最后n*24小時被改變文件狀態的文件
- -mmin n 查找系統中最后N分鐘被改變文件數據的文件
- -mtime n 查找系統中最后n*24小時被改變文件數據的文件
find命令使用示例
查找指定時間內修改過的文件
命令:
find -atime -2
輸出:
[root@peidachang ~]# find -atime -2../logs/monitor./.bashrc./.bash_profile./.bash_history
說明:
超找48小時內修改過的文件
根據關鍵字查找
命令:
find . -name "*.log"
輸出:
[root@localhost test]# find . -name "*.log" ./log_link.log./log2014.log./test4/log3-2.log./test4/log3-3.log./test4/log3-1.log./log2013.log./log2012.log./log.log./test5/log5-2.log./test5/log5-3.log./test5/log.log./test5/log5-1.log./test5/test3/log3-2.log./test5/test3/log3-3.log./test5/test3/log3-1.log./test3/log3-2.log./test3/log3-3.log./test3/log3-1.log
說明:
在當前目錄查找 以.log結尾的文件。 ". "代表當前目錄
按照目錄或文件的權限來查找文件
命令:
find /opt/soft/test/ -perm 777
輸出:
[root@localhost test]# find /opt/soft/test/ -perm 777/opt/soft/test/log_link.log/opt/soft/test/test4/opt/soft/test/test5/test3/opt/soft/test/test3
說明:
查找/opt/soft/test/目錄下 權限為 777的文件
按類型查找
命令:
find . -type f -name "*.log"
輸出:
[root@localhost test]# find . -type f -name "*.log"./log2014.log./test4/log3-2.log./test4/log3-3.log./test4/log3-1.log./log2013.log./log2012.log./log.log./test5/log5-2.log./test5/log5-3.log./test5/log.log./test5/log5-1.log./test5/test3/log3-2.log./test5/test3/log3-3.log./test5/test3/log3-1.log./test3/log3-2.log./test3/log3-3.log./test3/log3-1.log[root@localhost test]#
說明:
查找當目錄,以.log結尾的普通文件
查找當前所有目錄并排序
命令:
find . -type d | sort
輸出:
[root@localhost test]# find . -type f -name "*.log"./log2014.log./test4/log3-2.log./test4/log3-3.log./test4/log3-1.log./log2013.log./log2012.log./log.log./test5/log5-2.log./test5/log5-3.log./test5/log.log./test5/log5-1.log./test5/test3/log3-2.log./test5/test3/log3-3.log./test5/test3/log3-1.log./test3/log3-2.log./test3/log3-3.log./test3/log3-1.log[root@localhost test]#
按大小查找文件
命令:
find . -size +1000c -print
輸出:
[root@localhost test]# find . -size +1000c -print../test4./scf./scf/lib./scf/service./scf/service/deploy./scf/service/deploy/product./scf/service/deploy/info./scf/doc./scf/bin./log2012.log./test5./test5/test3./test3[root@localhost test]#
說明:
查找當前目錄大于1K的文件
find命令之exec使用示例
find是我們很常用的一個Linux命令,但是我們一般查找出來的并不僅僅是看看而已,還會有進一步的操作,這個時候exec的作用就顯現出來了。
exec解釋:
-exec 參數后面跟的是command命令,它的終止是以;為結束標志的,所以這句命令后面的分號是不可缺少的,考慮到各個系統中分號會有不同的意義,所以前面加反斜杠。
{} 花括號代表前面find查找出來的文件名。
使用find時,只要把想要的操作寫在一個文件里,就可以用exec來配合find查找,很方便的。
在有些操作系統中只允許-exec選項執行諸如l s或ls -l這樣的命令。
大多數用戶使用這一選項是為了查找舊文件并刪除它們。
建議在真正執行rm命令刪除文件之前,最好先用ls命令看一下,確認它們是所要刪除的文件。
exec選項后面跟隨著所要執行的命令或腳本,然后是一對兒{ },一個空格和一個\,最后是一個分號。為了使用exec選項,必須要同時使用print選項。
如果驗證一下find命令,會發現該命令只輸出從當前路徑起的相對路徑及文件名。
ls -l命令放在find命令的-exec選項中
命令:
find . -type f -exec ls -l {} \;
輸出:
[root@localhost test]# find . -type f -exec ls -l {} \; -rw-r--r-- 1 root root 127 10-28 16:51 ./log2014.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-2.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-3.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test4/log3-1.log-rw-r--r-- 1 root root 33 10-28 16:54 ./log2013.log-rw-r--r-- 1 root root 302108 11-03 06:19 ./log2012.log-rw-r--r-- 1 root root 25 10-28 17:02 ./log.log-rw-r--r-- 1 root root 37 10-28 17:07 ./log.txt-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-2.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-3.log-rw-r--r-- 1 root root 0 10-28 14:47 ./test3/log3-1.log[root@localhost test]#
說明:
上面的例子中,find命令匹配到了當前目錄下的所有普通文件,并在-exec選項中使用ls -l命令將它們列出。
在目錄中查找更改時間在n日以前的文件并刪除它們
命令:
find . -type f -mtime +14 -exec rm {} \;
輸出:
[root@localhost test]# ll總計 328-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root 33 10-28 16:54 log2013.log-rw-r--r-- 1 root root 127 10-28 16:51 log2014.loglrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.log-rw-r--r-- 1 root root 25 10-28 17:02 log.log-rw-r--r-- 1 root root 37 10-28 17:07 log.txtdrwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxrwx 2 root root 4096 10-28 14:47 test3drwxrwxrwx 2 root root 4096 10-28 14:47 test4[root@localhost test]# find . -type f -mtime +14 -exec rm {} \;[root@localhost test]# ll總計 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.loglrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.logdrwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxrwx 2 root root 4096 11-12 19:32 test3drwxrwxrwx 2 root root 4096 11-12 19:32 test4[root@localhost test]#
說明:
在shell中用任何方式刪除文件之前,應當先查看相應的文件,一定要小心!
當使用諸如mv或rm命令時,可以使用-exec選項的安全模式。它將在對每個匹配到的文件進行操作之前提示你。
在目錄中查找更改時間在n日以前的文件并刪除它們**,**在刪除之前先給出提示
命令:
find . -name "*.log" -mtime +5 -ok rm {} \;
輸出:
[root@localhost test]# ll總計 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.loglrwxrwxrwx 1 root root 7 10-28 15:18 log_link.log -> log.logdrwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxrwx 2 root root 4096 11-12 19:32 test3drwxrwxrwx 2 root root 4096 11-12 19:32 test4[root@localhost test]# find . -name "*.log" -mtime +5 -ok rm {} \;< rm ... ./log_link.log > ? y< rm ... ./log2012.log > ? n[root@localhost test]# ll總計 312-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.logdrwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxrwx 2 root root 4096 11-12 19:32 test3drwxrwxrwx 2 root root 4096 11-12 19:32 test4[root@localhost test]#
說明:
在上面的例子中, find命令在當前目錄中查找所有文件名以.log結尾、更改時間在5日以上的文件,并刪除它們,只不過在刪除之前先給出提示。 按y鍵刪除文件,按n鍵不刪除。
-exec中使用grep命令
命令:
find /etc -name "passwd*" -exec grep "root" {} \;
輸出:
[root@localhost test]# find /etc -name "passwd*" -exec grep "root" {} \;root:x:0:0:root:/root:/bin/bashroot:x:0:0:root:/root:/bin/bash[root@localhost test]#
說明:
任何形式的命令都可以在-exec選項中使用。 在上面的例子中我們使用grep命令。
find命令首先匹配所有文件名為“ passwd*”的文件,例如passwd、passwd.old、passwd.bak,然后執行grep命令看看在這些文件中是否存在一個root用戶。
查找文件移動到指定目錄
命令:
find . -name "*.log" -exec mv {} .. \;
輸出:
[root@localhost test]# ll總計 12drwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-12 22:49 test3drwxrwxr-x 2 root root 4096 11-12 19:32 test4[root@localhost test]# cd test3/[root@localhost test3]# ll總計 304-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log-rw-r--r-- 1 root root 0 11-12 22:25 log2014.log[root@localhost test3]# find . -name "*.log" -exec mv {} .. \;[root@localhost test3]# ll總計 0[root@localhost test3]# cd ..[root@localhost test]# ll總計 316-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log-rw-r--r-- 1 root root 0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-12 22:50 test3drwxrwxr-x 2 root root 4096 11-12 19:32 test4[root@localhost test]#
用exec選項執行cp命令
命令:
find . -name "*.log" -exec cp {} test3 \;
輸出:
[root@localhost test3]# ll總計 0[root@localhost test3]# cd ..[root@localhost test]# ll總計 316-rw-r--r-- 1 root root 302108 11-03 06:19 log2012.log-rw-r--r-- 1 root root 61 11-12 22:44 log2013.log-rw-r--r-- 1 root root 0 11-12 22:25 log2014.logdrwxr-xr-x 6 root root 4096 10-27 01:58 scfdrwxrwxr-x 2 root root 4096 11-12 22:50 test3drwxrwxr-x 2 root root 4096 11-12 19:32 test4[root@localhost test]# find . -name "*.log" -exec cp {} test3 \;cp: “./test3/log2014.log” 及 “test3/log2014.log” 為同一文件cp: “./test3/log2013.log” 及 “test3/log2013.log” 為同一文件cp: “./test3/log2012.log” 及 “test3/log2012.log” 為同一文件[root@localhost test]# cd test3[root@localhost test3]# ll總計 304-rw-r--r-- 1 root root 302108 11-12 22:54 log2012.log-rw-r--r-- 1 root root 61 11-12 22:54 log2013.log-rw-r--r-- 1 root root 0 11-12 22:54 log2014.log[root@localhost test3]#
到此這篇關于Linux文件查找命令總結(上篇)的文章就介紹到這了,下篇的內容請搜索以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持!
相關文章:
