1. 程式人生 > >Linux基礎管理——文件查找和壓縮(高級使用方法)

Linux基礎管理——文件查找和壓縮(高級使用方法)

正則表達式 預覽 ges 模糊 [] 復制 pattern 臨時文件 mode

前言:

GNU Linux操作系統的哲學思想之一即是一切皆是文件,因此使用必要的手段對文件進行搜索、匹配、處理、壓縮解壓,以實現快速定位、快速處置是十分必要的。


1、文件搜索查找原理


文件的搜索查找底層原理分為兩類:實時的、非實時的。其中非實時的文件查找是基於數據庫的,而實時查找則是基於查找條件對文件系統上的所有文件進行搜索、匹配,且是窮盡查找。

非實時查找的代表命令是locate;實時查找的代表是find命令。


1.1、locate原理及特點


原理:

查詢系統上預建的文件索引數據庫,/var/lib/mlocate/mlocate.db。這個數據庫是系統基於一定的機制每天進行定時更新的;如果想要手動進行即時更新,可以使用updatedb命令實現。即mlocate.db數據庫是依賴於事先構建的索引,索引的構建是在系統較為空閑時自動進行(周期性任務),管理員手動更新數據庫(updatedb),索引構建過程需要遍歷整個根文件系統,極消耗系統及硬件資源。


工作特點:

    查找速度快;    
    模糊查找;
    非實時查找;
    搜索的是文件的全路徑,不僅僅是文件名;
    可能只搜索用戶具備讀取和執行權限的目錄。


1.2、locate命令使用

語法:

      locate [OPTION]... [PATTERN]...
      locate KEYWORD


常用選項:

    -i 不區分大小寫的搜索;  
    -n N 只列舉前N個匹配項目;
    -r 使用正則表達式;


示例:

locate conf              \搜索名稱或路徑中帶有“ conf”的文件locate -r ‘\.conf$’    \使用Regex來搜索以“ .conf”結尾的文件\



2、find命令


2.1、find工作特點及語法


find是一個實時查找工具,通過遍歷指定路徑完成文件查找。


工作特點:

    查找速度略慢;    
    精確查找;
    實時查找;
    可能只搜索用戶具備讀取和執行權限的目錄。



語法:

find [OPTION]... [查找路徑] [查找條件] [處理動作]
    查找路徑:指定具體目標路徑;默認為當前目錄;
    查找條件:指定的查找標準,可以文件名、大小、類型、權限等標準進行;默認為找出指定路徑下的所有文件。
    處理動作:對符合條件的文件做操作,默認輸出至屏幕。



2.2、查找條件


(1)指定搜索層級:

    -maxdepth level 最大搜索目錄深度,指定目錄為第1級
    -mindepth level 最小搜索目錄深度


(2)根據文件名和inode查找:

    -name "文件名稱":支持使用glob,*, ?, [], [^].....。
    -iname "文件名稱":不區分字母大小寫。
    -inum n 按inode號查找。
    -samefile name 相同inode號的文件。
    -links n 鏈接數為n的文件。
    -regex "PATTERN":以PATTERN匹配整個文件路徑字符串,而不僅僅是文件名稱。


(3)根據屬主、屬組查找

    -user USERNAME:查找屬主為指定用戶(UID)的文件;    
    -group GRPNAME: 查找屬組為指定組(GID)的文件;
    -uid UserID:查找屬主為指定的UID號的文件;
    -gid GroupID:查找屬組為指定的GID號的文件;
    -nouser:查找沒有屬主的文件;
    -nogroup:查找沒有屬組的文件。


(4)根據文件類型查找:
-type TYPE:

    TYPE:
        f: 普通文件;
        d: 目錄文件;
        l: 符號鏈接文件;
        s:套接字文件;
        b: 塊設備文件;
        c: 字符設備文件;
        p: 管道文件。




(5)指定組合條件,可以實現多個條件搜索:

    與:-a
    或:-o
    非:-not, !
    德·摩根定律:
         (非 A) 或 (非 B) = 非(A 且 B)
         (非 A) 且 (非 B) = 非(A 或 B)

示例1:

    !A -a !B = !(A -o B)        
!A -o !B = !(A -a B)


示例2:

    find -name snow.png;    
    find -iname snow.png;
    find / -name “*.txt”;
    find /var –name “*log*”;
    find -user joe -group 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,且文件名不以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”

查找/etc/下,除/etc/sane.d和/etc/fonts兩個目錄的其它所有.conf後綴的文件

        find /etc \(–path ‘/etc/sane.d’ –o –path ’/etc/fonts’ \) -a -prune –o -name “*.conf”



(6)根據文件大小來查找:

語法:

-size [+|-]#UNIT
常用單位:k, M, G,c(byte)

不同寫法的意義:

    #UNIT:(#-1, #],如:6k 表示(5k,6k]    
    -#UNIT:[0,#-1],如:-6k 表示[0,5k]
    +#UNIT:(#,∞),如:+6k 表示(6k,∞)


(7)根據時間戳:

以“天”為單位:

    -atime [+|-]#:    
        # : [#,#+1)
        +#: [#+1,∞]
        -#: [0,#)
        
    -mtime
        # : [#,#+1)
        +#: [#+1,∞]
        -#: [0,#)
        
    -ctime
        # : [#,#+1)
        +#: [#+1,∞]
        -#: [0,#)


以“分鐘”為單位:

    -amin    
    -mmin
    -cmin


(8)根據權限查找:


-perm [/|-]MODE

    MODE: 精確權限匹配;
    /MODE:任何一類(u,g,o)對象的權限中只要能一位匹配即可,或關系,+ 從centos7開始淘汰。
    -MODE:每一類對象都必須同時擁有指定權限,與關系。
    0 表示不關註。


示例:

    find -perm 755 會匹配權限模式恰好是755的文件;    
    只要當任意人有寫權限時,find -perm +222就會匹配;
    只有當每個人都有寫權限時,find -perm -222才會匹配;
    只有當其它人(other)有寫權限時,find -perm -002才會匹配。



2.3、處理動作


 -print:默認的處理動作,顯示至屏幕;
 -ls:類似於對查找到的文件執行“ ls -l”命令;
 -delete:刪除查找到的文件;
 -fls file:查找到的所有文件的長格式信息保存至指定文件中;

 -ok COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令,對於每個文件執行命令之前,都會交互式要求用戶確認。
 -exec COMMAND {} \; 對查找到的每個文件執行由COMMAND指定的命令;

 {}: 用於引用查找到的文件名稱自身;

 find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令。



2.4、參數替換xargs


背景:

find傳遞查找到的文件至後面指定的命令時,查找到所有符合條件的文件一次性傳遞給後面的命令,所以在某些場景下需要使用到xargs命令。

由於很多命令不支持管道|來傳遞參數、有些命令不能接受過多參數,命令執行可能會失敗,xargs可以解決而日常工作中有這個必要,所以就有了xargs命令。


xargs用於產生某個命令的參數,xargs 可以讀入 stdin 的數據,並且以空格符或回車符將 stdin 的數據分隔成為arguments。
註意:文件名或者是其他意義的名詞內含有空格符的情況。


示例:

ls f* |xargs rm
find /sbin -perm +700 |ls -l 這個命令是錯誤的
find /sbin -perm +7000 | xargs ls –l
find和xargs格式:find | xargs COMMAND

2.5、find示例


備份配置文件,添加.orig這個擴展名

find -name “*.conf” -exec cp {} {}.orig \;



提示刪除存在時間超過3天以上的joe的臨時文件

find /tmp -ctime +3 -user joe -ok rm {} \;


在你的主目錄中尋找可被其它用戶寫入的文件

find ~ -perm -002 -exec chmod o-w {} \;


find /data –type f -perm 644 -name “*.sh” –exec chmod 755 {} \;
find /home –type d -ls



3、Gnome 搜索工具


圖形框位置:

位置->搜索文件……


圖形化搜索工具,可搜索:

    命令    
    內容
    用戶/組群
    大小
    修改時間



4、壓縮、解壓縮及歸檔工具


4.1、工具一覽

    file-roller;
        
    compress/uncompress: .Z;
    gzip/gunzip: .gz;
    bzip2/bunzip2: .bz2;
    xz/unxz: .xz;
    
    zip/unzip;
    
    tar;
    
    cpio;


4.2、compress/uncompress


語法:

    compress [-dfvcVr] [-b maxbits] [file ...]


選項:

    -d: 解壓縮,相當於uncompress    
    -c: 結果輸出至標準輸出,不刪除原文件
    -v: 顯示詳情


uncompress 解壓縮


查看並重定向:

    zcat file.Z >file



4.3、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



4.4、bzip2/bunzip2/bzcat


語法:

    bzip2 [OPTION]... FILE ...



選項:

    -k: keep, 保留原文件
    -d:解壓縮
    -#:1-9,壓縮比,默認為9


bzcat:不顯式解壓縮的前提下查看文本文件內容


4.5、xz/unxz/xzcat


語法:

    xz [OPTION]... FILE ...



選項:

    -k: keep, 保留原文件    
    -d:解壓縮
    -#:1-9,壓縮比,默認為6


xzcat: 不顯式解壓縮的前提下查看文本文件內容



4.6、zip/unzip


打包壓縮:

    zip –r /testdir/sysconfig /etc/sysconfig/



解包解壓縮:

    unzip sysconfig.zip    
    cat /var/log/messages | zip messages - 
    unzip -p message > message



4.7、tar工具


Tar(Tape ARchive,磁帶歸檔的縮寫)。

語法:

    tar [OPTION]......


(1) 創建歸檔

    tar -c -f /PATH/TO/SOMEFILE.tar FILE...


(2) 追加文件至歸檔: 註:不支持對壓縮文件追加

tar -r -f /PATH/TO/SOMEFILE.tar FILE...


(3) 查看歸檔文件中的文件列表

    tar -t -f /PATH/TO/SOMEFILE.tar


(4) 展開歸檔

    tar -x -f /PATH/TO/SOMEFILE.tar
    tar -x -f /PATH/TO/SOMEFILE.tar -C /PATH/


(5) 結合壓縮工具實現:歸檔並壓縮

    -j: bzip2, -z: gzip, -J: xz


-T選項指定輸入文件,-X選項指定包含要排除的文件列表

    tar zcvf mybackup.tgz -T /root/includefilelist -X /root/excludefilelist


分割大的 tar 文件為多份小文件:

    split –b Size –d tar-file-name prefix-name    
    split -b 1M –d mybackup.tgz mybackup-parts
    split -b 1M mybackup.tgz mybackup-parts


合並:

cat mybackup-parts* > mybackup.tar.gz



4.8、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 –idv < etc.cpio




Linux基礎管理——文件查找和壓縮(高級使用方法)