• 當前位置:首頁 > IT技術 > 系統服務 > 正文

    零基礎領跑教科書式博文:DAY2---Linux文件管理
    2021-10-22 09:59:11

    文件管理

    jpeg

    文件系統結構

    • 文件和目錄被組織成一個單根倒置樹結構
    • 文件系統從根目錄下開始,用“/”表示
    • 根文件系統(rootfs):root filesystem
    • 文件名稱區分大小寫
    • 以.開頭的文件為隱藏文件
    • 路徑分隔的 /
    • 文件有兩類數據:
      ? 元數據:metadata
      ? 數據:data

    • 文件系統分層結構:LSB Linux Standard Base
    • FHS: (Filesystem Hierarchy Standard)
      ? http://www.pathname.com/fhs/
    • 文件名最長255個字節
    • 包括路徑在內文件名稱最長4095個字節
    • 藍色-->目錄 綠色-->可執行文件 紅色-->壓縮文件 淺藍色-->鏈接文件 灰色-->其他文件
      ? cat /etc/DIR_COLORS
    • 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目錄名和文件不推薦使用,有些字符需要用引號來引用它們。
    • 標準Linux文件系統(如ext4),文件名稱大小寫敏感。例如:MAIL, Mail, mail, mAiL

    各目錄介紹

    • /boot:引導文件存放目錄,內核文件(vmlinuz)、引導加載器(bootloader, grub)都存放于此目錄
    • /bin:供所有用戶使用的基本命令;不能關聯至獨立分區,OS啟動即會用到的程序
    • /sbin:管理類的基本命令;不能關聯至獨立分區,OS啟動即會用到的程序
    • /lib:啟動時程序依賴的基本共享庫文件以及內核模塊文件(/lib/modules)
    • /lib64:專用于x86_64系統上的輔助共享庫文件存放位置
    • /etc:配置文件目錄
    • /home/USERNAME:普通用戶家目錄
    • /root:管理員的家目錄
    • /media:便攜式移動設備掛載點
    • /mnt:臨時文件系統掛載點
    • /dev:設備文件及特殊文件存儲位置
      ? b: block device,隨機訪問
      ? /dev/sda
      ? c: character device,線性訪問
      ? /dev/zero
    • /opt:第三方應用程序的安裝位置
    • /srv:系統上運行的服務用到的數據
    • /tmp:臨時文件存儲位置
    • /usr: universal shared, read-only data
      ? bin: 保證系統擁有完整功能而提供的應用程序
      ? sbin:
      ? lib:32位使用
      ? lib64:只存在64位系統
      ? include: C程序的頭文件(header files)
      ? share:結構化獨立的數據,例如doc, man等
      ? local:第三方應用程序的安裝位置
       ? bin, sbin, lib, lib64, etc, share
    • /var: variable data files
      ? cache: 應用程序緩存數據目錄
      ? lib: 應用程序狀態信息數據
      ? local:專用于為/usr/local下的應用程序存儲可變數據;
      ? lock: 鎖文件
      ? log: 日志目錄及文件
      ? opt: 專用于為/opt下的應用程序存儲可變數據;
      ? run: 運行中的進程相關數據,通常用于存儲進程pid文件
      ? spool: 應用程序數據池
      ? tmp: 保存系統兩次重啟之間產生的臨時數據
    • /proc: 用于輸出內核與進程信息相關的虛擬文件系統
    • /sys:用于輸出當前系統上硬件設備相關信息虛擬文件系統
      ? echo "- - -" > /sys/class/scsi_host/host0/scan
    • /selinux: security enhanced Linux,selinux相關的安全策略等信息的存儲位置

    ? CentOS 7目錄變化

    • /bin 和 /usr/bin
    • /sbin 和 /usr/sbin
    • /lib 和/usr/lib
    • /lib64 和 /usr/lib64

    ? 應用程序組成部分

    • 二進制程序:/bin, /sbin, /usr/bin, /usr/sbin, /usr/local/bin, /usr/local/sbin
    • 庫文件:/lib, /lib64, /usr/lib, /usr/lib64, /usr/local/lib, /usr/local/lib64
    • 配置文件:/etc, /etc/DIRECTORY, /usr/local/etc
    • 幫助文檔
      ? /usr/share/man, /usr/share/doc, /usr/local/share/man, /usr/local/share/doc

    Linux下的文件類型及目錄

    文件類型

    • -:普通文件
    • d: 目錄文件
    • b: 塊設備
    • c: 字符設備
    • l: 符號鏈接文件
    • p: 管道文件pipe
    • s: 套接字文件socket

    相關概念

    • 顯示當前工作目錄
      ? 每個shell和系統進程都有一個當前的工作目錄
      ? CWD:current work directory
      ? 顯示當前shell CWD的絕對路徑
    • 絕對路徑
      ? 以正斜杠開始
      ? 完整的文件的位置路徑
      ? 可用于任何想指定一個文件名的時候
    • 相對路徑名
      ? 不以斜線開始
      ? 指定相對于當前工作目錄或某目錄的位置
      ? 可以作為一個簡短的形式指定一個文件名
    • 基名:basename
    • 目錄名:dirname
    • 小技巧,創建刪除特殊的文件
      ? touch ./-host
      ? rm -rf ./-host

    相關命令

    cd

    • 改變目錄
    • 使用絕對或相對路徑:
      ? cd /home/fang
      ? cd home/fang
    • 切換至父目錄: cd ..
    • 切換至當前用戶主目錄: cd
    • 切換至以前的工作目錄: cd -
    • 選項:-P
    • 相關的環境變量:
      ? PWD:當前目錄路徑
      ? OLDPWD:上一次目錄路徑

    pwd

    • printing working directory
      ? -P 顯示真實物理路徑 軟鏈接的時候有用到
      ? -L 顯示鏈接路徑(默認)

    ls

    • 列出當前目錄的內容或指定目錄

    • 用法:ls [options] [files_or_dirs]

    • 示例
      ? ls -a 包含隱藏文件
       ? ls -d /etc/.*
       ? ls -d /etc/.[^.]* 目錄下所有隱藏文件
       ? ls -I "[^.]*" -a
       ? l.

      ? ls -l 顯示額外的信息
      ? ls -R 目錄遞歸通過
       ? ls -lR /etc/ | grep "^-" | wc -l 統計目錄所有的文件

      ? ls -ld 目錄和符號鏈接信息
       ? ls -ld /etc 查看目錄信息

      ? ls -1 文件分行顯示
      ? ls –S 按從大到小排序
       ? ls -Sr 按從小到大排序

      ? ls –t 按mtime排序
      ? ls –u 配合-t選項,顯示并按atime從新到舊排序
      ? ls –U 按目錄存放順序顯示
      ? ls –X 按文件后綴排序

    stat

    • 文件:metadata, data

    • 三個時間戳:
      ? access time:訪問時間,atime,讀取文件內容
       ? ls -l 1.file --time=atime

      ? modify time: 修改時間, mtime,改變文件內容(數據)
       ? ls -l 默認看到的時間

      ? change time: 改變時間, ctime,元數據發生改變

    touch

    • touch [OPTION]… FILE…
      ? -a 僅改變 atime和ctime
      ? -m 僅改變 mtime和ctime
      ? -t [[CC]YY]MMDDhhmm[.ss]
      ? -c 如果文件不存在,則不予創建

    cp

    • cp [OPTION]… [-T] SOURCE DEST
    • cp [OPTION]… SOURCE… DIRECTORY
    • cp [OPTION]… -t DIRECTORY SOURCE…
    • cp常用選項
      ? -i:覆蓋前提示 –n:不覆蓋,注意兩者順序
      ? -r, -R: 遞歸復制目錄及內部的所有內容
      ? -a: 歸檔,相當于-dR --preserv=all (保留屬性常用)
      ? -d:--no-dereference --preserv=links 不復制原文件,只復制鏈接名
      ? --preserv[=ATTR_LIST]
       ? mode: 權限
       ? ownership: 屬主屬組
       ? timestamp:
       ? links
       ? xattr
       ? context
       ? all
      ? -p: 等同--preserv=mode,ownership,timestamp
      ? -v: --verbose
      ? -f: --force
      ? -u:--update 只復制源比目標更新文件或目標不存在的文件
      ? --backup=numbered 目標存在,覆蓋前先備份加數字后綴
    • cp SRC DEST SRC是文件:
      ? 如果目標不存在:新建DEST,并將SRC中內容填充至DEST中
      ? 如果目標存在:
       ? 如果DEST是文件:將SRC中的內容覆蓋至DEST中
       ? 如果DEST是目錄:在DEST下新建與原文件同名的文件,并將SRC中內容填充至新文件中
    • cp SRC DEST SRC是目錄:
      ? 此時使用選項:-r
      ? 如果DEST不存在:則創建指定目錄,復制SRC目錄中所有文件至DEST中;
      ? 如果DEST存在:
       ? 如果DEST是文件:報錯
       ? 如果DEST是目錄:在DEST下新建與原目錄同名的目錄,并將SRC中內容復制至新目錄中
      ? 示圖
      jpeg

    mv

    • mv [OPTION]… [-T] SOURCE DEST
    • mv [OPTION]… SOURCE… DIRECTORY
    • mv [OPTION]… -t DIRECTORY SOURCE…
    • 常用選項
      ? -i: 交互式
      ? -f: 強制
    • mv f1 /dir2/f2 底層實現原理
      ? 同一分區:Inode節點編號跟數據存放位置不變,原文件與新文件為同一個文件
      ? 不同分區:Inode節點編號跟數據存放位置發生變化,原文件與新文件為不同文件
    • ln -s /root/f1 /root/2/f2 底層實現原理
      ? 在/root/2/目錄下創建新文件f2、Inode節點編號發生變化
      ? f2為f1的軟鏈接,訪問f2 Inode指針指向f1的數據存放位置

    rename

    • 批量修改文件

      ? 示例

      touch f{1..100}.txt
      rename "txt" "txt.bak" *.txt
      rename '.bak' '' *.bak

    rm

    • rm [OPTION]… FILE…
    • 常用選項:
      ? -i 交互式
      ? -f 強制刪除
      ? -r 遞歸
      ? rm -rf 慎用
      ? alias rm=mv -t /trash
    • 刪除大文件方法、立即釋放空間
      ? > bigfile
      ? rm -f bigfile
    • shred 反復覆蓋
      ? shred -zvu -n5 f2
      ? u 是否刪除文件

    tree

    • -d: 只顯示目錄
    • -L level:指定顯示的層級數目
      ? tree -d -L 1 /etc
    • -P pattern: 只顯示由指定pattern匹配到的路徑

    mkdir

    • -p: 存在于不報錯,且可自動創建所需的各目錄
    • -v: 顯示詳細信息
    • -m MODE: 創建目錄時直接指定權限

    rmdir

    • -p: 遞歸刪除父空目錄
    • -v: 顯示詳細信息

    file

    • 文件可以包含多種類型的數據
    • 檢查文件的類型,然后確定適當的打開命令或應用程序使用
    • file [options] …
    • 常用選項:
      ? -b 列出文件辨識結果時,不顯示文件名稱
      ? -f filelist 列出文件filelist中文件名的文件類型
      ? -F 使用指定分隔符號替換輸出文件名后默認的”:”分隔符
      ? -L 查看對應軟鏈接對應文件的文件類型
      ? --help 顯示命令在線幫助
      ? hexdump -C -n 100 f1 查看文件2進制前100個字節

    文件通配符

    • * 匹配零個或多個字符

    • ? 匹配任何單個字符

    • ~ 當前用戶家目錄

    • ~ fang 用戶fang家目錄

    • ~ + 當前工作目錄

    • ~ - 前一個工作目錄

    • [0-9] 匹配數字范圍

    • [a-z]:字母
      ? 示例

      ll [a-c].file
      
      -rw-r--r--. 1 root root 0 Nov  5 06:49 a.file
      -rw-r--r--. 1 root root 0 Nov  5 06:49 A.file
      -rw-r--r--. 1 root root 0 Nov  5 06:49 b.file
      -rw-r--r--. 1 root root 0 Nov  5 06:49 B.file
      -rw-r--r--. 1 root root 0 Nov  5 06:49 c.file
    • [A-Z]:字母

    • [fang] 匹配列表中的任何的一個字符

    • [^fang] 匹配列表中的所有字符以外的字符

    ? 預定義的字符類

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

    • [:lower:]:任意小寫字母

    • [:alnum:]:任意數字或字母

    • [:blank:]:水平空白字符

    • [:space:]:水平或垂直空白字符

    • [:punct:]:標點符號

    • [:print:]:可打印字符

    • [:cntrl:]:控制(非打?。┳址?/p>

    • [:graph:]:圖形字符

    • [:xdigit:]:十六進制字符

    索引節點

    inode

    • df -i 查看分區的節點使用率
      ? echo {1..600000}.file | xargs touch測試
      ? Inode節點使用率100%,會導致磁盤有剩余空間、但文件無法寫入
    • inode(index node)表中包含文件系統所有文件列表
    • 一個節點 (索引節點)是在一個表項,包含有關文件的信息( 元數據 ),包括:
      ? 文件類型,權限,UID,GID
      ? 鏈接數(指向這個文件名路徑名稱個數)
      ? 該文件的大小和不同的時間戳
      ? 指向磁盤上文件的數據塊指針
      ? 有關文件的其他數據
    • inode表結構
      ? 示圖
      jpeg
      jpeg
    • 目錄與inode關系
      ? 文件引用的是 inode號
      ? 人是通過文件名來引用一個文件
      ? 一個目錄是目錄下的文件名和文件inode號之間的映射
      ? 示圖
      jpeg
    • 節點編號
      ? 獨立分區的目錄掛載點,Inode節點編號一樣
      ? Centos7 掛截點節點編號64
      ? Centos6 掛載點節點編號2
      ? 同一分區內的文件、Inode節點編號相同為同一個文件
    • 指針與數據塊的關系
      ? 直接指針的數量為12個
      ? 直接指針可表達的48k以內的容量
      ? 一個間接指針可表達4M的容量
      ? 間接指針指向一個4K的數據塊,每個數據塊包含1024個小塊,每塊小塊指向4K的數據,所以一個間接指針可表達 1024X4=4M的數據
      ? 雙重間接指針可表達4G的容量
      ? 三級指針可表達4T的容量
    • Inode節點編號與目錄的關系
      ? 目錄的節點編號的指針、所指向的數據塊,存放的是它目錄下文件的節點編號與文件名稱列表

    相關命令與inode索引關系

    cp和inode

    • 命令: cp
      ? 分配一個空閑的inode號,在inode表中生成新條目
      ? 在目錄中創建一個目錄項,將名稱與inode編號關聯
      ? 拷貝數據生成新的文件

    rm和inode

    • 命令: rm
      ? 鏈接數遞減,從而釋放的inode號可以被重用
      ? 把數據塊放在空閑列表中
      ? 刪除目錄項
      ? 數據實際上不會馬上被刪除,但當另一個文件使用數據塊時將被覆蓋。

    mv和inode

    • 如果mv命令的目標和源在相同的文件系統,作為mv 命令
      ? 用新的文件名創建對應新的目錄項
      ? 刪除舊目錄條目對應的舊的文件名
      ? 不影響inode表(除時間戳)或磁盤上的數據位置:沒有數據被移動!
    • 如果目標和源在一個不同的文件系統, mv相當于cp和rm

    軟、硬鏈接

    硬鏈接

    • 創建硬鏈接會增加額外的記錄項以引用文件
    • 對應于同一文件系統上一個物理文件
    • 每個目錄引用相同的inode號
    • 創建時鏈接數遞增
    • 刪除文件時:
      ? rm命令遞減計數的鏈接
      ? 文件要存在,至少有一個鏈接數
      ? 當鏈接數為零時,該文件被刪除
    • 不能跨越驅動器或分區
    • 語法:
      ? ln filename [linkname ]
      ? ln file1 file2 本質上給file1 起了一個新的名字 同一個文件、不同的名字

    軟(或符號)鏈接

    • 一個符號鏈接指向另一個文件
      ? 軟鏈接本質上不是同一個文件,鏈接文件依賴原文件

    • ls - l的 顯示鏈接的名稱和引用的文件

    • 一個符號鏈接的內容是它引用文件的名稱

    • 可以對目錄進行

    • 可以跨分區

    • 指向的是另一個文件的路徑;其大小為指向的路徑字符串的長度;不增加或減目標文件inode的引用計數;

    • 語法:
      ? ln -s filename ??[linkname] 創建軟鏈接
      ? ln -snf newfilename [linkname] 更改軟鏈接
      ? 示例

      ls -l /dev/sda
      brw-rw----. 1 root disk 8, 0 Nov  5 15:56 /dev/sda
      #8設備類型
      #0這個類型的第幾個設備
    • 軟鏈接文件的大小由指向文件的字節數決定

    軟、硬鏈接本質區別

    1. 軟鏈接本質上是一個新的文件、只是一個快捷方式,硬鏈接本質上是同一個文件,重新命名了一個新名稱
    2. 創建軟鏈接不會增加鏈接數,創建硬鏈接、會增加文件鏈接數
    3. 軟鏈接支持跨分區、跨設備、目錄,硬鏈接不支持跨分區、跨設備、目錄
    4. 創建軟鏈接節點編號與原始文件節點編號不相同。創建硬鏈接,節點編號與原始文件節點編號相同
    5. 軟鏈接文件與原始文件有主次之分,軟鏈接文件依賴原始文件。硬鏈接文件與原始文件關系平等

    練習

    1. 顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間出現至少一位數字的文件或目錄

      ls /var/l*[0-9]*[[:lower:]]
    2. 顯示/etc目錄下以任意一位數字開頭,且以非數字結尾的文件或目錄

      ls /etc/[0-9]*[^0-9]
    3. 顯示/etc/目錄下以非字母開頭,后面跟了一個字母及其它任意長度任意字符的文件或目錄

      ls -d /etc/[^[:alpha:]][[:alpha:]]*
    4. 顯示/etc/目錄下所有以rc開頭,并后面是0-6之間的數字,其它為任意字符的文件或目錄

      ls -d  /etc/rc[0-6]*
    5. 顯示/etc目錄下,所有以.d結尾的文件或目錄

      ls -d /etc/*.d
    6. 顯示/etc目錄下,所有.conf結尾,且以m,n,r,p開頭的文件或目錄

      ls -d /etc/[mnrp]*.conf
    7. 只顯示/root下的隱藏文件和目錄

      ls -d /root/.*
    8. 只顯示/etc下的非隱藏目錄

      ls -d /etc/*/
    9. 定義別名命令baketc,每天將/etc/目錄下所有文件,備份到/app獨立的子目錄下,并要求子目錄格式為 backupYYYY-mm-dd,備份過程可見

      alias baketc='cp -av /etc/ /app/backup$(date +%F)'
    10. 創建/app/rootdir目錄,并復制/root下所有文件到該目錄內,要求保留原有權限

      mkdir /app ; cp -av /root/ /app/rootdir
    11. 備份/root下所有內容(包括隱藏和非隱藏)到/data目錄下

      cp -ar /root/. /data
    12. 如何創建/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a, /testdir/dir1/x/b, /testdir/dir1/y/a, /testdir/dir1/y/b

      mkdir -pv /testdir/dir1/{x,y}/{a,b}
    13. 如何創建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b

      mkdir -pv /testdir/dir2/{x/{a,b},y}
    14. 如何創建/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7

      mkdir -pv /testdir/{dir3,dir4,dir5/{dir6,dir7}}

    本文摘自 :https://blog.51cto.com/u

    開通會員,享受整站包年服務
    国产呦精品一区二区三区网站|久久www免费人咸|精品无码人妻一区二区|久99久热只有精品国产15|中文字幕亚洲无线码