国产激情久久久久影院小草_国产91高跟丝袜_99精品视频99_三级真人片在线观看

Linux學(xué)習(xí)之find命令詳解

時(shí)間:2024-09-15 19:16:55 Linux認(rèn)證 我要投稿
  • 相關(guān)推薦

Linux學(xué)習(xí)之find命令詳解2016

  find命令是我們?nèi)粘9ぷ髦斜容^常用的Linux命令。全面的掌握這個(gè)命令可以使很多操作達(dá)到事半功倍的效果。如果對(duì)find命令有以下這些疑惑,本文都能幫你解決,快來學(xué)習(xí)吧!

Linux學(xué)習(xí)之find命令詳解2016

  1、find命令的格式是什么?

  2、參數(shù)中出現(xiàn)+或-號(hào)是什么意思?比如find / -mtime +7與find / -mtime -7什么區(qū)別?

  3、find /etc/ -name “passwd” -exec echo {} \;和find /etc/ -name “passwd” -exec echo {} +有啥區(qū)別?

  4、-exec參數(shù)為什么要以“\;”結(jié)尾,而不是只寫“;”?

  命令基礎(chǔ)

  find命令大家都比較熟悉,反倒想講的有特色比較困難。那干脆我們?cè)趺雌降趺磥砗昧恕N覀円话阌玫膄ind命令格式很簡(jiǎn)單,一般分成三個(gè)部分:

  find /etc -name "passwd"

  格式如上,第一段find命令。第二段,要搜索的路徑。這一段目錄可以寫多個(gè),如:

  find /etc /var /usr -name "passwd"

  第三段,表達(dá)式。我們例子中用的是-name “passwd”這個(gè)表達(dá)式,指定條件為找到文件名是passwd的文件。對(duì)于find命令,最需要學(xué)習(xí)的是表達(dá)式這一段。表達(dá)式?jīng)Q定了我們要找的文件是什么屬性的文件,還可以指定一些“動(dòng)作”,比如將匹配某種條件的文件刪除。所以,find命令的核心就是表達(dá)式(EXPRESSION)的指定方法。

  find命令中的表達(dá)式有四種類型,分別是:

  1、Tests:就是我們最常用的指定查找文件的條件。

  2、Actions:對(duì)找到的文件可以做的操作。

  3、Global options:全局屬性用來限制一些查找的條件,比如常見的目錄層次深度的限制。

  4、Positional options:位置屬性用來指定一些查找的位置條件。

  這其中最重要的就是Tests和Actions,他們是find命令的核心。另外還有可以將多個(gè)表達(dá)式連接起來的操作符,他們可以表達(dá)多個(gè)表達(dá)式之間的邏輯關(guān)系和運(yùn)算優(yōu)先順序,叫做Operators。

  下面我們就來分類看一下這些個(gè)分類的功能。

  TESTS

  find命令是通過文件屬性查找文件的。所以,find表達(dá)式的tests都是文件的屬性條件,比如文件的各種時(shí)間,文件權(quán)限等。很多參數(shù)中會(huì)出現(xiàn)指定一個(gè)數(shù)字n,一般會(huì)出現(xiàn)三種寫法:

  +n:表示大于n。

  -n:表示小于n。

  n:表示等于n。

  根據(jù)時(shí)間查找

  比較常用數(shù)字方式來指定的參數(shù)是針對(duì)時(shí)間的查找,比如-mtime n:查找文件修改時(shí)間,單位是天,就是n*24小時(shí)。舉個(gè)例子說:

  [root@zorrozou-pc0 zorro]# find / -mtime 7 -ls

  我們?yōu)榱朔奖憧吹浇Y(jié)果,在這個(gè)命令中使用了-ls參數(shù),具體細(xì)節(jié)后面會(huì)詳細(xì)解釋。再此我們只需要知道這個(gè)參數(shù)可以將符合條件的文件的相關(guān)屬性顯示出來即可。那么我們就可以通過這個(gè)命令看到查找到的文件的修改時(shí)間了。

  [root@zorrozou-pc0 zorro]# find / -mtime 7 -ls|head

  524295 4 drwxr-xr-x 12 root root 4096 6月 8 13:43 /root/.config

  524423 4 drwxr-xr-x 2 root root 4096 6月 8 13:43 /root/.config/yelp

  524299 4 drwxr-xr-x 2 root root 4096 6月 8 13:23 /root/.config/dconf

  524427 4 -rw-r--r-- 1 root root 3040 6月 8 13:23 /root/.config/dconf/user

  ...

  我們會(huì)發(fā)現(xiàn),時(shí)間都集中在6月8號(hào),而今天是:

  [root@zorrozou-pc0 zorro]# date

  2016年 06月 15日 星期三 14:30:09 CST

  實(shí)際上,當(dāng)我們?cè)趍time后面指定的是7的時(shí)候,實(shí)際上是找到了距離現(xiàn)在7個(gè)24小時(shí)之前修改過的文件。如果我們?cè)诳季恳幌录?xì)節(jié)的話,可以使用這個(gè)命令再將找到的文件用時(shí)間排下順序:

  [root@zorrozou-pc0 zorro]# find / -mtime 7 -exec ls -tld {} \+

  此命令用到了exec參數(shù),后面會(huì)詳細(xì)說明。我們會(huì)發(fā)現(xiàn),找到的文件實(shí)際上是集中在6月7日的14:30到6月8日的14:30這個(gè)范圍內(nèi)的。就是說,實(shí)際上,指定7天的意思是說,找到文件修改時(shí)間范圍屬于距離當(dāng)前時(shí)間7個(gè)24小時(shí)到8個(gè)24小時(shí)之間的文件,這是不加任何+-符號(hào)的7的含義。如果是-mtime -7呢?

  [root@zorrozou-pc0 zorro]# find / -mtime -7 -exec ls -tld {} \+

  你會(huì)發(fā)現(xiàn)找到的文件是從現(xiàn)在開始到7個(gè)24小時(shí)范圍內(nèi)的文件。但是不包括7個(gè)24小時(shí)到8個(gè)24小時(shí)的時(shí)間范圍。那么-mtime +7也應(yīng)該好理解了。這就是find指定時(shí)間的含義。類似的參數(shù)還有:

  -ctime:以天為單位通過change time查找文件。

  -atime:以天為單位通過access time查找文件。

  -mmin:以分鐘為單位通過modify time查找文件。

  -amin:以分鐘為單位通過access time查找文件。

  -cmin:以分鐘單位通過change time查找文件。

  這些參數(shù)都是指定一個(gè)時(shí)間數(shù)字n,數(shù)字的意義跟mtime完全一樣,只是時(shí)間的單位和查找的時(shí)間不一樣。

  除了指定時(shí)間以外,find還可以通過對(duì)比某一個(gè)文件的相關(guān)時(shí)間找到符合條件的文件,比如-anewer file。

  [root@zorrozou-pc0 zorro]# find /etc -anewer /etc/passwd

  這樣可以在/etc/目錄下找到文件的access time比/etc/passwd的access time更新的所有文件。類似的參數(shù)還有:

  -cnewer:比較文件的change time。

  -newer:比較文件的modify time。

  -newer還有一種特殊用法,可以用來做各種時(shí)間之間的比較。比如,我想找到文件修改時(shí)間比/etc/passwd文件的change time更新的文件:

  [root@zorrozou-pc0 zorro]# find /etc/ -newermc /etc/passwd

  這個(gè)用法的原型是:find /etc/ -newerXY file。其中Y表示的是跟后面file的什么時(shí)間比較,而X表示使用查找文件什么時(shí)間進(jìn)行比較。-newermc就是拿文件的modify time時(shí)間跟file的change time進(jìn)行比較。X和Y可以使用的字母為:

  a:文件access time。

  c:文件change time。

  m:文件modify time。

  在某些支持記錄文件的創(chuàng)建時(shí)間的文件系統(tǒng)上,可以使用B來表示文件創(chuàng)建時(shí)間。ext系列文件系統(tǒng)并不支持記錄這個(gè)時(shí)間。

  根據(jù)用戶查找

  -uid n:文件的所屬用戶uid為n。

  -user name:文件的所屬用戶為name。

  -gid n:文件的所屬組gid為n。

  -group name:所屬組為name的文件。

  -nogroup:沒有所屬組的文件。

  -nouser:沒有所屬用戶的文件。

  根據(jù)權(quán)限查找

  -executable:文件可執(zhí)行。

  -readable:文件可讀。

  -writable:文件可寫。

  -perm mode:查找權(quán)限為mode的文件,mode的寫法可以是數(shù)字,也可以是ugo=rwx的方式如:

  [root@zorrozou-pc0 zorro]# find /etc/ -perm 644 -ls

  這個(gè)寫法跟:

  [root@zorrozou-pc0 zorro]# find /etc/ -perm u=rw,g=r,o=r -ls

  是等效的。

  另外要注意,mode指定的是完全符合這個(gè)權(quán)限的文件,如:

  [root@zorrozou-pc0 zorro]# find /etc/ -perm u=rw,g=r -ls

  263562 4 -rw-r----- 1 root brlapi 33 11月 13 2015 /etc/brlapi.key

  沒描述的權(quán)限就相當(dāng)于指定了沒有這個(gè)權(quán)限。

  mode還可以使用/或-作為前綴進(jìn)行描述。如果指定了-mode,就表示沒指定的權(quán)限是忽略的,就是說,權(quán)限中只要包涵相關(guān)權(quán)限即可。如:

  [root@zorrozou-pc0 zorro]# find /etc/ -perm 600 -ls

  這是找到所有只有rw———-權(quán)限的文件,而-600就表示只要是包括了rw的其他位任意的文件。mode加/前綴表示的是,指定的權(quán)限只要某一位復(fù)合條件就可以,其他位跟-一樣忽略,就是說-perm /600還可以找到r————或者-w———-這樣權(quán)限的文件。老版本的/前綴是用+表示的,新版本的find意境不支持mode前加+前綴了。

  根據(jù)路徑查找

  -name pattern:文件名為pattern指定字符串的文件。注意如果pattern中包括*等特殊符號(hào)的時(shí)候,需要加””。

  -iname:name的忽略大小寫版本。

  -lname pattern:查找符號(hào)連接文件名為pattern的文件。

  -ilname:lname的忽略大小寫版本。

  -path pattern:根據(jù)完整路徑查找文件名為pattern的文件,如:

  [root@zorrozou-pc0 zorro]# find /etc -path "/e*d"| head

  /etc/machine-id

  /etc/profile.d

  /etc/vnc/xstartup.old

  /etc/vnc/config.d

  /etc/vnc/updateid

  /etc/.updated

  -ipath:path的忽略大小寫版本。

  -regex pattern:用正則表達(dá)式匹配文件名。

  -iregex:regex的忽略大小寫版本。

  其他狀態(tài)查找

  -empty:文件為空而且是一個(gè)普通文件或者目錄。

  -size n[cwbkMG]:指定文件長度查找文件。單位選擇位:

  c:字節(jié)單位。

  b:塊為單位,塊大小為512字節(jié),這個(gè)是默認(rèn)單位。

  w:以words為單位,words表示兩個(gè)字節(jié)。

  k:以1024字節(jié)為單位。

  M:以1048576字節(jié)為單位。

  G:以1073741824字節(jié)溫單位。

  n的數(shù)字指定也可以使用+-號(hào)作為前綴。意義跟時(shí)間類似,表示找到小于(-)指定長度的文件或者大于(+)指定長度的文件。

  -inum:根據(jù)文件的inode編號(hào)查找。

  -links n:根據(jù)文件連接數(shù)查找。

  -samefile name:找到跟name指定的文件完全一樣的文件,就是說兩個(gè)文件是硬連接關(guān)系。

  -type c:以文件類型查找文件:

  c可以選擇的類型為:

  b:塊設(shè)備

  c:字符設(shè)備

  d:目錄

  p:命名管道

  f:普通文件

  l:符號(hào)連接

  s:socket

  ACTIONS

  表達(dá)式中的actions類型參數(shù)主要是用來對(duì)找到的文件進(jìn)行操作的參數(shù)。在上面的例子中,我們已經(jīng)看到可以使用-ls參數(shù)對(duì)找到的文件進(jìn)行長格式顯示,這就是一個(gè)actions類型的參數(shù)。類似的參數(shù)還有。

  -fls file:跟-ls功能一樣,區(qū)別是將信息寫入file指定的文件,而不是顯示在屏幕上。

  -print:將找到的文件顯示在屏幕上,實(shí)際上默認(rèn)find命令就會(huì)將文件打印出來顯示。

  -print0:-print參數(shù)會(huì)將每個(gè)文件用換行分割,而這個(gè)參數(shù)適用null分割。有時(shí)候在腳本編程時(shí)可能會(huì)用上。

  -fprint file:-print參數(shù)的寫入文件版本。將內(nèi)容寫到文件中,而不是顯示在屏幕上。

  -fprint0 file:-print0的寫入文件版本。

  -delete:可以將找到的文件直接刪除。

  -printf:格式化輸出方式打印。如:

  [root@zorrozou-pc0 zorro]# find /etc/ -name "pass*" -printf "%p "

  /etc/default/passwd /etc/pam.d/passwd /etc/passwd- /etc/passwd

  顯示文件名,并以空格分隔。%p代表文件名。其他信息可以參見man find。

  -prune:如果復(fù)合條件的是一個(gè)目錄,則不進(jìn)入目錄進(jìn)行查找。例子:

  [root@zorrozou-pc0 zorro]# mkdir /etc/passs

  [root@zorrozou-pc0 zorro]# touch /etc/passs/passwd

  [root@zorrozou-pc0 zorro]# find /etc/ -name "pass*" -prune

  /etc/passs

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd-

  /etc/passwd

  [root@zorrozou-pc0 zorro]# find /etc/ -name "pass*"

  /etc/passs

  /etc/passs/passwd

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd-

  /etc/passwd

  我們先創(chuàng)建了一個(gè)/etc/passs的目錄,然后在這個(gè)目錄下創(chuàng)建了一個(gè)叫passwd的文件。之后先用帶-prune的find看到,能顯示出passs目錄,但是目錄中的passwd文件并沒有顯示,說明這個(gè)參數(shù)讓find命令沒有進(jìn)入這個(gè)目錄查找。而后一個(gè)不帶-prune參數(shù)的find顯示出了passs目錄下的passwd。

  -quit:找到符合條件的文件后立即退出。

  find中執(zhí)行命令

  -exec

  find命令的exec是一個(gè)非常好用的參數(shù),當(dāng)然其可能造成的破壞也可能非常大。在學(xué)習(xí)它之前,我先要提醒大家,使用之前千萬要確定自己在做什么。

  這個(gè)參數(shù)的常見格式是:

  -exec command ;

  注意后面的分號(hào)。它是用來給find做標(biāo)記用的。find在解析命令的時(shí)候,要區(qū)分給定的參數(shù)是要傳給自己的還是要傳給command命令的。所以find以分號(hào)作為要執(zhí)行命令所有參數(shù)的結(jié)束標(biāo)記。命令返回值為0則返回true。在exec參數(shù)指定的執(zhí)行命令中,可以使用{}符號(hào)表示當(dāng)前find找到的文件名。比如:

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \;

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd

  上面的命令表示,找到/etc/目錄下文件名為passwd的文件,并echo其文件名。注意再使用分號(hào)的時(shí)候前面要加轉(zhuǎn)移字符\,因?yàn)榉痔?hào)也是bash的特殊字符,所以bash會(huì)先解釋它。前面加上\就可以讓bash直接將其船體給find命令,這個(gè)分號(hào)由find解釋,而不是bash。其實(shí)這個(gè)exec用的比較廢話,畢竟find本身就會(huì)找到相關(guān)條件的文件并顯示其文件名。但是試想如果我們將echo換成rm或者cp,是不是就有意義的多?比如:

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec rm {} \;

  請(qǐng)不要執(zhí)行這個(gè)命令!!

  或者:

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec cp {} {}.bak \;

  這個(gè)命令可以將符合條件的文件都加個(gè).bak后綴備份一份。于是我們可以執(zhí)行刪除了:

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd.bak"

  /etc/default/passwd.bak

  /etc/pam.d/passwd.bak

  /etc/passwd.bak

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd.bak" -exec rm {} \;

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd.bak"

  當(dāng)然,刪除前還是要確認(rèn)清楚你要?jiǎng)h的文件一定是對(duì)的。

  -execdir

  execdir和exec有一些差別,主要是在執(zhí)行指定的命令時(shí),那個(gè)相關(guān)命令是在那個(gè)工作目錄下執(zhí)行的差別。exec是在find所指定的起始目錄,而execdir是文件所在目錄。對(duì)比一下就明白了:

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \;

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -execdir echo {} \;

  ./passwd

  ./passwd

  ./passwd

  一個(gè)命令打印出來的路徑都是/etc/開頭,另一個(gè)顯示的都是當(dāng)前目錄下的某某文件。

  execdir的方式要比exec安全一些,因?yàn)檫@種執(zhí)行方式避免了在解析文件名時(shí)所產(chǎn)生的競(jìng)爭(zhēng)條件。

  出了上述兩種比較典型的執(zhí)行命令的方法以外,find還對(duì)這兩個(gè)參數(shù)提供了另一種形式的命令執(zhí)行格式:

  -exec command {} +

  -execdir command {} +

  我們還是先用例子來看一下這個(gè)格式和以分號(hào)結(jié)束的方式的差別:

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \;

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd

  [root@zorrozou-pc0 find]# find /etc/ -name "passwd" -exec echo {} \+

  /etc/default/passwd /etc/pam.d/passwd /etc/passwd

  光這樣看可能還不是很明顯,我們可以這樣在描述一遍他們的執(zhí)行過程:

  echo /etc/default/passwd

  echo /etc/pam.d/passwd

  echo /etc/passwd

  和

  echo /etc/default/passwd /etc/pam.d/passwd /etc/passwd

  其實(shí)就是說,對(duì)于command {} ;格式來說,每找到一個(gè)文件就執(zhí)行一遍相關(guān)命令,而command {} +格式的意思是說,先執(zhí)行find,找到所有符合條件的文件之后,將每個(gè)文件作為命令的一個(gè)參數(shù)傳給命令執(zhí)行,exec指定的命令實(shí)際上只被執(zhí)行了一次。這樣用的限制也是不言而喻的:{}只能出現(xiàn)一次。

  [root@zorrozou-pc0 find]# find /etc -mtime -7 -type f -exec cp -t /tmp/back/ {} \+

  上面這個(gè)命令將符合條件的文件全部cp到了/tmp/back目錄中,當(dāng)然如果文件有重名的情況下,會(huì)被覆蓋掉。從這個(gè)命令中我們學(xué)習(xí)一下{} +格式的使用注意事項(xiàng),它不能寫成:

  find /etc -mtime -7 -type f -exec cp {} /tmp/back/ \+

  所以只能使用-t參數(shù)改變cp命令的參數(shù)順序來指定相關(guān)的動(dòng)作。

  無論如何,直接使用exec和execdir是很危險(xiǎn)的,因?yàn)樗麄儠?huì)直接對(duì)找到的文件調(diào)用相關(guān)命令,并且沒有任何確認(rèn)。所以我們不得不在進(jìn)行相關(guān)操作前再三確認(rèn),以防止誤操作。當(dāng)然,find命令也給了更安全的exec參數(shù),它們就是:

  -ok

  -okdir

  它們的作用跟exec和execdir一樣,區(qū)別只是在做任何操作之前,會(huì)讓用戶確認(rèn)是不是ok?如:

  [root@zorrozou-pc0 find]# find /etc -mtime -7 -type f -ok cp -t /tmp/back/ {} \;

  < cp ... /etc/bluetooth/main.conf > ?

  于是,每一次cp你都要確認(rèn)是不是要這么做。只要你輸入的是y或者以y開頭的任何字符串,都是確認(rèn)。其他的字符串是否認(rèn)。另外,這兩個(gè)參數(shù)不支持{} +的格式。

  OPERATORS

  find的操作符(OPERATORS)實(shí)際上是用來連接多個(gè)表達(dá)式和確定其邏輯關(guān)系用的。如:

  [root@zorrozou-pc0 zorro]# find /etc -name "pass*" -type f

  /etc/passs/passwd

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd-

  /etc/passwd

  這個(gè)find命令中使用了兩個(gè)表達(dá)式,他們之間沒有任何分隔,這是實(shí)際上表達(dá)的含義是,找到兩個(gè)條件都符合的文件。實(shí)際上就是表達(dá)式的邏輯與關(guān)系,這跟-a參數(shù)連接或者-and參數(shù)一樣:

  [root@zorrozou-pc0 zorro]# find /etc -name "pass*" -a -type f

  /etc/passs/passwd

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd-

  /etc/passwd

  [root@zorrozou-pc0 zorro]# find /etc -name "pass*" -and -type f

  /etc/passs/passwd

  /etc/default/passwd

  /etc/pam.d/passwd

  /etc/passwd-

  /etc/passwd

  除了邏輯與關(guān)系以外,還有邏輯或關(guān)系:

  [root@zorrozou-pc0 zorro]# find /etc -name "pass*" -o -type f

  [root@zorrozou-pc0 zorro]# find /etc -name "pass*" -or -type f

  表示兩個(gè)條件只要符合其中一個(gè)都可以。

  在條件表達(dá)式前面加!表示對(duì)表達(dá)式取非。同樣的也可以用-not參數(shù)。另外如果表達(dá)式很多,可以使用( expr )確定優(yōu)先級(jí),如:

  [root@zorrozou-pc0 zorro]# find / \( -name "passwd" -a -type f \) -o \( -name "shadow" -a -type f \)

  這里表示的是:-name “passwd” -a -type f和-name “shadow” -a -type f是或關(guān)系。

  最后

  find中還可能常用的其他參數(shù)比如:

  -depth:制定了這個(gè)參數(shù)后,遇到目錄先進(jìn)入目錄操作目錄中的文件,最后再操作目錄本身。

  -maxdepth:目錄最大深度限制。

  -mindepth:目錄最小深度限制。

  還有一些其他相關(guān)參數(shù)大家可以在man find中自行補(bǔ)充,就不在這更多廢話了。希望本篇可以對(duì)大家深入的掌握find命令有所幫助。

【Linux學(xué)習(xí)之find命令詳解】相關(guān)文章:

Linux文件查找命令find和xargs詳解09-29

常用的Linux命令詳解07-19

Linux下top命令詳解09-25

Linux認(rèn)證基礎(chǔ)知識(shí):RedHat之vi命令詳解10-02

Linux解壓縮命令詳解201609-04

ping命令詳解09-14

linux常用基本命令(文件處理命令)09-09

Linux文件查找工具find全解讀08-14

Linux硬件信息命令大全10-10

java開發(fā)必會(huì)的Linux命令10-07