文件管理初探(inode理解)及管道和IO重定向

第一部分    文件管理初探

  1、Linux系統上各主要目錄的簡介

     

    /  根,所有文件的起點

    ├── bin    存放普通用戶可執行的相關二進制程序文件的目錄,不能單獨分區,操作系統啟動時會用到該目錄下的相關程序

    ├── boot    存放操作系統啟動時的引導程序,以及操作系統內核文件

    ├── dev    存放設備文件和特殊文件(如字符設備)

    ├── etc    存放配置文件的目錄

    ├── home    普通用戶的家目錄默認都在此目錄下

    ├── lib    存放系統庫和內核模塊文件(/lib/modules)

    ├── lib64    存放x86_64位系統上共享庫文件

    ├── media    系統上提供的設備掛載點

    ├── misc    系統上提供的設備掛載點

    ├── mnt    系統上提供的設備掛載點

    ├── opt    第三方應用程序的安裝位置

    ├── proc    用于輸出內核與進程信息相關的虛擬文件系統

    ├── root    root用戶的家目錄

    ├── sbin    存放管理員用戶可執行的相關二進制程序文件的目錄,不能單獨分區,操作系統啟動時會用到該目錄下的相關程序

    ├── selinux    selinux相關的安全策略等信息的存儲位置

    ├── srv    系統上運行的服務用到的數據

    ├── sys    用于輸出系統上硬件設備相關信息的虛擬文件系統

    ├── tmp    臨時文件存儲位置

    ├── usr    第三方軟件的安裝目錄,該目錄下有另一套完整的目錄文件結構,包括有bin、sbin、local、include而local又有bin、sbin等

    └── var    保存經常容易變化的數據,如日志、httpd的網頁文件、郵件等相關內容

  2、inode的認識總結

    

    個人總結的關于文件系統inode的一些原理: 

        文件系統在組織文件存儲時,遵循一定的存儲規則。在文件系統創建時,會將底層存儲設備(硬盤)邏輯劃分為一個一個的磁盤(block),一般一個block大小默認為4096個字節,也就是4K,這個值在ext系列文件系統上支持1024、2048、4096,可以在創建文件系統的時候指定(利用mke2fs -b SIZE來指定block大小,一旦指定后,后期不能更改),然后將多個磁盤塊劃分為一個個的塊組,一個分區里面有有多個塊組,但一個分區里面會有一部分block用來存儲整個分區的一些屬性狀態的超級塊,(用tune2fs -l DEVICE可以查看到分區超級塊里面存儲的信息,如分區卷標、分區的特性、掛載時的默認選項、總共有多少inode、總共多少block、每個塊組有多少block、每個塊組有多少inode等信息)。

        linxu上文件有兩部分組成,一個是文件的元數據,一個是文件的數據本身,兩部分分開存儲,文件系統劃分出來的磁盤塊有部分用來存儲inode table,有部分用來存儲數據本身,文件的數據至少占據1個block大小,即使數據只有1byte,如果blick大小為4K,那么該文件數據占用的磁盤空間也是4K。inode table里面存儲每每個文件的inode條目,每個條目在在同一個文件系統內部有一個唯一的ID號,一個inode條目記錄一個文件的元數據信息,這些信息包括:該文件的權限、屬主屬組、大小、時間戳(但是inode條目里面是沒有存儲該文件的文件名的,這點要注意,文件名是存儲在目錄文件的數據塊中)。

        inode條目還存儲了該文件的數據所在的block的指針信息,也就是該文件數據存在哪個磁盤塊上,一般一個inode條目的指針部分,分為直接指針、間接指針、二重指針、三重指針…直接指針在ext系列文件系統上有12個,一個直接指針指向一個磁盤塊,故利用直接指針可以存儲的數據大小,為4K*12。當數據超過48K時,就需要利用間接指針指向的數據區域來存儲了,所謂間接指針就是inode的數據塊指針指向了一個block塊,但這個block本身存儲的不是文件數據本身,而是存儲的指針信息(在ext文件系統上,一個指針信息占用4字節的空間,故一個block可以有1024個指針信息),然后,由這個block塊里面的指針指向具體文件數據存儲磁盤塊,這樣,利用間接指針可以存儲的文件大小為1024*4K。要存儲的文件超過了間接指針能指向的范圍,則需要用到二重指針,二重指針是指,inode條目里面的指針指向一個block,該block存儲的依然是指針信息,一個指針指向一個block,而被指向的這個block存儲的依然是指針信息,具體是這樣:inode條目–>block(存的是指針)–>block(存的是指針)–>block(存的是文件數據),這樣二重指針所能存儲的文件數據大小就是1024*1024*4K,以此類推。

     直接指針:inode條目–>block(存的是文件數據)

     間接指針:inode條目–>block(存的是指針)–>block(存的是文件數據)

     二重指針:inode條目–>block(存的是指針)–>block(存的是指針)–>block(存的是文件數據)

     三重指針:inode條目–>block(存的是指針)–>block(存的是指針)–>block(存的是指針)–>block(存的是文件數據)

     利用直接指針能存儲的文件大?。?2*4K

     利用間接指針能存儲的文件大?。?*1024*4K (一個inode條目只有1個間接指針)

     利用二重指針能存儲的文件大?。?*1024*1024*4K

     利用三重指針能存儲的文件大?。?*1024*1024*1024*4K

    

        而對于文件和目錄的存儲,在文件系統存儲時是不一樣的,文件存儲中,數據部分存的是文件本身的數據文件,而目錄文件,數據部分存儲的是目錄下面文件名與該文件的inode號的對應關系

        故當我們訪問某個文件時,文件系統內部尋找的過程大致是這樣的:(以尋找/etc/issue為例)

            首先找/根,因為根是自啟動的,可以知道自己是在哪個inode上,找到/的inode后,inode指向了/下相應的數據存儲的block,該block內部存儲了/下一級子目錄的名稱和inode對應關系(當然如果/下有直接的文件,那某些數據塊上存儲的就是文件的數據),通過對應關系,就找到了etc所在的inode,然后通過etc的indode,就找到了etc下面的文件和目錄的數據存儲的block,進而找到了issue文件的數據

        inode.png

  3、文件類型和軟硬鏈接的介紹

     ls -l 中查看到的權限字段的信息中第一位即表示該文件的類型,常見的文件類型有:

        –    表示普通文件

        d    表示目錄文件

        b    表示塊設備文件,如硬盤

        c    表示字符設備文件,如/dev/zero、/dev/null、/dev/ramdom

        l    表示符號鏈接文件

        p    表示管道文件

        s    表示socket套接字文件

    

    硬鏈接:多個文件路徑指向的是同一個innod,故通過innod找到的磁盤塊也就是同樣的

        特性:

        1、目錄不支持硬鏈接

        2、硬鏈接不能跨文件系統

        3、創建硬鏈接會增加inode引用計數

        硬鏈接創建方式:ln 原文件  鏈接文件

    軟鏈接:指向一個文件路徑的另一個文件路徑,符號鏈接文件本身的innod中存放磁盤塊指針的位置,不是存的磁盤塊指針,而是指向了另外一個路徑

        特性:

        1、符號鏈接與文件時兩個各自獨立的文件,各有自己的inode;對原文件創建軟鏈接,不會增加引用計數

        2、支持對目錄創建符號鏈接,可以跨文件系統

        3、刪除符號鏈接文件不影響原文件,但刪除原文件,符號鏈接指定的路徑即不存在,此時會變成無效的鏈接

        4、符號鏈接文件的大小,是其指向的文件的路徑字符串的字節數

軟鏈接創建方式:ln -s 原文件 鏈接文件

        注意:創建軟鏈接時,原始文件的路徑要使用絕對路徑,如果要使用相對路徑,則要相對于鏈接文件的路徑,不能是相對于當前工作目錄的相對路徑

  

  4、文件系統相關命令

    cd:改變工作目錄

        cd /PATH/TO/SOMEDIR  切換到指定目錄

        cd  切換回家目錄

        cd ~   切換回自己家目錄

        cd ~USERNAME   切換到指定用戶的家目錄(只有管理員才有權限切換到其他用戶的家目錄)

        cd –    在上一次所在目錄與當前目錄之間來回切換

            PWD   用來記錄當前工作目錄的環境變量

            OLDPWD   用來記錄上一次工作目錄的環境變量

    ls:列出指定目錄下的內容

        語法:ls [OPTION]…[FILE]…

        常用選項:

         -a 顯示所有文件,包括隱藏文件

         -A  顯示除.和..之外的所有文件

         -l  長格式列表,表示顯示文件的詳細屬性信息

             顯示出來的信息為

             -rw-r-x—  2  root  root  8827  10月15 20:34 testa.log

             -rw-r-x—該文件的文件類型和相應的權限

             2  表示文件被硬鏈接的次數

             root  表示文件的屬主

             root  表示文件的屬組

             8827  表示文件的大小

         但是如果對ll /dev 該處顯示的是兩個數字,類似brw-rw—-. 1 root cdrom    11, 0   7月13 00:34 sr0

         這里的數字前一個表示主設備號,后一個表示次設備號,前一個數字一樣,表示設備類型一樣,后一個數字表示該種設備下的不同的設備

             10月15 20:34 表示文件最后一次被修改的時間

         -h 表示對文件大小做單位換算,換算后的結果可能為非精確值(1000和1024的區別)

         -d 表示僅顯示目錄自身,而不是目錄下面每個文件的屬性,要與-l一起使用,顯示目錄自身的屬性信息

         -r ,–reverse 表示顯示時以逆序的方式進行顯示,默認是升序顯示

         -R ,–recursive 表示遞歸顯示

         ls -ld 目錄和符號鏈接信息

         ls -1 文件分行顯示

         ls -S 按從大到小排序

         ls -u 配合-t,顯示并按atime從新到舊排序

         ls -U不排序按目錄存放順序顯示

         ls -i  可以顯示文件的inode編號

    stat命令:顯示文件或文件系統的狀態,顯示文件的元數據

         例如:stat /etc/passwd

         顯示大小、innod號,權限、最近一次訪問時間(atime)、最近一次的更改時間(mtime)(改變文件內容),最近一次的改變時間(ctime)(改變文件元數據);

    

    touch命令:改變文件的時間戳(atime、mtime、ctime)

     語法:touch [OPTION]…FILE…

     touch 以存在的文件,表示改變文件的三個時間戳

            touch 不存在的文件,表示新建該文件

     touch -a 已存在的文件  表示改變文件的訪問時間atime

     touch -m 已存在的文件  表示改變文件的改變時間mtime

     -c  表示如果文件不存在,則不創建該文件

     -t 時間;表示修改為的時間

         例如:touch -m -t 201607211658.20 /tmp/nwc.txt

         表示修改/tmp/nwc.txt文件的修改時間為2016年07月21日16點58分20秒

    

    cp命令:文件復制命令

    從文件系統存儲級別來理解cp:分配一個空閑的inode號,在inode表中生成一個新的條目,在目錄中創建一個目錄項,將名稱與inode編號關聯,拷貝數據,生成新的文件

     語法:

     單源復制:cp [OPTION]… [-T] SOURCE DEST

     多源復制:cp [OPTION]… SOURCE… DIRECTORY         

        單源復制:cp [OPTION]… [-T] SOURCE DEST

            如果DEST不存在,則事先創建此文件,并復制源文件的數據至DEST中;

            如果DEST存在:

                如果DEST是非目錄文件,則覆蓋目標文件

                如果DEST是目錄文件,則事先在DEST目錄下創建一個與源文件同名的文件,并復制其數據流

        多源復制:cp [OPTION]… SOURCE… DIRECTORY

            如果DEST不存在:錯誤

            如果DEST存在:

                如果DEST是常規文件:錯誤

                如果DEST是目錄:分別復制每個文件至目標目錄中,并保持原名

        常用選項:

            -i  覆蓋之前提醒用戶確認,默認cp就帶此選項

            -f  強制覆蓋目標文件

            -r,-R  遞歸復制目錄及目錄中的內容至目標目錄

            -d  復制軟鏈接文件本身,而不是指向的源文件

            -a  復制文件時保留文件的全部元數據信息,實現歸檔,可用作備份

            –preserv=LIST  指定復制時要保留那些屬性信息

                mode:權限

                ownership:屬主和屬組

                timestamps:時間戳信息

                context:安全標簽

                xattr:擴展屬性

                links:符號鏈接

                all:上述所有屬性

    mv命令:文件移動命令

    (注意:同一個分區的mv操作,只是改了對應目錄文件數據中針對該文件的指針信息,文件自身的inode和數據塊都沒發生改變,但是不同分區之間的mv操作是全部都改掉的)

    從文件系統存儲級別來理解mv:如果源和目標在同一個文件系統內部進行mv操作,則對應的操作相當于用新的文件名,創建對應新的目錄項,刪除舊的目錄項及對應的舊的文件名,整個操作不會涉及到文件本身的inode號的改變和數據塊的改變,只會修改inode條目上的時間戳信息,數據塊的內容不會發生移動

        如果源和目標不在同一文件系統,則相當于cp和rm的操作

        語法:與cp一樣

        常用選項 -i、-f

    rm命令:刪除文件(建議自己建個目錄文件,把要刪除的文件先mv到此目錄,過段時間后確認不用后,再刪除)

    從文件系統存儲級別來理解rm:鏈接數遞減,取消inode與數據block之間的關聯關系,釋放inode號,將數據塊標志為空閑狀態,刪除目錄項。rm命令是不會刪除數據塊中的數據的,只是標記為空閑,讓其他文件的數據可以寫到該數據塊,從而覆蓋掉以前的數據

        常用選項:-i、-f、-r

    alias  可以顯示當前系統上的命令別名信息

     定義命令別名:

         alias NAME='COMMAND'  只對當前shell有效,立即生效,重啟后失效

         例如 alias cds=‘cd /etc/sysconfig/network-scripts/’

     撤銷別名:

         umalias NAME

         例如 unalias cds

     要想永久生效,可定義在/etc/bashrc配置文件中,如果只想對某個用戶永久有效,可以在該用戶家目錄中.bashrc中定義

    

    tree命令  顯示目錄樹

         -d 只顯示目錄

         -L LEVEL  指定顯示的層級數目

         -P PARTEREN  指定顯示通配符的目錄

    mkdir 創建目錄

         -p  遞歸創建,存在于不報錯,且可以自動創建所需的各目錄

         -v 顯示詳細過程

         -m MODE  創建目錄時指定權限

             mkdir -pv /testdir/dir1/{x,y}/{a,b}

             mkdir -pv /testdir/dir2/{x/{a,b},y}

             mkdir -pv /testdir/dir{3,4,5/dir{6,7}}

    rmdir  刪除空目錄

         -p  遞歸刪除父空目錄

         -v 顯示詳細信息

    file命令

        語法file [OPTION] FILENAME

        選項:

          -b  顯示時不顯示文件名

          -f FILE  將需要判斷文件類型的文件寫到一個文件中,用-f指定這個文件,批量判斷文件類型

          -F  顯示時用指定的符號作為分隔符,默認是:冒號

          -i  顯示出文件的編碼類型

          -L  判斷軟鏈接時,默認只顯示軟鏈接文件本身的類型,不顯示原文件的類型,加上-L后,可以顯示出源文件的類型

  5、通配符

    *  匹配零個或多個任意字符

    ? 匹配任意單個字符

    ~  當前用戶家目錄

    ~USERNAME  指定用戶家目錄

    ~+ 當前工作目錄

    ~- 前一個工作目錄

    [0-9] 匹配一個數字范圍

    [a-z] 大寫和小寫字母,表示aAbBcC…yYz  不包含大Z

    [A-Z] 大寫和小寫字母,表示AbBcC…yYzZ  不包含小a

        例如:[a-d]表示匹配 aAbBcCd 不包含大D

            但[abcd]則只匹配abcd

    [nwc9] 匹配括號內的單個字符

    [^nwc9] 匹配除括號內的字符意外的任意單個字符

    [[:digit:]] 匹配任意數字,相當于[0-9]

    [^[:digit:]] 匹配除數字之外的字符

    [[:lower:]] 匹配任意小寫字母

    [[:upper:]] 匹配任意大寫字母

    [[:alpha:]] 匹配任意大小字母

    [[:alnum:]] 匹配任意數字或大小寫字母

    [[:space:]] 匹配空格

    [[:punct:]] 匹配標點

第二部分    管道和IO重定向

  1、標準輸入輸出介紹

    linux為程序提供三種I/O設備:

        標準輸入(STDIN):0    默認是鍵盤

        標準輸出(STDOUT):1    默認是終端窗口屏幕

        標準錯誤輸出(STDERR):2    默認是終端窗口屏幕

  2、IO重定向

    I/O重定向就是將默認標準的輸入、輸出、錯誤輸出定向的別的地方

    重定向的方法:命令  重定向操作符  重定向的目標

        >    標準輸出重定向,覆蓋目標的內容

        >>    標準輸出重定向,將結果追加到目標,不會覆蓋目標的內容

        2>    標準錯誤輸出重定向,覆蓋目標的內容

        2>>    標準錯誤輸出重定向,將結果追加到目標,不會覆蓋目標的內容

        &>    標準輸出和標準錯誤輸出重定向,覆蓋目標的內容

        &>>    標準輸出和標準錯誤輸出重定向,將結果追加到目標,不會覆蓋目標的內容

        多個命令合并的輸出:

            例如:(cal 2015;cal2016)>/testdir/cal.txt

        <     輸入重定向

            例如:mail -s “help” root</etc/issue

                tr ‘a-z’ ‘A-Z’</etc/issue

     tr命令:轉換和刪除字符

        語法:tr [OPTION]… ‘SET1’ [‘SET2’]

        選項:

            -c  取字符集的補集

            -s  把連續重復的字符,以單個字符表示

                tr -s‘\n’ 表示把連續的換行符,變成1個換行符,可實現刪除空白行

            -d  刪除SET1匹配到的內容

            -t  將SET1的內容轉換成SET2的內容

        SET支持的內容格式:

          \NNN 八進制值為NNN 的字符(1 至3 個數位)

          \\ 反斜杠

          \a 終端鳴響

          \b 退格

          \f 換頁

          \n 換行

          \r 回車

          \t 水平制表符

          \v 垂直制表符

          字符1-字符2 從字符1 到字符2 的升序遞增過程中經歷的所有字符

          [字符*] 在SET2 中適用,指定字符會被連續復制直到吻合設置1 的長度

          [字符*次數] 對字符執行指定次數的復制,若次數以 0 開頭則被視為八進制數

          [:alnum:] 所有的字母和數字

          [:alpha:] 所有的字母

          [:blank:] 所有呈水平排列的空白字符

          [:cntrl:] 所有的控制字符

          [:digit:] 所有的數字

          [:graph:] 所有的可打印字符,不包括空格

          [:lower:] 所有的小寫字母

          [:print:] 所有的可打印字符,包括空格

          [:punct:] 所有的標點字符

          [:space:] 所有呈水平或垂直排列的空白字符

          [:upper:] 所有的大寫字母

          [:xdigit:] 所有的十六進制數

          [=字符=] 所有和指定字符相等的字符

   

  3、管道

    管道(|)用來連接命令,例如:

    COMMAND1|COMMAND|COMMAND3…

    表示將COMMAND1的輸出作為COMMAND2的輸入,COMMAND的標準輸出作為COMMAND3的輸入

    注意:錯誤輸出默認不能通過管道進行發送,如果要發送,可以利用2>&1或|&來實現

第三部分    練習

  1、將/etc/issue文件中的內容轉換為大寫后保存至/tmp/issue.out文件中

    tr 'a-z' 'A-Z' < /etc/issue >/tmp/issue.out

  2、將當前系統登錄用戶的信息轉換為大寫后保存至/tmp/who.out文件中

    who|tr 'a-z' 'A-Z' >/tmp/who.out

  3、一個linux用戶給root發郵件,要求郵件標題為”help”,郵件正文如下:

      Hello, I am 用戶名,the system version is here,pleasehelp me to check it ,thanks!

     操作系統版本信息

      echo -e "hello,I am `whoami`,The system version is ,please help me to check it,thanks\n`uname -sr`" |mail -s "help" root

  4、將/root/下文件列表,顯示成一行,并文件名之間用空格隔開

      for i in `ls /root`;do echo -n "$i ";done;echo

  5、file1文件的內容為:”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和

       i=$((`tr ' ' '+' </testdir/file1`));echo $i

  6、刪除Windows文本文件中的'^M'字符

      cat -A /testdir/新建文本文檔.txt | tr -d '^M'

  7、處理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的數字和空格

      echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4'|tr -d '[:alpha:][:punct:]'

  8、將PATH變量每個目錄顯示在獨立的一行

      echo $PATH|tr ':' '\n'

  9、刪除指定文件的空行

      tr -s '\n' '\n' </testdir/f1

  10、將文件中每個單詞(字母)顯示在獨立的一行,并無空行

      tr -s '\n' '\n' <f1|tr ' ' '\n'

原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/26505

(1)
M20-1倪文超M20-1倪文超
上一篇 2016-07-29 11:17
下一篇 2016-07-29 15:22

相關推薦

  • Linux基礎 sed命令詳解

    概述 sed是一個流編輯器(Stream EDitor)。主要用于自動編輯一個或多個文件;簡化對文件的反復操作;編寫轉換程序等。本文主要講述了: sed工作原理 sed命令格式及常用選項 應用實例 高級編輯命令 sed工作原理 sed命令運行過程中維護著兩個緩沖區,一個是活動的“模式空間(pattern space)”,另一個是起輔助作用的“暫存緩沖區(ho…

    Linux干貨 2016-08-12
  • 6

    請詳細總結vim編輯器的使用并完成以下練習題; 1、復制/etc/rc.d/rc.sysinit文件至/tmp目錄,將/tmp/ rc.sysinit文件中的以至少一個空白字符開頭的行的行首加#; #   cp /etc/rc.d/rc.sysinit /tmp/ #   vim…

    Linux干貨 2017-02-07
  • Linux系統下的bonding設置

    bonding多個物理網卡聚合成一個虛擬網卡     Bonding,其原理是講多個物理網卡聚合成一個虛擬網卡,一張網卡正常工作,其余網卡作為備用,每隔一段時間(miimon=毫秒),向正常工作的網卡發一狀態詢問,若沒回復,則認為其運行失敗,然后就會啟用備用網卡,但是IP地址不會改變。   &nbs…

    Linux干貨 2016-09-07
  • redis-cli的一些有趣也很有用的功能

    redis-cli我們最常用的三個參數就是-h、-p、-a選項,分配用來指定連接的redis-server的host、port和登錄密碼。通過redis-cli –help發現,redis-cli還提供了其他很多的參數和功能。 1)-x-x選項從標準輸入(stdin)讀取最后一個參數。 比如從管道中讀取輸入: echo -en &quot…

    Linux干貨 2016-04-13
  • LVM詳解

    Linux的LVM詳解 LVM組成; LVM:logic volume manager .LVM即邏輯卷管理,現在使用版本為第二版,即version2 邏輯卷:pv,physical volume,即計算機上的磁盤設備,例如我的計算機上的/dev/sda3,/dev/sda5. 卷組:vg,volume group。一般由多個pv組成。 邏輯卷:lv,log…

    Linux干貨 2016-02-14
  • 初入命令世界

    一、inode節點號         在linux中,每一個文件都有唯一的inode號,inode號也是系統識別的唯一編碼,而文件名僅僅是為了使用者區分辨認, inode (index node )表中包含文件系統所有文件列表 一個節點(索引節點)是在一個表項,包含有關…

    2017-05-26
欧美性久久久久