[一文一命令]find命令详解
Find命令
名稱find - search for files in a directory hierarchy
語法find [-H] [-L] [-P] [path...] [expression]
命令參數(shù):
Pathname ? ?find命令所查找的目錄路徑。
-print ? ? ?find將匹配的文件的輸出到標(biāo)準(zhǔn)輸出中-->默認(rèn)查找到不打印出來
-exec ? ? ? find命令對(duì)匹配的文件執(zhí)行該參數(shù)所給出的shell命令。相應(yīng)的形式為‘command’{} \---》也就是說我們用這個(gè)參數(shù)能夠?qū)ξ覀冇胒ind找出來的文件進(jìn)行操作。
-ok ? ? ? ? 和exec的作用相同只不過是以一種更為安全的模式來執(zhí)行該參數(shù)所給出的shell命令。在執(zhí)行每一個(gè)命令之前都會(huì)給出提示讓用戶來確定是否執(zhí)行。
命令選項(xiàng)
-name ? ? ? 按照文件的文件名來查找文件
-perm ? ? ? 按照文件權(quán)限來查找文件
-prune ? ? ?可以讓find命令不在當(dāng)前目錄里面查找。
-user ? ? ? 按照文件所屬的擁有者來查找
-group ? ? ?按照文件所屬的用戶組來查找
-nogroup ? ?查找無有效所屬組的文件即用戶組不在/etc/groups文件里面。
-nouser ? ? 查找無有效用戶的文件
-type ? ? ? 查找某一類型的文件
? ? ? d ?目錄
? ? ? f ?普通文件
? ? ? l ?符號(hào)鏈接文件
? ? ? c ?字符設(shè)備文件
? ? ? b ?塊設(shè)備文件
-size n ? ?查找文件長(zhǎng)度為n快的文件帶c時(shí)表示文件長(zhǎng)度以字節(jié)計(jì)。
-fstype ? ?查找位于某一類型文件系統(tǒng)中的文件。
-mount ? ? 在查找文件時(shí)不跨越文件系統(tǒng)mount點(diǎn)
-follow ? ?如果find命令遇到符號(hào)鏈接文件就跟蹤至鏈接所指向的文件
-cpio ? ? ?對(duì)匹配的文件使用cpio命令將這些文件備份到磁帶設(shè)備中。
a:access訪問 ? c:change變更 ? m:modified改動(dòng)
-amin n ? ? 查找系統(tǒng)中最后N分鐘訪問(access)的文件
-atime n ? ?查找系統(tǒng)中最后n 天前訪問的文件 ? -n表示在n天內(nèi)+n表示在n天前其余類似。
-cmin n ? ? 查找系統(tǒng)最后n分鐘被改變(change)文件狀態(tài)的文件
-ctime n ? ?查找系統(tǒng)中最后n*24小時(shí)被改動(dòng)過文件狀態(tài)的文件
-mmin n ? ? 查找系統(tǒng)中最后n分鐘被改動(dòng)(modified)過文件數(shù)據(jù)的文件
-mtime n ? ?查找系統(tǒng)中最后n*24小時(shí)被改變文件數(shù)據(jù)的文件-n ?+n 按照文件所更改的時(shí)間來查找文件-n 表示更改在n天內(nèi)的+n表示更改在n天前的。
使用實(shí)例
查找指定時(shí)間內(nèi)的文件
[root@LiWenTong test]# find -amin ?-1 à訪問時(shí)間為1天內(nèi)的文件。--》錯(cuò)了應(yīng)該是1分鐘吧。寫博文的時(shí)候發(fā)現(xiàn)的。
./test1
./test1/test2
查找創(chuàng)建時(shí)間在最近的。c:change ?改變文件狀態(tài)的。
find -ctime -19
根據(jù)關(guān)鍵字查找
[root@LiWenTong test]# find -name *.log
./2.log
根據(jù)權(quán)限、類型來查找文件
[root@LiWenTong test]# find / -perm 777 -name *.log
/root/test/2.log
[root@LiWenTong test]# find / -perm 777 -type d
find: /proc/4435/task/4435/fd/4: No such file ordirectory
find: /proc/4435/task/4435/fdinfo/4: No such fileor directory
find: /proc/4435/fd/4: No such file or directory
find: /proc/4435/fdinfo/4: No such file ordirectory
/root/test/test1
[root@LiWenTong test]# find /root/ -type d
/root/
/root/test
/root/test/test1
/root/test/test1/test2
[root@LiWenTong test]# find /root/ -type f
/root/.cshrc
/root/2.log
/root/.bash_logout
/root/3.log
/root/1.log
/root/test.txt
/root/2lo
--->查找用戶
find -user root
find -type ?f文件 ?d目錄
------以下是一些實(shí)例----
$find ? ~ ? -name ? "*.txt" ? -print ? ?#在$HOME中查.txt文件并顯示
$find ? . ? ?-name ? "*.txt" ? -print
$find ? . ? ?-name ? "[A-Z]*" ? -print ? #查以大寫字母開頭的文件
$find ? /etc ? -name ? "host*" ? -print #查以host開頭的文件
$find ? . ? -name ? "[a-z][a-z][0–9][0–9].txt" ? ?-print ? #查以兩個(gè)小寫字母和兩個(gè)數(shù)字開頭的txt文件
$find . ? -perm ? 755 ? -print
$find ? . ? -perm -007 ? -exec ls -l {} \; ? #查所有用戶都可讀寫執(zhí)行的文件同-perm 777
$find ? . -type d ? -print
$find ? . ? ! ? -type ? d ? -print
$find ? . ? -type l ? -print
$find ? . ? -size ? +1000000c ? -print ? ? ? ?#查長(zhǎng)度大于1Mb的文件
$find ? . ? -size ? 100c ? ? ? ? -print ? ? ? # 查長(zhǎng)度為100c的文件
$find ? . ? -size ? +10 ? -print ? ? ? ? ? ? ?#查長(zhǎng)度超過期作廢10塊的文件1塊=512字節(jié)
$cd /
$find ? etc ? home ? apps ? ?-depth ? -print ? | cpio ? -ivcdC65536 ? -o ? /dev/rmt0
$find ? /etc -name "passwd*" ? -exec grep ? "cnscn" ? {} ? \; ? #看是否存在cnscn用戶
$find . -name "yao*" ? | xargs file
$find ? . -name "yao*" ? | ? xargs ? echo ? ?"" > /tmp/core.log
$find ? . -name "yao*" ? | xargs ? chmod ? o-w
-----小結(jié)-------------------------------------------------------------------------------
? ?find命令能夠找到我們想找的任何文件,因?yàn)槲覀兡軌蛟O(shè)定的參數(shù)有很多。如最簡(jiǎn)單的文件名-name 用戶 -user 類型 -type f d l 。修改、訪問的時(shí)間也能夠作為我們查找的參數(shù)。
? ?并且我們能對(duì)找到的文件進(jìn)行的操作,只要后面加上-exec參數(shù)。當(dāng)然這個(gè)我們后面再講將怎么操作查找到的文件。現(xiàn)在先說怎么找到我們想要的文件。名稱查找是否能夠用正則表達(dá)式,還需要驗(yàn)證下。接下來就來講如何對(duì)我們查找到的文件進(jìn)行操作。
----------------------------------------------------------------------------------------
Find命令之-exec選項(xiàng)
用法簡(jiǎn)述:
使用find命令查找出來的文件有時(shí)候需要做一定的處理。我們通過加上-exec選項(xiàng),并在后面跟上command命令就可以對(duì)我們所查找到的文件進(jìn)行操作。格式為:-exec command {} \; {}代表的是find查找出來的文件名。此處存有疑問--》后經(jīng)驗(yàn)證確實(shí)是{}代表find找出來的文件,而不是{} \;代表找到的文件。
1)查找文件類型并修改權(quán)限
[root@LiWenTong test]# find /root/test -type f -exec ls -l {} \;
--->find /root/test -type f ?-name *.log -print ?
---->有時(shí)候?yàn)榱吮WC-exec執(zhí)行正確可以通過-print 或ls先把find查找的文件輸出查看下是否是我們需要操作的文件以保誤操作。--->這個(gè)就是為了在做操作之前先知道下我們要的文件是不是我們想要的。
-rwxrwxrwx 1 root root 26 Apr 29 02:13/root/test/2.log
-rwxrwxrwx 1 root root 43 Apr 29 02:12/root/test/test1/1.log
-rwxrwxrwx 1 root root 22 Apr 29 02:14/root/test/test1/test2/3.log
[root@LiWenTong test]# find /root/test -type f -exec chmod 755 {} \;
-------exec選項(xiàng)后接的命令講解------------------
? ?-exec后面的命令怎么接命令,有些同學(xué)可能還不能直觀的理解過來。其實(shí)很好理解,我們?cè)镜牟僮髅罡袷绞鞘裁礃拥默F(xiàn)在的格式還是什么樣的。只是當(dāng)你需要用到查找出的文件的時(shí)候,就用{}待入就是了。
? ?比如要?jiǎng)h除一個(gè)文件:rm ?-f ?filename 這個(gè)是rm原來的格式,那現(xiàn)在是我們要?jiǎng)h除找出來的文件,帶入就變成 ?rm -f {},但要記住最后要用\;結(jié)束。如果是mv命令呢?原本 mv old.file ?/tmp 代入后變 mv {} /tmp \;還是mv {} \; /tmp 呢?
? ?---》以上的問題驗(yàn)證確實(shí)是{}代表find找到的文件后文有實(shí)例。也就是應(yīng)該是:mv ?old.file {} /tmp \;
-----------------------------------------
2)在當(dāng)前目錄下查找數(shù)據(jù)修改1天內(nèi)的文件
[root@LiWenTong test]# find -type f -mtime -1 -exec ls -l {} \;
-rwxr-xr-x 1 root root 26 Apr 29 02:13 ./2.log
-rwxr-xr-x 1 root root 43 Apr 29 02:12./test1/1.log
-rwxr-xr-x 1 root root 22 Apr 29 02:14./test1/test2/3.log
[root@LiWenTong test]# find -type f -mtime -1 -exec rm -f {} \;
[root@LiWenTong test]# ll
total 4
drwxrwxrwx 3 root root 4096 Apr 29 04:01 test1
3)使用-ok 選項(xiàng)較為安裝的執(zhí)行命令
使用-ok選項(xiàng)同-exec一樣只是在做相應(yīng)的操作時(shí)會(huì)有提示。
[root@LiWenTong test]# find /root/test -type d -mtime -1 -ok rm {} \;
< rm ... /root/test > ? y
rm: cannot remove `/root/test': Is a directory
< rm ... /root/test/test1 > ? y
rm: cannot remove `/root/test/test1': Is adirectory
< rm ... /root/test/test1/test2 > ? y
rm: cannot remove `/root/test/test1/test2': Is adirectory
4)-exec使用grep選項(xiàng)
[root@LiWenTong test]# find ?/etc -name "passwd" -exec grep"root" {} \;
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
說明任何形式的命令都可以在-exec選項(xiàng)中使用。---》這個(gè)說明很強(qiáng)勁哦,在系統(tǒng)中能夠?qū)ξ募M(jìn)行操作的命令都能夠在這里使用的。注意咯!
5)使用find查找文件并將移動(dòng)指定的目錄下。
[root@LiWenTong tmp]# ll log_mv
total 0
-rw-r--r-- 1 root root 0 Apr 29 07:08 1.log
-rw-r--r-- 1 root root 0 Apr 29 07:08 2.log
-rw-r--r-- 1 root root 0 Apr 29 07:08 3.log
-rw-r--r-- 1 root root 0 Apr 29 07:08 4.log
[root@LiWenTong tmp]# find /tmp/log_mv ?-name"*.log" ?-exec mv {} /root/test/ \;
[root@LiWenTong tmp]# ll /root/test--à需要記住{}是find查找出來的文件那么-exec的命令就需要對(duì)應(yīng)的把位置放好。因?yàn)橹袄鲜菍懗??mv /root/test/ {} \; 如果帶入來看 這個(gè)mv命令來說就是錯(cuò)誤的。
total 4
-rw-r--r-- 1 root root ? ?0 Apr 29 07:01 1
-rw-r--r-- 1 root root ? ?0 Apr 29 07:08 1.log
-rw-r--r-- 1 root root ? ?0 Apr 29 07:08 2.log
-rw-r--r-- 1 root root ? ?0 Apr 29 07:08 3.log
-rw-r--r-- 1 root root ? ?0 Apr 29 07:08 4.log
drwxr-xr-x 3 root root 4096 Apr 29 07:05 test1
Find命令之xargs選項(xiàng)
功能簡(jiǎn)述:
? ?在使用-exec選項(xiàng)進(jìn)行文件處理時(shí),有些系統(tǒng)對(duì)傳給-exec的命令長(zhǎng)度有限制。如果太長(zhǎng)在執(zhí)行時(shí)會(huì)溢出錯(cuò)誤、或出現(xiàn)參數(shù)太長(zhǎng)的錯(cuò)誤。-exec是一次性的獲取傳來的參數(shù)-xargs是分多次的獲取傳來的參數(shù)每次獲取多少還是一次獲取是根據(jù)該命令的選項(xiàng)及系統(tǒng)的內(nèi)核中相應(yīng)的可調(diào)參數(shù)決定。并且-exec在處理命令時(shí)會(huì)發(fā)起一個(gè)相應(yīng)的進(jìn)程可能多個(gè)。而xargs則只有一個(gè)進(jìn)程[U2]。如果通過-exec命令來執(zhí)行如果出現(xiàn)進(jìn)程很多的情況那么有可能會(huì)影響到系統(tǒng)的性能。
xargs如何從find命令中獲取結(jié)果
我們知道-exec選項(xiàng)是通過{}來代入我們查找到的文件。那么我們的xargs又是如何獲取我們查找到的文件呢?其實(shí)格式有一下兩種:
1) find ?-type f | xargs ?rm ; ?看不到什么代入的{}而是直接xargs 接上命令。那是因?yàn)槟J(rèn)的xargs會(huì)將(stdin)標(biāo)準(zhǔn)輸入作為我們后面命令的參數(shù)。其實(shí)rm命令會(huì)接上在管道(|)之前的命令所產(chǎn)生的結(jié)果,也就是我們find查找出來的文件。那么也就相當(dāng)于是:rm ?查找的文件
2) find -type f ?|xargs -i mv {} /tmp;這種方式就有代入{}了,相應(yīng)的也多了個(gè)-i的參數(shù)。-i參數(shù)就是指定我們要用{}來作為find命令結(jié)果的替代。這個(gè)就和-exec沒啥區(qū)別咯。然后現(xiàn)在來看看以下的一些實(shí)例就可以了。
1)Find查找普通文件并通過xargs file命令來判斷文件的類型
[atong@LiWenTong tmp]$ find -type f | xargs file
find: ./test1/tmp/ssh-YmJglw2954: Permissiondenied
./1.txt.tar.gz: ? ? ? ? ? ? ? ? ? ? ? ? ? gzip compresseddata, from Unix, last modified: Thu May 2 20:14:25 2013
./2.txt: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ASCIItext
./tar.man: ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?UTF-8 UnicodeEnglish text, with overstriking
./rc.sysinit: ? ? ? ? ? ? ? ? ? ? ? ? ? ? Bourne-Again shellscript text executable
./oldboy/test/test1/test2/test3/test.txt: empty
2)在系統(tǒng)中查找內(nèi)存信息轉(zhuǎn)存文件core dump然后把結(jié)果保存到/tmp/core.log中。
[atong@LiWenTong tmp]$ find / ?-name "core" | xargs echo"">>/tmp/core.l
3)在當(dāng)前目錄下查找所有用戶具有讀、寫和執(zhí)行權(quán)限的文件并收回相應(yīng)的寫權(quán)限
[atong@LiWenTong tmp]$ ?find -perm ?777 ?| sudo xargs chmod 744--->這里應(yīng)為atong沒有權(quán)限所以需要在xargs前面加上個(gè)sudo 要不會(huì)提示權(quán)限限制。^_^
-rwxr--r-- 1 root root ? ? 167 May ?2 20:16 1.tar.gz
-rwxr--r-- 1 root root ? ? ?45 May ?2 20:16 1.txt
-rwxr--r-- 1 atong atong ? ?152 May 2 20:14 1.txt.tar.gz
drwxr--r-- 2 root root ? ?4096 Apr 29 07:0620130425175009
-rwxr--r-- 1 root root ? ? ? 5 May ?2 21:41 2.txt
-rw-r--r-- 1 root root ? ? ? 0 May ?2 21:41 3.txt
4)用grep命令在所有的普通文件中搜索hostname這個(gè)詞
[root@LiWenTong tmp]# find ?-type f ? | xargs grep "good"
./1.log:good
5)使用xargs執(zhí)行mv
[root@LiWenTong test4]# find -name "*.log"| xargs ?-i ?mv{} test4---》此處的-i選項(xiàng)是表示默認(rèn)用{}來代表前面的輸出[U3]。
[root@LiWenTong test4]# ll /tmp/test4
total 8
-rw-r--r-- 1 root root ? ?5 May ?3 04:12 1.log
-rw-rw-r-- 1 atong atong 619 May ?3 03:28 core.log
[root@LiWenTong test4]# find -name"*.log"| xargs ?-i-p mv {} test4--->-p選項(xiàng)是表示會(huì)提示讓你確認(rèn)是否執(zhí)行之后的操作。
[U1]《find之-exec》
Find查找到的結(jié)果能夠再給-exec作為輸入再進(jìn)行相應(yīng)的處理。-exe的格式為-exec command {} \: ?其中{}代表的就是find出來的結(jié)果那具體放在command之后的哪個(gè)位置需要具體看是什么command
[U2]《exec和xargs的區(qū)別》
Exec會(huì)有多個(gè)進(jìn)程在執(zhí)行命令。而xargs只會(huì)有一個(gè)進(jìn)程這樣減少系統(tǒng)資源開銷。Exec對(duì)傳過來的命令長(zhǎng)度有限制xargs沒有。
[U3]《xargs如何從find獲取結(jié)果》
Exec是通過command后的{}作為find的結(jié)果傳輸通道。而xargs若沒有指定就直接是作為stdin來傳。如果加上-i參數(shù)那么一樣是通過{}來作為find的結(jié)果傳輸通道。
最后附上幾個(gè)可以參考的文章
http://www.cnblogs.com/wanqieddy/archive/2011/06/09/2076785.html【這篇有點(diǎn)雜,內(nèi)容多】
http://oldboy.blog.51cto.com/2561410/792396 【find+sed的實(shí)例運(yùn)用很好很強(qiáng)大】
http://oldboy.blog.51cto.com/2561410/792396/
-----------------------------后續(xù)自我小結(jié)--------------------------
? ?find首先在文件查找上基本上我們希望找到的文件它都能夠幫我們找到的。另外就是-exec和xargs參數(shù)能夠讓我們對(duì)我們所找到的文件進(jìn)行相應(yīng)的操作。其實(shí)理解了-exec和xargs的格式含義也不算很難使用只要我們對(duì)我們的操作命令熟悉就可以了其實(shí)就只是一個(gè)代入的動(dòng)作而已。
? ?也正是因?yàn)槲覀兊?exec和xargs兩個(gè)參數(shù)后面能夠跟上我們系統(tǒng)的任何操作命令也就使得我們find命令能夠跟非常多的命令進(jìn)行結(jié)合只要是我們能想到的操作。并且文中最后也提到了find和sed命令的相結(jié)合。本身sed命令就地內(nèi)容的編輯上很靈活 選址、輸出、替換、改寫等等。這樣兩個(gè)很強(qiáng)的命令一結(jié)合就變成了你可以對(duì)你系統(tǒng)中任何文件進(jìn)行任何操作、對(duì)文件內(nèi)容進(jìn)行任何操作。
Any operation of any files, make any edits to the contents of any
--------------------------------------------------------------------
轉(zhuǎn)載于:https://blog.51cto.com/atong/1343666
總結(jié)
以上是生活随笔為你收集整理的[一文一命令]find命令详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript中求根的函数有哪些
- 下一篇: cpu针脚弯了有影响吗