文件查找和壓縮——Linux基本命令(12)
1.文件查找
在文件系統上查找符合條件的文件:locate, find
非實時查找(數據庫查找):locate
實時查找:find
2.locate
(1)功能特點
查詢系統上預建的文件索引數據庫
/var/lib/mlocate/mlocate.db
依賴於事先構建的索引
索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb)
索引構建過程需要遍歷整個根文件系統,極消耗資源
工作特點:
查找速度快
模糊查找
非實時查找
搜索的是文件的全路徑,不僅僅是文件名
可能只搜索用戶具備讀取和執行權限的目錄
(2)功能命令
locate KEYWORD
例如:locate conf 搜索名稱或路徑中帶有“
有用的選項
-i 不區分大小寫的搜索
-n N 只列舉前N個匹配項目
-r 支持正則
locate -r‘\.conf$’
使用Regex來搜索以“.conf”結尾的文件
locate命令是非實時的,如果新添加一個文件,馬上使用locate是無法查找出來的,需要使用updatedb 命令更新locate數據庫/var/lib/mlocate/mlocate.db,然後就能查找出來了。
3.find
(1)功能特點
實時查找工具,通過遍歷指定路徑完成文件查找
工作特點:
查找速度略慢
精確查找
實時查找
可能只搜索用戶具備讀取和執行權限的目錄
(2)語法
find [OPTION]... [
查找路徑:指定具體目標路徑;默認為當前目錄
查找條件:指定的查找標準,可以文件名、大小、類型、
權限等標準進行;默認為找出指定路徑下的所有文件
處理動作:對符合條件的文件做操作,默認輸出至屏幕
(3)查找條件
指搜索層級:
-maxdepth level 最大搜索深度
-minxdepth level 最小搜索深度
根據文件名和inode查找:
-name 基於名稱的精確查找
-iname 基於名稱忽略大小寫的精確查找查找
-inum 基於inode查找
-samefile 基於相同inode號的查找(查找硬鏈接)
-links n 硬鏈接為n的文件
-regex 支持正則 默認為(emacs標準)
-regextype egrep -regex 支持egrep同標準的正則
根據屬主、屬組查找:
-user 用戶名 基於文件owner的查找
-group 組名 基於文件group的查找
-uid userid 基於文件uid的查找
-gid groupid 基於文件gid的查找
-nouser 查找沒有owner的文件
-nogroup 查找沒有group的文件
根據文件類型查找:
-type 基於文件類型的查找
f: 普通文件
d: 目錄文件
l: 符號鏈接文件
s:套接字文件
b: 塊設備文件
c: 字符設備文件
p: 管道文件
組合條件:
與:-a
或:-o
非:-not, !
德·摩根定律:
(非 A) 或 (非 B) = 非(A 且 B)
(非 A) 且 (非 B) = 非(A 或 B)
(4)示例
!A -a !B = !(A -o B)
!A -o !B = !(A -a B)
找出/tmp目錄下,屬主不是root,且文件名不以f開頭的文件
find /tmp \( -not -user root -a -not -name ‘f*‘ \) -ls
find /tmp -not\( -user root -o -name ‘f*‘ \) -ls
排除目錄
示例:查找/etc/下,除/etc/sane.d目錄的其它所有.conf後綴的文件
find /etc -path ‘/etc/sane.d‘ -a -prune -o -name "*.conf"
find /etc \( -path ‘/etc/sane.d‘ -o -path‘/etc/fonts‘ \) -a -prune -o -name "*.conf"
(5)根據文件大小來查找
-size[+|-]#UNIT 根據文件大小來查找
常用單位:k, M, G,c(byte)
#UNIT:(#-1,#]
如:6k 表示(5k,6k]
-#UNIT:[0,#-1]
如:-6k 表示[0,5k]
+#UNIT:(#,∞)
如:+6k 表示(6k,∞)
(6)根據時間戳查找
以“天”為單位;
-atime[+|-]#,
#: [#,#+1)
+#: [#+1,∞]
-#: [0,#)
-mtime
-ctime
以“分鐘”為單位:
-amin
-mmin
-cmin
(7)根據權限查找
-perm
mode 精確權限匹配
+mode[/mode] 任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,(+ 從centos7開始淘汰,centos7中只能用/mode)
-mode 每一類對象都必須同時擁有指定權限,與關系0表示不關註
例如:權限模式恰好是755的文件,find -perm 755才會匹配
只要當任意人有寫權限時,find -perm +222就會匹配
只有當每個人都有寫權限時,find -perm -222才會匹配
只有當其它人(other)有寫權限時,find -perm -002才會匹配
(註意:如果某位數字為2,並不是說那個位只能有寫權限,也可以是有讀寫權限的,也可以是讀寫執行權限都有的,總之就是必須包含寫權限。)
(8)處理動作
-print 處理默認的動作,顯示至屏幕
-delete 直接刪除所查找到的文件,不詢問。
-ls 長列出所查找到的文件
-fls file 將查找到的文件長列出導入到指定文件。
> file
-ok command {} \; 對查找到的文件當做下一命令的參數去執行(交互式要求用戶確認)
-exec command {} \; 對查找到的文件當做下一命令的參數去執行(非交互式)
{}: 用於引用查找到的文件名稱自身
(9)參數替換 xargs
由於很多命令不支持管道|來傳遞參數,而日常工作中有這個必要,所以就有了xargs命令。有些命令不能接受過多參數,命令執行可能會失敗,xargs也可以解決。
find和xargs格式:find | xargs COMMAND
例如:find cr*.sh 可以找出cr開頭.sh結尾的文件,但是要是想要長列出是不能直接使用find cr*.sh |ls -l 這個命令的,因此要使用find cr*.sh |xargs ls -l
(10)find示例
為了更好的理解和運用find功能,我們來舉幾個例子:
1.find -name “*.conf” -exec cp {} {}.orig \;
尋找當前目錄下名字以.conf結尾的文件,復制到當前文件夾並將名字後面加上.orig
2.find /tmp -ctime +3 -user joe -ok rm {} \;
尋找/tmp文件夾下ctime為大於3天之前的且屬主為joe的文件,將它們全部刪除
3.find ~ -perm -002 -exec chmod o -w {} \;
尋找家目錄下other擁有寫權限的文件,將other減去寫權限
4.find /data -type f -perm 644 -name “*.sh” -exec chmod 755 {} \;
尋找/data文件夾下文件類型為普通文件屬主包括讀寫權限且屬組和other都包括寫權限的以.sh為結尾的文件,修改權限為755。
5.find /home -type d -ls
尋找/home目錄下文件類型為目錄文件並列出
4.壓縮解壓縮及歸檔工具
(1)compress (後綴名.Z)
-d 解壓縮,相當於uncompress ,相當於zcat X.Z > X
-c 將結果打印到屏幕上,配合重定向,不會覆蓋原文件,但權限會變。
(使用-c配合重定向可以實現不刪除原文件的情況下實現壓縮並可以自由命名)
-f 默認不對硬鏈接數為2及以上的文件壓縮,加上f,強制壓縮指定文件,而其他同inode的文件硬鏈接數減1.
-v 顯示詳細過程。
(2)gzip (後綴名.gz)
-d 解壓縮,相當於gunzip,相當於zcat X.gz > X
-c 將結果打印到屏幕上,配合重定向,不會覆蓋原文件,但權限會變。
-f 默認不對硬鏈接數為2及以上的文件壓縮,加上f,強制壓縮指定文件,而其他同inode的文件硬鏈接數減1.
-v 顯示詳細過程。
-# 數字越大,壓縮比越高,速度越慢,文件越小。
-1 等於 --fast
-2,3,4,5,6(默認),7,8
-9 等於 --best
(3)bzip2(後綴名.bz2)
-d 解壓縮,相當於bunzip,相當於bzcat X.bz2 > X
-k 保留原文件
-c 將結果打印到屏幕上,配合重定向,不會覆蓋原文件,但權限會變。
-f 默認不對硬鏈接數為2及以上的文件壓縮,加上f,強制壓縮指定文件,而其他同inode的文件硬鏈接數減1.
-v 顯示詳細過程。
-# 數字越大,壓縮比越高,速度越慢,文件越小。
-1 等於 --fast
-2,3,4,5,6,7,8
-9等於 --best (默認)
(4)xz(後綴名.xz)
-d 解壓縮,相當於unxz,相當於xzcat X.xz > X
-k 保留原文件
-f 默認不對硬鏈接數為2及以上的文件壓縮,加上f,強制壓縮指定文件,而其他同inode的文件硬鏈接數減1.
-v 顯示詳細過程。
-# 數字越大,壓縮比越高,速度越慢,文件越小。
-0 等於 --fast
-1 -2,3,4,5,6(默認),7,8
-9 等於 --best
(5)zip(後綴名.zip)
zip可以單獨壓縮也可以實現打包壓縮(使用zip不需要手動添加後綴名)
zip -r 要壓縮的文件 單獨壓縮
zip -r 新文件路徑或名字 原文件路徑 打包壓縮
unzip 解壓縮
“尋找的文件|zip 將生成的文件名 -”可以將管道前的輸出結果轉為文件並壓縮。
通過此方式壓縮的文件只能使用“unzip -p 壓縮包 > 新文件 ”來解壓縮
unzip -p 預覽解壓縮後的內容到屏幕,可以配置重定向將結果保存到指定文件,權限會發生變化。
(6)tar(打包)
tar不是用來壓縮的,是用來打包的。(就是歸檔)
-cf 創建包名字 原文件(可以指定多個)
-tf 包名字 顯示包中的文件名
-tvf 詳細顯示包中的文件名
-rf 包名字 新文件名(可以指定多個)
--delete-f 包名字 被刪除的文件名(可以指定多個)
-xf 包名字 解出所有的文件到當前目錄
-xf 包名字 文件名 解所指定的文件到當前目錄
-C 解包到指定目錄
-v 顯示過程
-Jcf 創建包的名字(.tar.xz) 原文件(可以指定多個)打包並用xz壓縮
-jcf 創建包的名字(.tar.bz2) 原文件(可以指定多個)打包並用bzip壓縮
-zcf 創建包的名字(.tar.gz) 原文件(可以指定多個)打包並用gzip壓縮
-T 指定個列表,包含需要被打包的文件,以換行符為間隔
-X 指定個排除列表,以換行符為間隔
split -b Size -d tar -file -name prefix -name 將tar包分隔為多個文件
cat 被分隔出的多個文件名 > 單個文件名 合並
5.cpio
cpio命令是通過重定向的方式將文件進行打包備份,還原恢復的工具,它可以解壓以“.cpio”或者“.tar”結尾的文件。
cpio
ls * |cpio -o > 文件名.cpio 打包。
cpio -id < 文件名.cpio 解開被cpio打包的文件
gzip文件名.cpio 生成文件名為文件名.cpio.gz
/boot/initramfs-xxxx.img
Centos6:cpio.gz 文件。zcat initramfs-xxxx.img |cpio -id
Centos7:cpio 文件 cpio -id < initramfs-xxxx.img
-tv < 文件名.cpio 預覽cpio打包的文件。
本文出自 “Ty_endless” 博客,請務必保留此出處http://tyendless.blog.51cto.com/12435756/1955189
文件查找和壓縮——Linux基本命令(12)