1. 程式人生 > 實用技巧 >Linux檔案管理

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軟連結和硬連結的區別

  1. 本質:

    硬連結:本質是同一個檔案

    軟連結:本質不是同一個檔案

  2. 跨區

    硬連結:不支援

    軟連結:支援

  3. inode

硬連結:相同

軟連結:不同

  1. 連結數

    硬連結:建立新的硬連結,連結數會增加,刪除硬連結,連結數減少

    軟連結:建立或刪除,連結數不會變化

  2. 目錄

    硬連結:不支援

    軟連結:支援

  3. 相對路徑

    硬連結:原始檔案相對路徑是相對於當前工作目錄

    軟連結:原始檔案的相對路徑是相對於連結檔案的相對路徑

  4. 刪除原始檔

    硬連結:只是連結數減一,但連結檔案的訪問不受影響

    軟連結:連結檔案將無法訪問

  5. 檔案型別

    硬連結:和原始檔相同

    軟連結:連結檔案,和原始檔無關