文件管理
文件系統(tǒng)結(jié)構(gòu)
- 文件和目錄被組織成一個(gè)單根倒置樹(shù)結(jié)構(gòu)
- 文件系統(tǒng)從根目錄下開(kāi)始,用“/”表示
- 根文件系統(tǒng)(rootfs):root filesystem
- 文件名稱(chēng)區(qū)分大小寫(xiě)
- 以.開(kāi)頭的文件為隱藏文件
- 路徑分隔的 /
- 文件有兩類(lèi)數(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/ - 文件名最長(zhǎng)255個(gè)字節(jié)
- 包括路徑在內(nèi)文件名稱(chēng)最長(zhǎng)4095個(gè)字節(jié)
- 藍(lán)色-->目錄 綠色-->可執(zhí)行文件 紅色-->壓縮文件 淺藍(lán)色-->鏈接文件 灰色-->其他文件
?cat /etc/DIR_COLORS
- 除了斜杠和NUL,所有字符都有效.但使用特殊字符的目錄名和文件不推薦使用,有些字符需要用引號(hào)來(lái)引用它們。
- 標(biāo)準(zhǔn)Linux文件系統(tǒng)(如ext4),文件名稱(chēng)大小寫(xiě)敏感。例如:MAIL, Mail, mail, mAiL
各目錄介紹
- /boot:引導(dǎo)文件存放目錄,內(nèi)核文件(vmlinuz)、引導(dǎo)加載器(bootloader, grub)都存放于此目錄
- /bin:供所有用戶(hù)使用的基本命令;不能關(guān)聯(lián)至獨(dú)立分區(qū),OS啟動(dòng)即會(huì)用到的程序
- /sbin:管理類(lèi)的基本命令;不能關(guān)聯(lián)至獨(dú)立分區(qū),OS啟動(dòng)即會(huì)用到的程序
- /lib:?jiǎn)?dòng)時(shí)程序依賴(lài)的基本共享庫(kù)文件以及內(nèi)核模塊文件(/lib/modules)
- /lib64:專(zhuān)用于x86_64系統(tǒng)上的輔助共享庫(kù)文件存放位置
- /etc:配置文件目錄
- /home/USERNAME:普通用戶(hù)家目錄
- /root:管理員的家目錄
- /media:便攜式移動(dòng)設(shè)備掛載點(diǎn)
- /mnt:臨時(shí)文件系統(tǒng)掛載點(diǎn)
- /dev:設(shè)備文件及特殊文件存儲(chǔ)位置
?b: block device,隨機(jī)訪問(wèn)
? /dev/sda
?c: character device,線性訪問(wèn)
? /dev/zero - /opt:第三方應(yīng)用程序的安裝位置
- /srv:系統(tǒng)上運(yùn)行的服務(wù)用到的數(shù)據(jù)
- /tmp:臨時(shí)文件存儲(chǔ)位置
- /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:專(zhuān)用于為/usr/local下的應(yīng)用程序存儲(chǔ)可變數(shù)據(jù);
? lock: 鎖文件
? log: 日志目錄及文件
? opt: 專(zhuān)用于為/opt下的應(yīng)用程序存儲(chǔ)可變數(shù)據(jù);
? run: 運(yùn)行中的進(jìn)程相關(guān)數(shù)據(jù),通常用于存儲(chǔ)進(jìn)程pid文件
? spool: 應(yīng)用程序數(shù)據(jù)池
? tmp: 保存系統(tǒng)兩次重啟之間產(chǎn)生的臨時(shí)數(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)的安全策略等信息的存儲(chǔ)位置
? 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
- 庫(kù)文件:/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下的文件類(lèi)型及目錄
文件類(lèi)型
- -:普通文件
- d: 目錄文件
- b: 塊設(shè)備
- c: 字符設(shè)備
- l: 符號(hào)鏈接文件
- p: 管道文件pipe
- s: 套接字文件socket
相關(guān)概念
- 顯示當(dāng)前工作目錄
? 每個(gè)shell和系統(tǒng)進(jìn)程都有一個(gè)當(dāng)前的工作目錄
? CWD:current work directory
? 顯示當(dāng)前shell CWD的絕對(duì)路徑 - 絕對(duì)路徑
? 以正斜杠開(kāi)始
? 完整的文件的位置路徑
? 可用于任何想指定一個(gè)文件名的時(shí)候 - 相對(duì)路徑名
? 不以斜線開(kāi)始
? 指定相對(duì)于當(dāng)前工作目錄或某目錄的位置
? 可以作為一個(gè)簡(jiǎn)短的形式指定一個(gè)文件名 - 基名:basename
- 目錄名:dirname
- 小技巧,創(chuàng)建刪除特殊的文件
?touch ./-host
?rm -rf ./-host
相關(guān)命令
cd
- 改變目錄
- 使用絕對(duì)或相對(duì)路徑:
? cd /home/fang
? cd home/fang - 切換至父目錄: cd ..
- 切換至當(dāng)前用戶(hù)主目錄: cd
- 切換至以前的工作目錄: cd -
- 選項(xiàng):-P
- 相關(guān)的環(huán)境變量:
? PWD:當(dāng)前目錄路徑
? OLDPWD:上一次目錄路徑
pwd
- printing working directory
? -P 顯示真實(shí)物理路徑軟鏈接的時(shí)候有用到
? -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 目錄遞歸通過(guò)
?ls -lR /etc/ | grep "^-" | wc -l
統(tǒng)計(jì)目錄所有的文件? ls -ld 目錄和符號(hào)鏈接信息
?ls -ld /etc
查看目錄信息? ls -1 文件分行顯示
?ls –S 按從大到小排序
?ls -Sr
按從小到大排序?
ls –t 按mtime排序
? ls –u 配合-t選項(xiàng),顯示并按atime從新到舊排序
? ls –U 按目錄存放順序顯示
? ls –X 按文件后綴排序
stat
-
文件:metadata, data
-
三個(gè)時(shí)間戳:
? access time:訪問(wèn)時(shí)間,atime,讀取文件內(nèi)容
?ls -l 1.file --time=atime
? modify time: 修改時(shí)間, mtime,改變文件內(nèi)容(數(shù)據(jù))
?ls -l 默認(rèn)看到的時(shí)間
? change time: 改變時(shí)間, 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常用選項(xiàng)
? -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是目錄:
? 此時(shí)使用選項(xiàng):-r
? 如果DEST不存在:則創(chuàng)建指定目錄,復(fù)制SRC目錄中所有文件至DEST中;
? 如果DEST存在:
? 如果DEST是文件:報(bào)錯(cuò)
? 如果DEST是目錄:在DEST下新建與原目錄同名的目錄,并將SRC中內(nèi)容復(fù)制至新目錄中
? 示圖
mv
- mv [OPTION]… [-T] SOURCE DEST
- mv [OPTION]… SOURCE… DIRECTORY
- mv [OPTION]… -t DIRECTORY SOURCE…
- 常用選項(xiàng)
? -i: 交互式
? -f: 強(qiáng)制 mv f1 /dir2/f2 底層實(shí)現(xiàn)原理
? 同一分區(qū):Inode節(jié)點(diǎn)編號(hào)跟數(shù)據(jù)存放位置不變,原文件與新文件為同一個(gè)文件
? 不同分區(qū):Inode節(jié)點(diǎn)編號(hào)跟數(shù)據(jù)存放位置發(fā)生變化,原文件與新文件為不同文件ln -s /root/f1 /root/2/f2 底層實(shí)現(xiàn)原理
? 在/root/2/目錄下創(chuàng)建新文件f2、Inode節(jié)點(diǎn)編號(hào)發(fā)生變化
? f2為f1的軟鏈接,訪問(wèn)f2 Inode指針指向f1的數(shù)據(jù)存放位置
rename
-
批量修改文件
? 示例
touch f{1..100}.txt rename "txt" "txt.bak" *.txt rename '.bak' '' *.bak
rm
- rm [OPTION]… FILE…
- 常用選項(xiàng):
? -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:指定顯示的層級(jí)數(shù)目
?tree -d -L 1 /etc
- -P pattern: 只顯示由指定pattern匹配到的路徑
mkdir
- -p: 存在于不報(bào)錯(cuò),且可自動(dòng)創(chuàng)建所需的各目錄
- -v: 顯示詳細(xì)信息
- -m MODE: 創(chuàng)建目錄時(shí)直接指定權(quán)限
rmdir
- -p: 遞歸刪除父空目錄
- -v: 顯示詳細(xì)信息
file
- 文件可以包含多種類(lèi)型的數(shù)據(jù)
- 檢查文件的類(lèi)型,然后確定適當(dāng)?shù)拇蜷_(kāi)命令或應(yīng)用程序使用
- file [options] …
- 常用選項(xiàng):
? -b 列出文件辨識(shí)結(jié)果時(shí),不顯示文件名稱(chēng)
? -f filelist 列出文件filelist中文件名的文件類(lèi)型
? -F 使用指定分隔符號(hào)替換輸出文件名后默認(rèn)的”:”分隔符
? -L 查看對(duì)應(yīng)軟鏈接對(duì)應(yīng)文件的文件類(lèi)型
? --help 顯示命令在線幫助
?hexdump -C -n 100 f1 查看文件2進(jìn)制前100個(gè)字節(jié)
文件通配符
-
* 匹配零個(gè)或多個(gè)字符
-
? 匹配任何單個(gè)字符
-
~ 當(dāng)前用戶(hù)家目錄
-
~ fang 用戶(hù)fang家目錄
-
~ + 當(dāng)前工作目錄
-
~ - 前一個(gè)工作目錄
-
[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] 匹配列表中的
任何的一個(gè)字符
- [^fang] 匹配列表中的所有字符以外的字符
? 預(yù)定義的字符類(lèi)
-
[:digit:]:任意數(shù)字,相當(dāng)于0-9
-
[:lower:]:任意小寫(xiě)字母
-
[:alnum:]:任意數(shù)字或字母
-
[:blank:]:水平空白字符
-
[:space:]:水平或垂直空白字符
-
[:punct:]:標(biāo)點(diǎn)符號(hào)
-
[:print:]:可打印字符
-
[:cntrl:]:控制(非打印)字符
-
[:graph:]:圖形字符
- [:xdigit:]:十六進(jìn)制字符
索引節(jié)點(diǎn)
inode
df -i 查看分區(qū)的節(jié)點(diǎn)使用率
?echo {1..600000}.file | xargs touch
測(cè)試
?Inode節(jié)點(diǎn)使用率100%,會(huì)導(dǎo)致磁盤(pán)有剩余空間、但文件無(wú)法寫(xiě)入
- inode(index node)表中包含文件系統(tǒng)所有文件列表
- 一個(gè)節(jié)點(diǎn) (索引節(jié)點(diǎn))是在一個(gè)表項(xiàng),包含有關(guān)文件的信息( 元數(shù)據(jù) ),包括:
? 文件類(lèi)型,權(quán)限,UID,GID
? 鏈接數(shù)(指向這個(gè)文件名路徑名稱(chēng)個(gè)數(shù))
? 該文件的大小和不同的時(shí)間戳
? 指向磁盤(pán)上文件的數(shù)據(jù)塊指針
? 有關(guān)文件的其他數(shù)據(jù) - inode表結(jié)構(gòu)
? 示圖 - 目錄與inode關(guān)系
? 文件引用的是 inode號(hào)
? 人是通過(guò)文件名來(lái)引用一個(gè)文件
? 一個(gè)目錄是目錄下的文件名和文件inode號(hào)之間的映射
? 示圖 - 節(jié)點(diǎn)編號(hào)
? 獨(dú)立分區(qū)的目錄掛載點(diǎn),Inode節(jié)點(diǎn)編號(hào)一樣
? Centos7 掛截點(diǎn)節(jié)點(diǎn)編號(hào)64
? Centos6 掛載點(diǎn)節(jié)點(diǎn)編號(hào)2
?同一分區(qū)內(nèi)的文件、Inode節(jié)點(diǎn)編號(hào)相同為同一個(gè)文件
- 指針與數(shù)據(jù)塊的關(guān)系
?直接指針的數(shù)量為12個(gè)
? 直接指針可表達(dá)的48k以?xún)?nèi)的容量
? 一個(gè)間接指針可表達(dá)4M的容量
? 間接指針指向一個(gè)4K的數(shù)據(jù)塊,每個(gè)數(shù)據(jù)塊包含1024個(gè)小塊,每塊小塊指向4K的數(shù)據(jù),所以一個(gè)間接指針可表達(dá) 1024X4=4M的數(shù)據(jù)
? 雙重間接指針可表達(dá)4G的容量
? 三級(jí)指針可表達(dá)4T的容量 Inode節(jié)點(diǎn)編號(hào)與目錄的關(guān)系
? 目錄的節(jié)點(diǎn)編號(hào)的指針、所指向的數(shù)據(jù)塊,存放的是它目錄下文件的節(jié)點(diǎn)編號(hào)與文件名稱(chēng)列表
相關(guān)命令與inode索引關(guān)系
cp和inode
- 命令: cp
? 分配一個(gè)空閑的inode號(hào),在inode表中生成新條目
? 在目錄中創(chuàng)建一個(gè)目錄項(xiàng),將名稱(chēng)與inode編號(hào)關(guān)聯(lián)
? 拷貝數(shù)據(jù)生成新的文件
rm和inode
- 命令: rm
? 鏈接數(shù)遞減,從而釋放的inode號(hào)可以被重用
? 把數(shù)據(jù)塊放在空閑列表中
? 刪除目錄項(xiàng)
? 數(shù)據(jù)實(shí)際上不會(huì)馬上被刪除,但當(dāng)另一個(gè)文件使用數(shù)據(jù)塊時(shí)將被覆蓋。
mv和inode
- 如果mv命令的目標(biāo)和源在相同的文件系統(tǒng),作為mv 命令
? 用新的文件名創(chuàng)建對(duì)應(yīng)新的目錄項(xiàng)
? 刪除舊目錄條目對(duì)應(yīng)的舊的文件名
? 不影響inode表(除時(shí)間戳)或磁盤(pán)上的數(shù)據(jù)位置:沒(méi)有數(shù)據(jù)被移動(dòng)! - 如果目標(biāo)和源在一個(gè)不同的文件系統(tǒng), mv相當(dāng)于cp和rm
軟、硬鏈接
硬鏈接
- 創(chuàng)建硬鏈接會(huì)增加額外的記錄項(xiàng)以引用文件
- 對(duì)應(yīng)于同一文件系統(tǒng)上一個(gè)物理文件
- 每個(gè)目錄引用相同的inode號(hào)
創(chuàng)建時(shí)鏈接數(shù)遞增
- 刪除文件時(shí):
? rm命令遞減計(jì)數(shù)的鏈接
? 文件要存在,至少有一個(gè)鏈接數(shù)
? 當(dāng)鏈接數(shù)為零時(shí),該文件被刪除 - 不能跨越驅(qū)動(dòng)器或分區(qū)
- 語(yǔ)法:
? ln filename [linkname ]
?ln file1 file2 本質(zhì)上給file1 起了一個(gè)新的名字 同一個(gè)文件、不同的名字
軟(或符號(hào))鏈接
-
一個(gè)符號(hào)鏈接指向另一個(gè)文件
?軟鏈接本質(zhì)上不是同一個(gè)文件,鏈接文件依賴(lài)原文件
-
ls - l的 顯示鏈接的名稱(chēng)和引用的文件
-
一個(gè)符號(hào)鏈接的內(nèi)容是它引用文件的名稱(chēng)
-
可以對(duì)目錄進(jìn)行
-
可以跨分區(qū)
-
指向的是另一個(gè)文件的路徑;其大小為指向的路徑字符串的長(zhǎng)度;不增加或減目標(biāo)文件inode的引用計(jì)數(shù);
-
語(yǔ)法:
? 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è)備類(lèi)型 #0這個(gè)類(lèi)型的第幾個(gè)設(shè)備
軟鏈接文件的大小由指向文件的字節(jié)數(shù)決定
軟、硬鏈接本質(zhì)區(qū)別
- 軟鏈接本質(zhì)上是一個(gè)新的文件、只是一個(gè)快捷方式,硬鏈接本質(zhì)上是同一個(gè)文件,重新命名了一個(gè)新名稱(chēng)
- 創(chuàng)建軟鏈接不會(huì)增加鏈接數(shù),創(chuàng)建硬鏈接、會(huì)增加文件鏈接數(shù)
- 軟鏈接支持跨分區(qū)、跨設(shè)備、目錄,硬鏈接不支持跨分區(qū)、跨設(shè)備、目錄
- 創(chuàng)建軟鏈接節(jié)點(diǎn)編號(hào)與原始文件節(jié)點(diǎn)編號(hào)不相同。創(chuàng)建硬鏈接,節(jié)點(diǎn)編號(hào)與原始文件節(jié)點(diǎn)編號(hào)相同
- 軟鏈接文件與原始文件有主次之分,軟鏈接文件依賴(lài)原始文件。硬鏈接文件與原始文件關(guān)系平等
練習(xí)
-
顯示/var目錄下所有以l開(kāi)頭,以一個(gè)小寫(xiě)字母結(jié)尾,且中間出現(xiàn)至少一位數(shù)字的文件或目錄
ls /var/l*[0-9]*[[:lower:]]
-
顯示/etc目錄下以任意一位數(shù)字開(kāi)頭,且以非數(shù)字結(jié)尾的文件或目錄
ls /etc/[0-9]*[^0-9]
-
顯示/etc/目錄下以非字母開(kāi)頭,后面跟了一個(gè)字母及其它任意長(zhǎng)度任意字符的文件或目錄
ls -d /etc/[^[:alpha:]][[:alpha:]]*
-
顯示/etc/目錄下所有以rc開(kāi)頭,并后面是0-6之間的數(shù)字,其它為任意字符的文件或目錄
ls -d /etc/rc[0-6]*
-
顯示/etc目錄下,所有以.d結(jié)尾的文件或目錄
ls -d /etc/*.d
-
顯示/etc目錄下,所有.conf結(jié)尾,且以m,n,r,p開(kāi)頭的文件或目錄
ls -d /etc/[mnrp]*.conf
-
只顯示/root下的隱藏文件和目錄
ls -d /root/.*
-
只顯示/etc下的非隱藏目錄
ls -d /etc/*/
-
定義別名命令baketc,每天將/etc/目錄下所有文件,備份到/app獨(dú)立的子目錄下,并要求子目錄格式為 backupYYYY-mm-dd,備份過(guò)程可見(jiàn)
alias baketc='cp -av /etc/ /app/backup$(date +%F)'
-
創(chuàng)建/app/rootdir目錄,并復(fù)制/root下所有文件到該目錄內(nèi),要求保留原有權(quán)限
mkdir /app ; cp -av /root/ /app/rootdir
-
備份/root下所有內(nèi)容(包括隱藏和非隱藏)到/data目錄下
cp -ar /root/. /data
-
如何創(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}
-
如何創(chuàng)建/testdir/dir2/x, /testdir/dir2/y, /testdir/dir2/x/a,/testdir/dir2/x/b
mkdir -pv /testdir/dir2/{x/{a,b},y}
-
如何創(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