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 比較whichtype –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

3Linux中查找速度最快的命令,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表示kBM代表MBG表示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]$

74 無錯誤提示查找:若查找報錯,則將錯誤信息信息扔掉(/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

文件系統

文件

目標文件列表

功能強大,常用作前提條件,爲後續操作做鋪墊!

 

 

 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章