Linux下一切皆文件,但是文件由于文件的屬性的不同,在查找上可以針對不同的文件做相應的查找以便加快查詢速度和減少資源的消耗。注意的是在磁盤中查找是要受到權限控制的,但是在數據庫中查找是無權限約束的。
1 .Linux中最常用的就是which命令了,它是在$PATH環(huán)境變量(用于保存可執(zhí)行文件的默認路徑)中指定的路徑來搜索可執(zhí)行文件的它一般用來確定是否安裝了軟件,例如查看是否安裝了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的區(qū)別
[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系統自動創(chuàng)建的,包含了本地文件的信息,并且每天自動執(zhí)行updatedb命令來更新該數據庫。正是因為每天更新一次,所以有時候搜索并不準確,比如剛剛添加的文件搜索不到,剛剛刪除的文件還能搜索到。所以一般使用的時候先手動執(zhí)行updatedb命令,再whereis。這樣有點失去了高效的特性。它只能查找可執(zhí)行文件、聯機幫助文檔和源代碼文件。
例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的區(qū)別就是,它更加的詳細。它會把含有目標文件的所有文件都列表出來!這是不是有點繁雜了呢。
例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代表的是不區(qū)分大小寫的參數)-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命令創(chuàng)建的數據庫中查找command參數指定的命令、系統調用、庫函數或特殊文件名。whatis命令顯示手冊部分的頁眉行。然后可以發(fā)出man命令以獲取附加的信息。whatis命令等同于使用man -f命令。是在whatis數據庫中搜索命令。Whatis數據庫中包含了系統所有的命令的簡單描述。
例5.1whatis的作用就是輸出系統命令簡單的描述信息,一般用的有點少。注意的是它不具有輸出自定義的命令的功能
[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命令,超級無敵強大的命令。它無所不及,只是速度慢了些,因為它是在指定的磁盤位置一絲不茍的查找,很仔細。它的強大在于參數有很多,還可以接后續(xù)的操作!
命令格式: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表示字節(jié),k表示kB,M代表MB,G表示GB
-newer f1
查找更新時間比f1近的文件
-anewer f1
查找訪問時間比f1早的文件
-empty
查找空文件,可以是目錄或文件
-type
按照文件類型來查找
-fstype
按照文件系統來查找
-nogroup
查找無屬組的文件
-nouser
查找無用戶的文件
-uid
按照文件所屬用戶的UID查找
-gid
按照文件所屬組的GID查找
-inum
按照文件的inode節(jié)點號查找
-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的后續(xù)動作,也就是對find的結果集執(zhí)行命令的接口?!皗}”是一個占位符,表示的是find操作的結果集。“\;”表示的-exec的結束。奇怪的是在man文檔上說-exec命令的結尾是“;”,但是事實上卻是“\;”這是什么意思,難道m(xù)an文檔說錯了?不是的,這是shell的錯,“;”在bash(Linux中的默認shell,幾乎所有發(fā)行版都這樣)環(huán)境中有特殊意義,所以我們要使用“\”來轉義一下。
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的文件(也就是所有用戶都可以讀寫執(zhí)行的文件);-100代表的是權限最小是100的文件(就是所屬用戶可執(zhí)行文件)。
[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數據庫
可執(zhí)行文件、幫助文檔、源代碼文件
絕對路徑,配置文件路徑,幫助文檔路徑
任何用戶都可使用,無權限問題,就是要更新
whatis
whatis數據庫
系統命令
目標命令簡介
速度快,得到命令的一組簡介集合
apropos
whatis數據庫
包含關鍵字的系統命令
一組相關命令簡介
速度快,得到關鍵字的一組簡介集合
locate
mlocate數據庫
文件
目標文件列表
速度快,但是索引數據庫每天自動更新,有時候不具有時效性
find
文件系統
文件
目標文件列表
功能強大,常用作前提條件,為后續(xù)操作做鋪墊!