當(dāng)前位置:首頁 > IT技術(shù) > 系統(tǒng)服務(wù) > 正文

零基礎(chǔ)領(lǐng)跑教科書式博文:DAY2---Linux文件管理
2021-10-22 09:59:11

文件管理

jpeg

文件系統(tǒng)結(jié)構(gòu)

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

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

各目錄介紹

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

? CentOS 7目錄變化

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

? 應(yīng)用程序組成部分

  • 二進(jìn)制程序:/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: 塊設(shè)備
  • c: 字符設(shè)備
  • l: 符號鏈接文件
  • p: 管道文件pipe
  • s: 套接字文件socket

相關(guān)概念

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

相關(guān)命令

cd

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

pwd

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

ls

  • 列出當(dāng)前目錄的內(nèi)容或指定目錄

  • 用法: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 統(tǒng)計目錄所有的文件

    ? 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,讀取文件內(nèi)容
     ? ls -l 1.file --time=atime

    ? modify time: 修改時間, mtime,改變文件內(nèi)容(數(shù)據(jù))
     ? ls -l 默認(rèn)看到的時間

    ? change time: 改變時間, ctime,元數(shù)據(jù)發(fā)生改變

touch

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

cp

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

mv

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

rename

  • 批量修改文件

    ? 示例

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

rm

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

tree

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

mkdir

  • -p: 存在于不報錯,且可自動創(chuàng)建所需的各目錄
  • -v: 顯示詳細(xì)信息
  • -m MODE: 創(chuàng)建目錄時直接指定權(quán)限

rmdir

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

file

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

文件通配符

  • * 匹配零個或多個字符

  • ? 匹配任何單個字符

  • ~ 當(dāng)前用戶家目錄

  • ~ fang 用戶fang家目錄

  • ~ + 當(dāng)前工作目錄

  • ~ - 前一個工作目錄

  • [0-9] 匹配數(shù)字范圍

  • [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] 匹配列表中的所有字符以外的字符

? 預(yù)定義的字符類

  • [:digit:]:任意數(shù)字,相當(dāng)于0-9

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

  • [:alnum:]:任意數(shù)字或字母

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

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

  • [:punct:]:標(biāo)點(diǎn)符號

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

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

  • [:graph:]:圖形字符

  • [:xdigit:]:十六進(jìn)制字符

索引節(jié)點(diǎn)

inode

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

相關(guān)命令與inode索引關(guān)系

cp和inode

  • 命令: cp
    ? 分配一個空閑的inode號,在inode表中生成新條目
    ? 在目錄中創(chuàng)建一個目錄項,將名稱與inode編號關(guān)聯(lián)
    ? 拷貝數(shù)據(jù)生成新的文件

rm和inode

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

mv和inode

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

軟、硬鏈接

硬鏈接

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

軟(或符號)鏈接

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

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

  • 一個符號鏈接的內(nèi)容是它引用文件的名稱

  • 可以對目錄進(jìn)行

  • 可以跨分區(qū)

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

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

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

軟、硬鏈接本質(zhì)區(qū)別

  1. 軟鏈接本質(zhì)上是一個新的文件、只是一個快捷方式,硬鏈接本質(zhì)上是同一個文件,重新命名了一個新名稱
  2. 創(chuàng)建軟鏈接不會增加鏈接數(shù),創(chuàng)建硬鏈接、會增加文件鏈接數(shù)
  3. 軟鏈接支持跨分區(qū)、跨設(shè)備、目錄,硬鏈接不支持跨分區(qū)、跨設(shè)備、目錄
  4. 創(chuàng)建軟鏈接節(jié)點(diǎn)編號與原始文件節(jié)點(diǎn)編號不相同。創(chuàng)建硬鏈接,節(jié)點(diǎn)編號與原始文件節(jié)點(diǎn)編號相同
  5. 軟鏈接文件與原始文件有主次之分,軟鏈接文件依賴原始文件。硬鏈接文件與原始文件關(guān)系平等

練習(xí)

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

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

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

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

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

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

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

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

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

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

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

    cp -ar /root/. /data
  12. 如何創(chuàng)建/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. 如何創(chuàng)建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b

    mkdir -pv /testdir/dir2/{x/{a,b},y}
  14. 如何創(chuàng)建/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

開通會員,享受整站包年服務(wù)立即開通 >