文件查找
在文件系統上查找符合條件的文件; ?
文件查找:locate, find
locate :非實時查找(數據庫查找)
find :實時查找
locate
1.查詢系統上預建的文件索引數據庫 /var/lib/mlocate/mlocate.db ?
2.依賴于事先構建的索引,索引的構建是在系統較為空閑時自動進行(周期性任務);管理需要員手動更新數據庫(updatedb); 索引構建過程需要遍歷整個根文件系統,極消耗資源;應該只搜索穩定的配置文件,不搜索更新頻繁的數據。
3.工作特點: 查找速度快;
模糊查找;
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
4.locate命令 ?
locate KEYWORD ?
有用的選項 -i 執行區分大小寫的搜索
-n X 只列舉前X個匹配項目 ?
locate foo
搜索名稱或路徑中帶有“foo”的文件 ?
locate -r ‘.foo$’
使用Regex來搜索以“.foo”結尾的文件
find
1概述:
實時查找工具,通過遍歷指定路徑完成文件查找; ?
2工作特點:
查找速度略慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄
3find
語法:
find [OPTION]… [查找路徑] [查找條件] [處理動作]
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、 權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
查找條件
a.根據文件名和inode查找:
-name "文件名稱":支持使用glob: *, ?, [], [^]
-iname "文件名稱":不區分字母大小寫
-inum n :按inode號查找
-samefile 文件名: 相同inode號的文件
-links n : 鏈接數為n的文件
-regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱
b.根據屬主、屬組查找:
-user USERNAME:查找屬主為指定用戶(UID)的文件
-group GRPNAME: 查找屬組為指定組(GID)的文件
-uid UserID:查找屬主為指定的UID號的文件
-gid GroupID:查找屬組為指定的GID號的文件
-nouser:查找沒有屬主的文件
-nogroup:查找沒有屬組的文件
c.根據文件類型查找:
-type TYPE:
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
d.組合條件:
與:-a
或:-o
非:-not, !
德·摩根定律:非(P 且 Q) = (非 P) 或 (非 Q)
非(P 或 Q) = (非 P) 且 (非 Q)
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
e.根據文件大小來查找:
-size [+|-]#UNIT 常用單位:k, M, G
#UNIT: (#-1, #],如:6k
-#UNIT:[0,#-1], 如:-6k
+#UNIT:(#,∞), 如:+6k
f.根據時間戳:
以“天”為單位:-atime [+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:-amin
-mmin
-cmin
g.根據權限查找:
-perm [/|-]MODE
MODE: 精確權限匹配
/MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,centos6上為+,+從centos7開始淘汰。
-MODE:每一類對象都必須同時擁有指定權限,且關系
0 表示不關注,什么權限都可以
find –perm 755 ,會匹配權限模式恰好是755的文件
只要當任意人有寫權限時,find -perm +222就會匹配
只有當每個人都有寫權限時,find -perm -222才會匹配
只有當其它人(other)有寫權限時,find -perm -002才會匹配
h.find實例
find -name snow.png 搜索名為snow.png的文件 ?
find -iname snow.png 不分大小寫地搜索名為snow.png、Snow.png、 SNOW.PNG等等的文件 ?
find / -name *.txt ?
find /var –name *log* ?
find -user joe -group joe 搜索被用戶joe 以及組群joe所擁有的文件
find -user joe -not -group joe
find -user joe -o -user jane
find -not \( -user joe -o -user jane \)
find / -user joe -o -uid 500
示例:找出/tmp目錄下,屬主不是root,且文件名不是fstab的文件
find /tmp \( -not -user root -a -not -name 'fstab' \) ls
find /tmp -not \( -user root -o -name 'fstab' \) –ls ?
排除目錄:
排除的目錄不加斜線,但是加-print
示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf后綴 的文件。
find /etc -path ‘/etc/sane.d’ -a -prune -o -name *.conf –print (-a可以不寫)
處理動作
1)命令用法:
-print:默認的處理動作,顯示至屏幕; ?
-ls:類似于對查找到的文件執行“ls -l”命令 ?
-delete:刪除查找到的文件; ?
-fls file:查找到的所有文件的長格式信息保存至指定文件中 ?
-ok COMMAND {} \; 對查找到的每個文件執行由 COMMAND指定的命令; 對于每個文件執行命令之前,都會交互式要求用戶確認
-exec COMMAND {} \; 對查找到的每個文件執行由 COMMAND指定的命令 ?
{}: 用于引用查找到的文件名稱自身 ?
2)xargs命令簡介
find傳遞查找到的文件至后面指定的命令時,查找到所有符合 條件的文件一次性傳遞給后面的命令,有些命令不能接受過多參數,此時命令執行可能會失敗,下面方式可規避此問題 find | xargs COMMAND.
之所以能用到這個命令,關鍵是由于很多命令不支持|管道來傳遞參數,而日常工作中有有這個必要,所以就有了xargs命令,例如:
find /sbin -perm +700 |ls -l 這個命令是錯誤的
find /sbin -perm +700 |xargs ls -l 這樣才是正確的
xargs 可以讀入stdin 的資料,并且以空白字元或斷行字元作為分辨,將 stdin 的資料分隔成為 arguments 。 因為是以空白字元作為分隔,所以,如果有一些檔名或者是其他意義的名詞內含有空白字元的時候, xargs 可能就會誤判了~他的用法其實也還滿簡單的!就來看一看先!
選項解釋
-0 當sdtin含有特殊字元時候,將其當成一般字符,想/'空格等
例如:root@localhost:~/test#echo "//"|xargs echo
root@localhost:~/test#echo "//"|xargs -0 echo /
-a file 從文件中讀入作為sdtin,(看例一)
-e flag ,注意有的時候可能會是-E,flag必須是一個以空格分隔的標志,當xargs分析到含有flag這個標志的時候就停止。(例二)
-p 當每次執行一個argument的時候詢問一次用戶。(例三)
-n num 后面加次數,表示命令在執行的時候一次用的argument的個數,默認是用所有的。(例四)
-t 表示先打印命令,然后再執行。(例五)
-i 或者是-I,這得看linux支持了,將xargs的每項名稱,一般是一行一行賦值給{},可以用{}代替。(例六)
-r no-run-if-empty 當xargs的輸入為空的時候則停止xargs,不用再去執行了。(例七)
-s num 命令行的最好字符數,指的是xargs后面那個命令的最大命令行字符數。(例八)
–L num Use at most max-lines nonblank input lines per command line.-s是含有空格的。
-l 同-L
-d delim 分隔符,默認的xargs分隔符是回車,argument的分隔符是空格,這里修改的是xargs的分隔符(例九)
-x exit的意思,主要是配合-s使用。
–P 修改最大的進程數,默認是1,為0時候為as many as it can ,這個例子我沒有想到,應該平時都用不到的吧。
應用舉例
例一:
root@localhost:~/test#cat test
#!/bin/sh
echo "hello world/n"
root@localhost:~/test#xargs -a test echo
#!/bin/sh echo hello world/n
root@localhost:~/test#
例二:
root@localhost:~/test#cat txt
/bin tao shou kun
root@localhost:~/test#cat txt|xargs -E 'shou' echo
/bin tao
root@localhost:~/test#
例三:
root@localhost:~/test#cat txt|xargs -p echo
echo /bin tao shou kun ff ?…y
/bin tao shou kun ff
例四:
root@localhost:~/test#cat txt|xargs -n1 echo
/bin
tao
shou
kun
root@localhost:~/test3#cat txt|xargs echo
/bin tao shou kun
例五:
root@localhost:~/test#cat txt|xargs -t echo
echo /bin tao shou kun
/bin tao shou kun
例六:
$ ls | xargs -t -i mv {} {}.bak
例七:
root@localhost:~/test#echo ""|xargs -t mv
mv
mv: missing file operand
Try `mv –help' for more information.
root@localhost:~/test#echo ""|xargs -t -r mv
root@localhost:~/test#
(直接退出)
例八:
root@localhost:~/test#cat test |xargs -i -x -s 14 echo "{}"
exp1
exp5
file
xargs: argument line too long
linux-2
root@localhost:~/test#
例九:
root@localhost:~/test#cat txt |xargs -i -p echo {}
echo /bin tao shou kun ?…y
root@localhost:~/test#cat txt |xargs -i -p -d " " echo {}
echo /bin ?…y
echo tao ?…/bin
y
echo shou ?…tao
再如:
root@localhost:~/test#cat test |xargs -i -p -d " " echo {}
echo exp1
exp5
file
linux-2
ngis_post
tao
test
txt
xen-3
?…y
root@localhost:~/test#cat test |xargs -i -p echo {}
echo exp1 ?…y
echo exp5 ?…exp1
y
echo file ?…exp5
y
3)find實例 ?
find -name “*.conf” -exec cp {} {}.org \; ? 備份配置文件,添加.orig這個擴展名 ?
find /tmp -ctime +3 -user joe -ok rm {} \; ? 提示刪除存在時間超過3天以上的joe的臨時文件 ?
find ~ -perm -002 -exec chmod o-w {} \; ? 在你的主目錄中尋找可被其它用戶寫入的文件 ?
find /data –type f -perm 644 -name *.sh – exec chmod 755 {} \;
find /home –type d -ls
練習:
1、 查找/var目錄下屬主為root,且屬組為mail的所有文件
# find /var/ -user root -a -group mail
2、查找/var目錄下不屬于root、lp、gdm的所有文件
# find /var/ -not \( -user root -o -user lp -o -user gdm \) –ls
3、查找/var目錄下最近一周內其內容修改過,同時屬主不為root,也不是postfix的文件
# find /var/ -mtime -7 -not \( -user root -o -user postfix \) -ls
4、查找當前系統上沒有屬主或屬組,且最近一個周內曾被訪問過的文件
# find / \( -nouser -o -nogroup -atime -7 \) -ls
5、查找/etc目錄下大于1M且類型為普通文件的所有文件
# find /etc/ -size +1M -type f -ls
6、查找/etc目錄下所有用戶都沒有寫權限的文件
# find /etc/ -not -perm /222 –ls
7、查找/etc目錄下至少有一類用戶沒有執行權限的文件
# find /etc/ -not -perm -111 -ls
8、查找/etc/init.d目錄下,所有用戶都有執行權限,且其它用戶有寫權限的文件
# find /etc/init.d/ -perm /113 -ls
Gnome 搜索工具 ?
位置->搜索文件…… ?
圖形化搜索工具,可搜索
命令
內容
用戶/組群
大小
修改時間
壓縮、解壓縮及歸檔工具
file-roller ?
compress/uncompress: .Z ?
gzip/gunzip: .gz ?
bzip2/bunzip2: .bz2 ?
xz/unxz: .xz ?
zip/unzip ?
tar ?
cpio
compress/uncompress
compress [-dfvcVr] [-b maxbits] [file …]
-d: 解壓縮,相當于
-c: 結果輸出至標準輸出,不刪除原文件
-v: 顯示詳情 ?
uncompress 解壓縮 ?
zcat file.Z >file
gzip/gunzip
gzip [OPTION]… FILE …
-d: 解壓縮,相當于gunzip
-c: 將壓縮或解壓縮的結果輸出至標準輸出
-#:1-9,指定壓縮比,值越大壓縮比越大 ?
zcat:不顯式解壓縮的前提下查看文本文件內容 ?
實例: gzip -c messages >messages.gz
gzip -c -d messages.gz > messages
zcat messages.gz > messages
bzip2/bunzip2/bzcat
bzip2 [OPTION]… FILE …
-k: keep, 保留原文件
-d:解壓縮
-#:1-9,壓縮比,默認為6 ?
bzcat:不顯式解壓縮的前提下查看文本文件內容
xz/unxz/xzcat
xz [OPTION]… FILE …
-k: keep, 保留原文件
-d:解壓縮
-#:1-9,壓縮比,默認為6 ?
xzcat: 不顯式解壓縮的前提下查看文本文件內容
zip/unzip
zip可以多個文件壓縮歸檔成單個文件。
打包壓縮 zip –r sysconfig sysconfig/ ?
解包解壓縮 unzip sysconfig.zip
cat /var/log/messages | zip message
unzip -p message > message
歸檔tar ?
歸檔就是將多個文件打包為單個文件以便管理,默認的歸檔不會執行壓縮。注意:歸檔不會刪除原文件。
tar [OPTION]…
(1)創建歸檔,壓縮 (-v可以查看過程)
tar -c -f /PATH/TO/SOMEFILE.tar FILE…
tar cf /PATH/TO/SOMEFILE.tar FILE…
(2)查看歸檔文件中的文件列表 (-v可以查看過程)
tar -t -f /PATH/TO/SOMEFILE.tar
(3)展開歸檔,解壓縮 (-v可以查看過程)
tar -x -f /PATH/TO/SOMEFILE.tar
tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/ ?
注意:(1)多個選項可以合并,但-f由于要帶參數,因此,應該放到最右側;如:-tf, –xf, -cf
(2)選項的引號符–可以省略;如 tar xf ,tar zf
結合壓縮工具實現:(1)gzip
后綴名:.tar.gaz
歸檔并壓縮:tar -zcf
展開歸檔:tar -zxf
(2)后綴名:.tar.bz2
歸檔并壓縮:tar -jcf
展開歸檔:tar -jxf
(3)后綴名:.tar.xz
歸檔并壓縮:tar –Jcf
展開歸檔:tar -Jxf
注意:展開歸檔可以直接使用tar –xf ,而無需為其指定對應的壓縮工具選項。
歸檔cpio
復制 從或到文件 ?
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復 的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。 ?
cpio [選項] > 文件名或者設備名 ?
cpio [選項] < 文件名或者設備名 ?
選項:
-o 將文件拷貝打包成文件或者將文件輸出到設備上
-i 解包,將打包文件解壓或將設備上的備份還原到系統
-t 預覽,查看文件內容或者輸出到設備上的文件內容
-v 顯示打包過程中的文件名稱,顯示過程
-d 解包生成目錄,在cpio還原時,自動的建立目錄
-c 一種較新的存儲方式
示例
將etc目錄備份: find ./etc -print |cpio -ov >etc.cpio ?
內容預覽: cpio –tv < etc.cpio ?
要解包文件: cpio –iv <etc.cpio cpio –idv < etc.cpio
原創文章,作者:Jagger,如若轉載,請注明出處:http://www.www58058.com/37492