1. 程式人生 >實用技巧 >其它 >Linux中查詢檔案

Linux中查詢檔案


1、find 命令

1.1、基本語法

使用 Linux find 命令可以用不同的搜尋標準如名字、型別、所屬人、大小等來搜尋目錄樹。基本語法如下:

[[email protected] ~]# find -help
用法: find [-H] [-L] [-P] [-Olevel] [-D help|tree|search|stat|rates|opt|exec] [path...] [expression]

預設路徑為當前目錄;預設表示式為 -print
表示式可能由下列成份組成:操作符、選項、測試表達式以及動作:

操作符 (優先順序遞減;未做任何指定時預設使用 -and):
      ( EXPR )   ! EXPR   -not EXPR   EXPR1 -a EXPR2   EXPR1 -and EXPR2
      EXPR1 -o EXPR2   EXPR1 -or EXPR2   EXPR1 , EXPR2

位置選項 (總是真): -daystart -follow -regextype

普通選項 (總是真,在其它表示式前指定):
      -depth --help -maxdepth LEVELS -mindepth LEVELS -mount -noleaf
      --version -xdev -ignore_readdir_race -noignore_readdir_race

比較測試 (N 可以是 +N 或 -N 或 N): -amin N -anewer FILE -atime N -cmin N
      -cnewer 檔案 -ctime N -empty -false -fstype 型別 -gid N -group 名稱
      -ilname 匹配模式 -iname 匹配模式 -inum N -ipath 匹配模式 -iregex 匹配模式
      -links N -lname 匹配模式 -mmin N -mtime N -name 匹配模式 -newer 檔案
      -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
      -readable -writable -executable
      -wholename PATTERN -size N[bcwkMG] -true -type [bcdpflsD] -uid N
      -used N -user NAME -xtype [bcdpfls]
      -context CONTEXT


actions: -delete -print0 -printf FORMAT -fprintf FILE FORMAT -print 
      -fprint0 FILE -fprint FILE -ls -fls FILE -prune -quit
      -exec COMMAND ; -exec COMMAND {} + -ok COMMAND ;
      -execdir COMMAND ; -execdir COMMAND {} + -okdir COMMAND ;

通過 findutils 錯誤報告頁 http://savannah.gnu.org/ 報告錯誤及跟蹤修定過程。如果您無法瀏覽網頁,請發電子郵件至 <[email protected]>[[email protected] ~]# 
1.2、按檔名查詢

使用 find 命令根據檔名來查詢特定檔案的一個例子:

[[email protected] hadoop-3.3.1]# find / -name README.txt
/usr/lib64/python3.6/site-packages/README.txt
/usr/share/doc/vim-common/README.txt
/usr/share/doc/pcre2-devel/html/README.txt
/usr/share/doc/pcre-devel/html/README.txt
/usr/share/vim/vim80/autoload/README.txt
/usr/share/vim/vim80/colors/README.txt
/usr/share/vim/vim80/compiler/README.txt
/usr/share/vim/vim80/ftplugin/README.txt
/usr/share/vim/vim80/indent/README.txt
/usr/share/vim/vim80/keymap/README.txt
/usr/share/vim/vim80/lang/README.txt
/usr/share/vim/vim80/macros/README.txt
/usr/share/vim/vim80/macros/maze/README.txt
/usr/share/vim/vim80/macros/urm/README.txt
/usr/share/vim/vim80/plugin/README.txt
/usr/share/vim/vim80/syntax/README.txt
/usr/share/vim/vim80/tutor/README.txt
/opt/module/hadoop-3.3.1/README.txt
[[email protected] hadoop-3.3.1]# 

命令會搜尋整個目錄樹來查詢指定檔名的檔案,並且會提供其存放位置。

1.3、指定路徑查詢

find 命令有時會花費幾分鐘來查詢整個目錄樹,尤其是如果系統中有很多檔案和目錄的話。要顯著減少時間,你可以指定搜尋的目錄。比如,如果你知道某個檔案存在某個資料夾,那就沒有必要搜尋其它目錄。這樣,你可以使用下面的命令:

[[email protected] hadoop-3.3.1]# find /opt/module/hadoop-3.3.1/ -name README.txt
/opt/module/hadoop-3.3.1/README.txt
[[email protected] hadoop-3.3.1]# 
1.4、模糊查詢
[[email protected] hadoop-3.3.1]# find /opt/module/hadoop-3.3.1/etc/ -name *.xml
/opt/module/hadoop-3.3.1/etc/hadoop/kms-acls.xml
/opt/module/hadoop-3.3.1/etc/hadoop/hadoop-policy.xml
/opt/module/hadoop-3.3.1/etc/hadoop/hdfs-rbf-site.xml
/opt/module/hadoop-3.3.1/etc/hadoop/kms-site.xml
/opt/module/hadoop-3.3.1/etc/hadoop/capacity-scheduler.xml
/opt/module/hadoop-3.3.1/etc/hadoop/httpfs-site.xml
/opt/module/hadoop-3.3.1/etc/hadoop/core-site.xml
/opt/module/hadoop-3.3.1/etc/hadoop/hdfs-site.xml
/opt/module/hadoop-3.3.1/etc/hadoop/mapred-site.xml
/opt/module/hadoop-3.3.1/etc/hadoop/yarn-site.xml
[[email protected] hadoop-3.3.1]# 

2、locate命令

locate 命令用來查詢檔案或目錄。 locate 命令要比 find -name 快得多,原因在於它不搜尋具體目錄,而是搜尋一個數據庫 /var/lib/mlocate/mlocate.db 。這個資料庫中含有本地所有檔案資訊。Linux 系統自動建立這個資料庫,並且每天自動更新一次,因此,我們在用 whereis 和 locate 查詢檔案時,有時會找到已經被刪除的資料,或者剛剛建立檔案,卻無法查詢到,原因就是因為資料庫檔案沒有被更新。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新資料庫。整個locate工作其實是由四部分組成的:

/usr/bin/updatedb 主要用來更新資料庫,通過crontab自動完成的

/usr/bin/locate 查詢檔案位置

/etc/updatedb.conf updatedb的配置檔案

/var/lib/mlocate/mlocate.db 存放檔案資訊的檔案

2.1、CentOS 8.2 安裝locate
[[email protected] ~]# yum install mlocate
2.2、更新搜尋資料庫

locate是一種比find更快的方式,因為它在資料庫中查詢檔案。要更新搜尋資料庫,執行下面的命令:

[[email protected] ~]# updatedb
2.3、基本語法
[[email protected] ~]# locate [OPTION]... [PATTERN]...
2.4、基本選項
-b, --basename         match only the base name of path names
-c, --count            只輸出找到的數量
-d, --database DBPATH  使用DBPATH指定的資料庫,而不是預設資料庫 /var/lib/mlocate/mlocate.db
-e, --existing         only print entries for currently existing files
-L, --follow           follow trailing symbolic links when checking file existence (default)
-h, --help             顯示幫助
-i, --ignore-case      忽略大小寫
-l, --limit, -n LIMIT  limit output (or counting) to LIMIT entries
-m, --mmap             ignored, for backward compatibility
-P, --nofollow, -H     don't follow trailing symbolic links when checking file existence
-0, --null             separate entries with NUL on output
-S, --statistics       don't search for entries, print statistics about eachused database
-q, --quiet            安靜模式,不會顯示任何錯誤訊息
-r, --regexp REGEXP    使用基本正則表示式
    --regex            使用擴充套件正則表示式
-s, --stdio            ignored, for backward compatibility
-V, --version          顯示版本資訊
-w, --wholename        match whole path name (default)
2.5、示例

示例一:搜尋檔名為”README.TXT“的檔案

[[email protected] ~]# locate README.TXT/opt/module/jdk1.8.0_181/lib/missioncontrol/dropins/README.TXT/usr/share/doc/libicu-devel/samples/datefmt/README.TXT/usr/share/doc/libicu-devel/samples/msgfmt/README.TXT/usr/share/doc/libicu-devel/samples/translit/README.TXT

驗證:

[[email protected] ~]# locate README.TXT/opt/module/jdk1.8.0_181/lib/missioncontrol/dropins/README.TXT/usr/share/doc/libicu-devel/samples/datefmt/README.TXT/usr/share/doc/libicu-devel/samples/msgfmt/README.TXT/usr/share/doc/libicu-devel/samples/translit/README.TXT[[email protected] ~]# find / -name README.TXT/usr/share/doc/libicu-devel/samples/datefmt/README.TXT/usr/share/doc/libicu-devel/samples/msgfmt/README.TXT/usr/share/doc/libicu-devel/samples/translit/README.TXT/opt/module/jdk1.8.0_181/lib/missioncontrol/dropins/README.TXT[[email protected] ~]# 

示例二:搜尋/opt/module/hadoop-3.3.1/etc/hadoop/目錄下所有以hadoop開頭的檔案

[[email protected] ~]# locate /opt/module/hadoop-3.3.1/etc/hadoop/hadoop/opt/module/hadoop-3.3.1/etc/hadoop/hadoop-env.cmd/opt/module/hadoop-3.3.1/etc/hadoop/hadoop-env.sh/opt/module/hadoop-3.3.1/etc/hadoop/hadoop-metrics2.properties/opt/module/hadoop-3.3.1/etc/hadoop/hadoop-policy.xml/opt/module/hadoop-3.3.1/etc/hadoop/hadoop-user-functions.sh.example[[email protected] ~]# 

3、whereis

3.1、基本簡介

whereis命令只能用於程式名的搜尋,而且只搜尋二進位制檔案(引數-b)、man說明檔案(引數-m)和原始碼檔案(引數-s)。如果省略引數,則返回所有資訊。

和find相比,whereis查詢的速度非常快,這是因為linux系統會將 系統內的所有檔案都記錄在一個數據庫檔案中,當使用whereis和下面即將介紹的locate時,會從資料庫中查詢資料,而不是像find命令那樣,通 過遍歷硬碟來查詢,效率自然會很高。

但是該資料庫檔案並不是實時更新,預設情況下時一星期更新一次,因此,我們在用whereis和locate 查詢檔案時,有時會找到已經被刪除的資料,或者剛剛建立檔案,卻無法查詢到,原因就是因為資料庫檔案沒有被更新。

3.2、基礎語法
[[email protected] ~]# whereis [-bmsu] [BMS 目錄名 -f ] 檔名
3.3、基本選項
-b   定位可執行檔案。-m   定位幫助檔案。-s   定位原始碼檔案。-u   搜尋預設路徑下除可執行檔案、原始碼檔案、幫助檔案以外的其它檔案。-B   指定搜尋可執行檔案的路徑。-M   指定搜尋幫助檔案的路徑。-S   指定搜尋原始碼檔案的路徑。
3.4、示例

將和**檔案相關的檔案都查找出來

[[email protected] ~]# whereis hadoophadoop: /opt/module/hadoop-3.3.1/bin/hadoop /opt/module/hadoop-3.3.1/bin/hadoop.cmd[[email protected] ~]# whereis sparkspark:[[email protected] ~]#