您好,登錄后才能下訂單哦!
這篇文章為大家帶來有關Linux中文件查找與定位的命令詳細介紹。大部分知識點都是大家經常用到的,為此分享給大家做個參考。一起跟隨小編過來看看吧。
Linux下一切皆文件,但是文件由于文件的屬性的不同,在查找上可以針對不同的文件做相應的查找以便加快查詢速度和減少資源的消耗。注意的是在磁盤中查找是要受到權限控制的,但是在數據庫中查找是無權限約束的。
1 Linux中最常用的就是which命令了,它是在 $PATH環境變量(用于保存可執行文件的默認路徑)中指定的路徑來搜索可執行文件的它一般用來確定是否安裝了軟件,例如查看是否安裝了gcc軟件
例 1.1
[user1@localhost ~]$ which gcc /bin/gcc #安裝了gcc軟件
例 1.2 一般查找都是顯示的絕對路徑
[root@localhost ~]# which pwd /bin/pwd
例 1.3 普通用戶查找一些只有root權限的命令是找不到的:
[user1@localhost ~]$ which userdel /usr/bin/which:nouserdelin(/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/user1/.local/bin:/home/user1/bin) [user1@localhost ~]$ su - Password: Last login: Sun Feb 26 10:20:33CST 2017 onpts/0 [root@localhost ~]# whichuserdel /sbin/userdel
2. type命令,此命令比較特別,從名字上看它沒有什么搜索能力。實際上它是用于判斷一個命令是否是shell的內置命令的命令。如果是非內置的shell命令,而且使用了type的-p參數,就相當于which命令了
例 2.1 比較which和type –p的區別
[user1@localhost ~]$ which pwd #pwd是shell的內置命令 /bin/pwd [user1@localhost ~]$ type -p pwd #無結果,沒有起到搜索的作用 [user1@localhost ~]$ [user1@localhost ~]$ which gcc #gcc是軟件,非shell內置命令 /bin/gcc [user1@localhost ~]$ type -p gcc #等同于which /bin/gcc
3.Linux中查找速度最快的命令,whereis命令,它不是在磁盤中慢慢找文件,而是在數據了(/var/lib/mlocate)中快速查找文件。這個mlocate數據庫是Linux系統自動創建的,包含了本地文件的信息,并且每天自動執行updatedb命令來更新該數據庫。正是因為每天更新一次,所以有時候搜索并不準確,比如剛剛添加的文件搜索不到,剛剛刪除的文件還能搜索到。所以一般使用的時候先手動執行updatedb命令,再whereis。這樣有點失去了高效的特性。它只能查找可執行文件、聯機幫助文檔和源代碼文件。
例3.1 顯示sudo命令相關的: 命令位置,命令的配置文件,命令的幫助手冊
[root@localhost ~]# whereis sudo sudo: /usr/bin/sudo /etc/sudo.conf/usr/share/man/man8/sudo.8.gz
例 3.2 查找sudo命令
[user1@localhost ~]$ whereis sudo sudo: /usr/bin/sudo /etc/sudo.conf/usr/share/man/man8/sudo.8.gz [user1@localhost ~]$ whereis -b sudo #只查找二進制文件 sudo: /usr/bin/sudo /etc/sudo.conf [user1@localhost ~]$ which sudo #和which查找作比較 /bin/sudo
4.locate命令,它和whereis公用mlocate數據庫,與whereis的區別就是,它更加的詳細。它會把含有目標文件的所有文件都列表出來!這是不是有點繁雜了呢。
例4.1 查找含有iptables的所有文件
[user1@localhost ~]$ locate iptables /etc/sysconfig/iptables-config /usr/bin/iptables-xml /usr/sbin/iptables … [user1@localhost ~]$ locate -c iptables# 統計含有iptables的文件的個數(行數) 18
例4.2 若有臨時文件的建立,再查找此臨時文件,必須手動更新數據庫
[user1@localhost ~]$ cd data/;mkdiraaaaaaaaa AAAAAAAAAAAA [user1@localhost data]$ ls aaaaaaaaa AAAAAAAAAAAA [user1@localhost data]$ locate -r"aaaaaaa*" [user1@localhost data]$ locate -r"AAAAAAAAAA*" 此時系統內已經有了目標文件,但是locate依賴的數據庫還未更新,所以檢索不到(-r是匹配正則表達式的參數),接下來更新數據庫 [user1@localhost data]$ updatedb updatedb: can not open a temporary filefor`/var/lib/mlocate/mlocate.db' 此處提示權限不夠!切換到root下刷新 [user1@localhost data]$ su - Password: Last login: Sun Feb 26 14:29:17 CST 2017 onpts/0 [root@localhost ~]# updatedb [root@localhost ~]# su - user1 Last login: Sun Feb 26 14:29:30 CST 2017 onpts/0 接下來就可以locate文件了 [user1@localhost ~]$ locate -r"aaaaaa*" /home/user1/data/aaaaaaaaa [user1@localhost ~]$ locate -r"AAAAAAAAAAA*" /home/user1/data/AAAAAAAAAAAA 注意的是:(-i代表的是不區分大小寫的參數)-r參數必須是參數的最后一個! [user1@localhost ~]$ locate -ri"aaaaaaa*" locate: non-option arguments are notallowed with --regexp [user1@localhost ~]$ locate -ir"aaaaaaa*" /home/user1/data/AAAAAAAAAAAA /home/user1/data/aaaaaaaaa [user1@localhost ~]$ locate -rc"aaaaa*" locate: non-option arguments are notallowed with --regexp [user1@localhost ~]$ locate -cr"aaaaa*" 2
5. whatis 命令,它在用catman -w命令創建的數據庫中查找command參數指定的命令、系統調用、庫函數或特殊文件名。whatis命令顯示手冊部分的頁眉行。然后可以發出man命令以獲取附加的信息。whatis命令等同于使用man -f命令。是在whatis數據庫中搜索命令。Whatis數據庫中包含了系統所有的命令的簡單描述。
例 5.1 whatis 的作用就是輸出系統命令簡單的描述信息,一般用的有點少。注意的是它不具有輸出自定義的命令的功能
[user1@localhost ~]$ whatis ls ls(1) - list directory contents ls(1p) - list directory contents [user1@localhost ~]$ su - Password: Last login: Sun Feb 26 12:04:01 CST2017 onpts/0 [root@localhost ~]# whatis ls ls(1) - list directory contents ls(1p) - list directory contents [root@localhost ~]#
6.apropos 命令,此命令可以搜索在whatis數據庫中的字符串,為關鍵字輸出一組數據庫文件包含的系統命令的簡短描述(例如要完成某項任務,但是又不知道哪些命令,就可以用apropos了,當然也可以用man的-k參數來完成)。注意的是:若系統命令增加了,則需要更新數據庫(update whatis),這樣才能準確!
例 6.1 查找與字符串“mkdir”有關的系統命令
[root@localhost ~]# man -k mkdir gvfs-mkdir(1) - Create directories mkdir(1) - makedirectories mkdir(1p) - makedirectories mkdir(2) - createa directory mkdir(3p) - make adirectory mkdirat(2) - create a directoryrelative to adirectory file descriptor [root@localhost ~]# apropos mkdir gvfs-mkdir(1) - Create directories mkdir(1) - makedirectories mkdir(1p) - makedirectories mkdir(2) - createa directory mkdir(3p) - make adirectory mkdirat(2) - create a directoryrelative to adirectory file descriptor
7.find 命令,超級無敵強大的命令。它無所不及,只是速度慢了些,因為它是在指定的磁盤位置一絲不茍的查找,很仔細。它的強大在于參數有很多,還可以接后續的操作!
命令格式:find [路徑] [選項] [-exec| -ok command {} \; ]
命令解釋:-exec(不交互)和-ok(交互)一樣,{} \;表示的是將輸出的內容交給command來處理
參數列表
參數 | 解釋 |
-name | 按照文件名來查找 |
-perm | 按照文件權限來查找 |
-user | 按照文件的用戶來查找 |
-group | 按照文件的組來查找 |
-atime n | 在過去n天內被訪問過(access_time)的文件,n表示天數,-n表示過去的n天內,+n表示過去的n天前,n表示確定的日期(過去的第n天) |
-ctime n | 在過去n天內被更改過(change_time)的文件,n表示天數,同上 |
-amin n | 在過去n分鐘內被訪問過(access_time)的文件,n表示分鐘數,同上 |
-cmin n | 在過去n分鐘內被更改過(change_time)的文件,n表示分鐘數,同上 |
-size n[ckMG] | 按文件大小查找,n表示大小,+n表示大于n的文件,-n表示小于n的文件,c表示字節,k表示kB,M代表MB,G表示GB |
-newer f1 | 查找更新時間比f1近的文件 |
-anewer f1 | 查找訪問時間比f1早的文件 |
-empty | 查找空文件,可以是目錄或文件 |
-type | 按照文件類型來查找 |
-fstype | 按照文件系統來查找 |
-nogroup | 查找無屬組的文件 |
-nouser | 查找無用戶的文件 |
-uid | 按照文件所屬用戶的UID查找 |
-gid | 按照文件所屬組的GID查找 |
-inum | 按照文件的inode節點號查找 |
-readable | 只匹配可讀文件 |
-samefile | 查找indode相同的文件 |
-writale | 匹配可寫文件 |
-links | 按照文件鏈接數查找 |
-depth | 使查找在進入子目錄查找前先查找完本目錄 |
-mount | 查找文件時不跨越文件系統mount點 |
-cpio | 備份查找到的文件 |
-cpio %; | 按照文件系統來查找文件,一般文件系統在/etc/fstab文件中有記錄 |
-prune | 忽略某個目錄 |
文件類型:
字符 | 解釋 |
b | 塊設備文件 |
c | 字符設備文件 |
d | 目錄文件 |
l | 鏈接文件 |
f | 普通文件 |
p | 管道文件 |
s | 套接字文件 |
例 7.1 在/home/user1/data目錄中找出有a字符的文件并刪除
[user1@localhost data]$ ls aaaaaaaaa AAAAAAAAAAAA sssss [user1@localhost data]$ ls aaaaaaaaa/ file11 file14 [user1@localhost data]$ find ./ -name"*a*" | rm -r rm: missing operand Try 'rm --help' for more information. 提示報錯說rm沒有操作對象,原因是rm不能接收從標準輸入傳來的數據!(不能接收標準輸入數據的還有:) [user1@localhost data]$ find ./ -name"*a*" |xargs rm –r [user1@localhost data]$ ls AAAAAAAAAAAA sssss [user1@localhost data]$ 方法二:注意刪掉后會有提示! [user1@localhost data]$ ls aaaaa AAAAAAAAAAAA sssss [user1@localhost data]$ ls aaaaa/ file1 file2 [user1@localhost data]$ find ./ -name"*a*" -exec rm -r {} \; find: ‘./aaaaa’: No such file or directory [user1@localhost data]$ ls AAAAAAAAAAAA sssss ####這里要說說-exec了。-exec是find的后續動作,也就是對find的結果集執行命令的接口。 ####“{}”是一個占位符,表示的是find操作的結果集。 ####“\;”表示的-exec的結束。奇怪的是在man文檔上說-exec命令的結尾是“;”,但是事實上 ####卻是“\;”這是什么意思,難道man文檔說錯了?不是的,這是shell的錯, ####“;”在bash(Linux中的默認shell,幾乎所有發行版都這樣)環境中有特殊意義, ####所以我們要使用“\”來轉義一下。
7.2 使用混合方式查找文件,查找當前目錄下大于1M并且在1天前訪問過的文件(-and是與關系;-or是或關系)
[root@localhost ~]# find /etc/ -size +1M-and -atime +1 /etc/selinux/targeted/active/policy.kern /etc/selinux/targeted/contexts/files/file_contexts.bin /etc/selinux/targeted/policy/policy.30 /etc/gconf/schemas/ekiga.schemas /etc/brltty/zh-tw.ctb ####注意的是: find會受目標文件的權限的限制,普通用戶在查找某些只有root才有訪問權限的文件時, 會報錯: [user1@localhost ~]$ find /etc/ -size +10M-and -atime +1 find: ‘/etc/pki/CA/private’: Permissiondenied find: ‘/etc/pki/rsyslog’: Permission denied find: ‘/etc/dhcp’: Permission denied find: ‘/etc/lvm/archive’: Permission denied find: ‘/etc/lvm/backup’: Permission denied find: ‘/etc/lvm/cache’: Permission denied find: ‘/etc/selinux/targeted/active’:Permission denied
7.3 使用權限-perm參數時候注意:-007代表的是最少權限為007的文件,而007代表的是權限就是007的文件(也就是所有用戶都可以讀寫執行的文件);-100代表的是權限最小是100的文件(就是所屬用戶可執行文件)。
[user1@localhost data]$ ll total 0 -------rwx 1 user1 user1 0 Feb 26 16:28file1 ---x------ 1 user1 user1 0 Feb 26 16:28file2 -rw-rw-r-- 1 user1 user1 0 Feb 26 16:29file3 [user1@localhost data]$ find ./ -perm 007 ./file1 [user1@localhost data]$ find ./ -perm -007 ./file1 [user1@localhost data]$ find ./ -perm 100 ./file2 [user1@localhost data]$ find ./ -perm -100 ./ ./file2 [user1@localhost data]$
7.4 無錯誤提示查找:若查找報錯,則將錯誤信息信息扔掉(/dev/null文件相當于Windows中的垃圾箱,不同的是任何文件放到此目錄下都將被瞬間清空,所以此目錄也是空目錄!),若查找正確,則打印出結果
[user1@localhost data]$ find ./ -nam"aaa" find: unknown predicate `-nam' [user1@localhost data]$ find ./ -nam"aaa" 2>/dev/null
小結:
命令 | 檢索文件 | 檢索對象 | 顯示內容 | 效能 |
which | $PATH中的文件/bin,/sbin | 命令,二進制文件 | 絕對路徑 | Root用戶使用最方便,普通用戶使用時有時會有權限問題 |
whereis | mlocate數據庫 | 可執行文件、幫助文檔、源代碼文件 | 絕對路徑,配置文件路徑,幫助文檔路徑 | 任何用戶都可使用,無權限問題,就是要更新 |
whatis | whatis數據庫 | 系統命令 | 目標命令簡介 | 速度快,得到命令的一組簡介集合 |
apropos | whatis數據庫 | 包含關鍵字的系統命令 | 一組相關命令簡介 | 速度快,得到關鍵字的一組簡介集合 |
locate | mlocate數據庫 | 文件 | 目標文件列表 | 速度快,但是索引數據庫每天自動更新,有時候不具有時效性 |
find | 文件系統 | 文件 | 目標文件列表 | 功能強大,常用作前提條件,為后續操作做鋪墊! |
以上就是Linux中文件查找與定位命令的詳細內容了,看完之后是否有所收獲呢?如果想了解更多相關內容,歡迎關注億速云行業資訊!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。