Linux檔案管理
1.Linux系統目錄結構
1.1目錄及功能
目錄規範參考網站:http://www.pathname.com/fhs/
/bin:使用者基本命令
/sbin:系統管理類命令
/lib:啟動時程式依賴的基本共享庫檔案以及核心模組檔案
/lib64:專用於x86_64系統上的輔助共享庫檔案存放位置
(以上目錄在centos8中變為、usr對應目錄的軟連結)
/usr: the second major section of the filesystem,shareable, read-only data
- bin:可執行命令的主目錄
- sbin:系統管理員專用命令
- lib:32位使用
- lib64:64位系統專用
- share:應用程式資源儲存位置如幫助文件、字型等
- local:第三方應用程式安裝位置
/boot:系統引導檔案存放目錄
/etc:配置檔案目錄
/home:使用者家目錄
/root:管理員家目錄
/media:行動式移動裝置掛載點
/mnt:臨時檔案系統掛載點
/dev:裝置檔案及特殊檔案儲存位置
/opt:第三方應用程式的安裝位置
/tmp:臨時檔案儲存位置
/var:可變資料檔案目錄(日誌,管理資料等)
- cache: 應用程式快取資料目錄
- lib: 應用程式狀態資訊資料
- local:專用於為/usr/local下的應用程式儲存可變資料
- lock: 鎖檔案
- log: 日誌目錄及檔案
- opt: 專用於為/opt下的應用程式儲存可變資料
- run: 執行中的程序相關資料,通常用於儲存程序pid檔案
- spool: 應用程式資料池
- tmp: 儲存系統兩次重啟之間產生的臨時資料
/proc: 用於輸出核心與程序資訊相關的虛擬檔案系統
/sys:用於輸出當前系統上硬體裝置相關資訊虛擬檔案系統
/selinux: security enhanced Linux,selinux相關的安全策略等資訊的儲存位置
1.2檔案型別及組成
每個檔案都有兩類相關資料:元資料:metadata,即屬性, 資料:data,即檔案內容
1.2.1 檔案組成
-:表示普通檔案
d:目錄檔案
b:塊裝置檔案(以塊為單位如磁碟,U盤等裝置)
c:字元裝置(以字元為單位,並按一定的順序進行輸入輸出,如滑鼠鍵盤等裝置)
l:連結檔案(可以簡單理解為windows中的軟連結)
p:管道檔案(特殊檔案型別,主要是為了實現程序間的通訊,採用半雙工通訊)
s:套接字檔案socket:(全雙工通訊,通常用於基於網路的資料通訊)
2.檔案操作命令
2.1 pwd
pwd:檢視使用者當前所在目錄
- -L 顯示連結路徑(預設)
- -P 顯示真實物理路徑
[root@centos8 bin]# ll /bin
lrwxrwxrwx. 1 root root 7 May 11 2019 /bin -> usr/bin
[root@centos8 bin]# pwd -L
/bin
[root@centos8 bin]# pwd -P
/usr/bin
2.2基名字和目錄名
基名:basename,路徑只取檔名
目錄名:dirname,路徑只取路徑
[root@centos8 bin]# basename /etc/sysconfig/network
network
[root@centos8 bin]# dirname !*
dirname /etc/sysconfig/network
/etc/sysconfig
2.3 cd
cd: cd [-L|[-P [-e]] [-@]] [dir]
Change the shell working directory.
快捷用法
- 切換至父目錄 cd ..
- 切換至當前工作目錄 cd .
- 切換至上一次工作目錄 cd -
注意:這裡上一次工作目錄是儲存在OLDPWD變數當中的,所以只能切換到上一次工作目錄,而無法返回再往前的目錄
[root@centos8 bin]# cd /
[root@centos8 /]# echo $OLDPWD
/bin
[root@centos8 /]# cd -
/bin
2.4 ls
ls :列出當前目錄內容或指定目錄內容
SYNOPSIS
ls [OPTION]... [FILE]...
常用選項
- -a 列出所有檔案,包括隱藏檔案
- -l 顯示更為詳細的資訊
- -R 遞迴展示目錄
- -d 展示目錄而不顯示目錄的內容
- -s 按照大小排序
- -t 按照mtime排序
說明:
ls 檢視不同字尾檔案時的顏色由 /etc/DIR_COLORS 和@LS_COLORS變數定義
ls是'ls --color=auto'別名
[root@centos8 etc]# ls -ld /etc/
drwxr-xr-x. 78 root root 8192 Dec 6 06:19 /etc/
2.5 stat
stat:顯示檔案或檔案系統的狀態
檔案三個時間戳及其含義:
- atime 訪問時間,如執行讀取檔案操作可以改變訪問時間
- mtime 修改時間 ,如利用vim修改檔案時時間會發生改變
- ctime 改變時間,元資料(檔案屬性)發生改變時
[root@centos8 ~]# stat ls
File: ls
Size: 116 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 201327540 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Context: unconfined_u:object_r:admin_home_t:s0
Access: 2020-11-29 22:04:36.787356892 +0800
Modify: 2020-11-29 22:04:36.787356892 +0800
Change: 2020-11-29 22:04:36.787356892 +0800
Birth: -
#使用ll就能檢視到檔案的元資料
[root@centos8 ~]# ll
-rw-------. 1 root root 1548 Nov 21 03:24 anaconda-ks.cfg
-rw-r--r--. 1 root root 0 Dec 7 05:01 lx.txt
#許可權 引用計數 所有者和所屬組 大小 修改時間 檔名
2.6 file
file:判斷檔案型別
file [options] <filename>...
常用選項:
- -b 只顯示判斷的檔案型別,不顯示檔名
- -f 判斷檔案File中檔名的型別
- -F 使用指定分隔符號替換輸出檔名後預設的”:”分隔符
- -L 檢視對應軟連結對應檔案的檔案型別
[root@centos8 ~]# cat lx.txt
/root/lx.txt
/root/ls
/etc/sysconfig
[root@centos8 ~]# file -f lx.txt
/root/lx.txt: ASCII text
/root/ls: ASCII text
/etc/sysconfig: directory
[root@centos8 ~]# file -L /bin/
/bin/: directory
[root@centos8 ~]# file /bin
/bin: symbolic link to usr/bin
注意:windows檔案系統和linux是不同的,即使windows文字格式檔案在linux系統中以16進位制檢視所顯示內容也是有區別的,所以儘量不要在Linux系統中使用windows的檔案,如要使用也最好進行檔案轉換
[root@centos8 data]#cat linux.txt
a
b
c
[root@centos8 data]#cat win.txt
a
b
c[root@centos8 data]#file win.txt linux.txt
win.txt: ASCII text, with CRLF line terminators
linux.txt: ASCII text
[root@centos8 data]#hexdump -C linux.txt
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
[root@centos8 data]#hexdump -C win.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
#安裝轉換工具
[root@centos8 data]#dnf -y install dos2unix
#將Windows的文字格式轉換成的Linux文字格式
[root@centos8 data]#dos2unix win.txt
dos2unix: converting file win.txt to Unix format...
[root@centos8 data]#file win.txt
win.txt: ASCII text
#將Linux的文字格式轉換成Windows的文字格式
[root@centos8 data]#unix2dos win.txt
unix2dos: converting file win.txt to DOS format...
[root@centos8 data]#file win.txt
win.txt: ASCII text, with CRLF line terminators
轉換檔案字符集編碼
#顯示支援字符集編碼列表
[root@centos8 ~]#iconv -l
#windows10上文字預設的編碼ANSI(GB2312)
[root@centos8 data]#file windows.txt
windows.txt: ISO-8859 text, with no line terminators
[root@centos8 data]#echo $LANG
en_US.UTF-8
#預設在linux無法正常顯示文字內容
[root@centos8 data]#cat windows11.txt
▒▒▒▒▒▒[root@centos8 data]#
#將windows10上文字預設的編碼ANSI(GB2312)轉換成UTF-8
[root@centos8 data]#iconv -f gb2312 windows.txt -o windows1.txt
[root@centos8 data]#cat windows1.txt
123[root@centos8 data]#ll windows1.txt
-rw-r--r-- 1 root root 12 Mar 23 10:13 windows1.txt
[root@centos8 data]#file windows1.txt
windows1.txt: UTF-8 Unicode text, with no line terminators
#將UTF-8轉換成windows10上文字預設的編碼ANSI(GB2312)
[root@centos8 data]#iconv -f utf8 -t gb2312 windows1.txt -o windows11.txt
[root@centos8 data]#file windows11.txt
windows11.txt: ISO-8859 text, with no line terminators
示例
#將windows10上文字預設的編碼ANSI(GB2312)轉換成UTF-8
[15:34:50 root@centos8 ~]#iconv -f gb2312 win.txt -o win2.txt
[15:34:50 root@centos8 ~]#file linux.txt
linux.txt: ASCII text
[15:34:31 root@centos8 ~]#file windows.txt
windows.txt: ASCII text, with CRLF line terminators
#將windows的文字格式轉換成Linux的文字格式
[15:35:26 root@centos8 ~]#dos2unix windows.txt
dos2unix: converting file windows.txt to Unix format...
[15:36:00 root@centos8 ~]#file windows.txt
windows.txt: ASCII text
示例
[root@centos8 ~]#cat list.txt
/etc/
/bin
/etc/issue
[root@centos8 ~]#file -f list.txt
/etc/: directory
/bin: symbolic link to usr/bin
/etc/issue: ASCII text
2.7萬用字元
用來匹配符合條件的檔案
常見的萬用字元
* 匹配零個或多個字元,但不匹配 "." 開頭的檔案,即隱藏檔案
? 匹配任何單個字元
~ 當前使用者家目錄
~user 使用者user家目錄
~+和. 當前工作目錄
~- 前一個工作目錄
[0-9] 匹配數字範圍
[a-z] 匹配小寫字母範圍
[A-Z] 匹配大寫字母範圍
[number] 匹配列表中的任何的一個字元
[^number] 匹配列表中的所有字元以外的字元
系統中預定義的字元類:man 7 glob
[:digit:]:任意數字,相當於0-9
[:lower:]:任意小寫字母,表示 a-z
[:upper:]: 任意大寫字母,表示 A-Z
[:alpha:]: 任意大小寫字母
[:alnum:]:任意數字或字母
[:blank:]:水平空白字元
[:space:]:水平或垂直空白字元
[:punct:]:標點符號
[:print:]:可列印字元
[:cntrl:]:控制(非列印)字元
[:graph:]:圖形字元
[:xdigit:]:十六進位制字元
2.8 touch
touch:建立空檔案和改變檔案時間
touch [OPTION]... FILE...
選項:
- -a 僅改變 atime和ctime
- -m 僅改變 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的時間戳
- -c 如果檔案不存在,則不予建立
#touch命令最常用的用法就是用來建立空檔案
[root@centos8 data]#touch `date -d "-1 day" +%F_%T`.log
[root@centos8 data]#ll
-rw-r--r-- 1 root root 0 Dec 6 22:00 2020-12-05_22:00:15.log
[root@centos8 data]#touch $(date -d "1 year" +%F_%T).log
[root@centos8 data]#ll
-rw-r--r-- 1 root root 0 Dec 6 22:00 2021-12-06_22:00:38.log
2.9 cp
cp:複製檔案或目錄
cp [OPTION]... [-T] SOURCE DEST
cp [OPTION]... SOURCE... DIRECTORY
cp [OPTION]... -t DIRECTORY SOURCE...
alias cp='cp -i'
常用選項
- -a 歸檔,相當於-dR --preserv=all,常用於備份功能
- -i 如果目標已存在,覆蓋前提示是否覆蓋
- -r, -R 遞迴複製目錄及內部的所有內容
- -b 目標存在,覆蓋前先備份,預設形式為 filename~ ,只保留最近的一個備份
- --backup=numbered 目標存在,覆蓋前先備份加數字字尾,形式為 filename.# ,可以保留多 個版本
- -v 顯示覆制過程
#複製檔案
[root@centos8 /]# cp -a /root/lx.txt /data/
[root@centos8 /]# ls /data/
lx.txt
#複製目錄
[root@centos8 /]# cp -r /etc/sysconfig/ /data
[root@centos8 /]# ll /data/
total 8
-rw-r--r-- 1 root root 253 Dec 6 21:55 lx.txt
drwxr-xr-x 6 root root 4096 Dec 6 22:15 sysconfig
2.10 mv
mv:對檔案或目錄進行移動和改名
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用選項
- -i 互動式
- -f 強制
- -b 目標存在,覆蓋前先備份
使用rename可以完成對檔案的批量改名
SYNOPSIS
rename [options] expression replacement file...
[root@centos8 data]# ls
file10.txt file2.txt file4.txt file6.txt file8.txt lx.txt
file1.txt file3.txt file5.txt file7.txt file9.txt sysconfig
[root@centos8 data]# rename '.txt' '' *.txt
[root@centos8 data]# ls
file1 file10 file2 file3 file4 file5 file6 file7 file8 file9 lx sysconfig
[root@centos8 data]#
2.11 rm
rm:刪除檔案或目錄
rm [OPTION]... [FILE]...
常用選項
- -i 互動式
- -f 強制刪除
- -r 遞迴
刪除特殊檔案:-f
1.rm -- -foo
2.rm ./-foo
[root@centos8 data]# touch ./-f
[root@centos8 data]# ls
-f
[root@centos8 data]# rm -rf -- -f
使用shred可以對磁碟驚醒覆蓋,從而徹底刪除檔案
2.12 目錄命令
2.12.1 tree:顯示目錄樹
常用選項
- -d: 只顯示目錄
- -L level:指定顯示的層級數目
- -P pattern: 只顯示由指定wild-card pattern匹配到的路徑
2.12.2 mkdir
mkdir:建立目錄
常用選項:
- -v: 顯示詳細資訊
2.12.3 rmdir
rmdir:刪除空目錄,使用較少
3.EXT檔案系統和連結
3.1檔案系統組成
3.1.1 superblock
superblock:記錄檔案系統整體資訊,如inode/block的總量、使用量、剩餘及檔案系統格式等資訊
3.1.2 inode結構
inode塊中儲存的是檔案的屬性資訊,包括以下內容
- inode number 節點號
- 檔案型別
- 許可權
- UID
- GID
- 連結數
- 檔案大小和atime、ctime、mtime
- 檔案內容的真正位置
- 其他檔案相關資料
3.1.3 目錄
目錄是個特殊檔案,檔案系統會分配一個 inode 與至少一個 block 給目錄。其中,inode 記錄目錄相關許可權與屬性,和可分配到的block塊的號碼; 而 block 則是記錄在這個目錄下的檔名佔用的inode number節點號。
cp和inode
- 分配一個空閒的inode號,在inode表中生成新條目
- 在目錄中建立一個目錄項,將名稱與inode編號關聯
- 拷貝資料生成新的檔案
rm和inode
- 連結數遞減,從而釋放的inode號可以被重用
- 把資料塊放在空閒列表中
- 刪除目錄項
- 資料實際上不會馬上被刪除,但當另一個檔案使用資料塊時將被覆蓋
mv和inode
-
如果mv命令的目標和源在相同的檔案系統,作為mv 命令
用新的檔名建立對應新的目錄項
刪除舊目錄條目對應的舊的檔名
不影響inode表(除時間戳)或磁碟上的資料位置:沒有資料 被移動!
-
如果目標和源在一個不同的檔案系統, mv相當於cp和rm
3.2硬連結
硬連結本質上就給一個檔案起一個新的名稱,實質是同一個檔案
硬連結特性
- 建立硬連結會在對應的目錄中增加額外的記錄項以引用檔案
- 對應於同一檔案系統上一個物理檔案
- 每個目錄引用相同的inode號
- 建立時連結數遞增
- 刪除檔案時:rm命令遞減計數的連結,檔案要存在,至少有一個連結數,當連結數為零時,該文 件被刪除
- 不能跨越驅動器或分割槽
- 不支援對目錄建立硬連結
為什麼不能硬連結目錄
連結目錄時會多出一個.,而.又會讓目錄產生一個新的連結,這會導致錯誤迴圈問題
ln [OPTION]... TARGET... DIRECTORY
3.3符號 symbolic (或軟 soft)連結
一個符號連結指向另一個檔案,就像 windows 中快捷方式,軟連結檔案和原檔案本質上不是同一個檔案
軟連結特點
- 可以對目錄建立軟連結
- 可以跨分割槽的檔案實現
- 軟連結如果使用相對路徑,是相對於原檔案的路徑,而非相對於當前目錄
- 指向的是另一個檔案的路徑;其大小為指向的路徑字串的長度;不增加或減少目標檔案inode的 引用計數
- 一個符號連結的內容是它引用檔案的名稱
3.4軟連結和硬連結的區別
-
本質:
硬連結:本質是同一個檔案
軟連結:本質不是同一個檔案
-
跨區
硬連結:不支援
軟連結:支援
-
inode
硬連結:相同
軟連結:不同
-
連結數
硬連結:建立新的硬連結,連結數會增加,刪除硬連結,連結數減少
軟連結:建立或刪除,連結數不會變化
-
目錄
硬連結:不支援
軟連結:支援
-
相對路徑
硬連結:原始檔案相對路徑是相對於當前工作目錄
軟連結:原始檔案的相對路徑是相對於連結檔案的相對路徑
-
刪除原始檔
硬連結:只是連結數減一,但連結檔案的訪問不受影響
軟連結:連結檔案將無法訪問
-
檔案型別
硬連結:和原始檔相同
軟連結:連結檔案,和原始檔無關