第一部分 文件管理初探
1、Linux系統上各主要目錄的簡介
/ 根,所有文件的起點
├── bin 存放普通用戶可執行的相關二進制程序文件的目錄,不能單獨分區,操作系統啟動時會用到該目錄下的相關程序
├── boot 存放操作系統啟動時的引導程序,以及操作系統內核文件
├── dev 存放設備文件和特殊文件(如字符設備)
├── etc 存放配置文件的目錄
├── home 普通用戶的家目錄默認都在此目錄下
├── lib 存放系統庫和內核模塊文件(/lib/modules)
├── lib64 存放x86_64位系統上共享庫文件
├── media 系統上提供的設備掛載點
├── misc 系統上提供的設備掛載點
├── mnt 系統上提供的設備掛載點
├── opt 第三方應用程序的安裝位置
├── proc 用于輸出內核與進程信息相關的虛擬文件系統
├── root root用戶的家目錄
├── sbin 存放管理員用戶可執行的相關二進制程序文件的目錄,不能單獨分區,操作系統啟動時會用到該目錄下的相關程序
├── selinux selinux相關的安全策略等信息的存儲位置
├── srv 系統上運行的服務用到的數據
├── sys 用于輸出系統上硬件設備相關信息的虛擬文件系統
├── tmp 臨時文件存儲位置
├── usr 第三方軟件的安裝目錄,該目錄下有另一套完整的目錄文件結構,包括有bin、sbin、local、include而local又有bin、sbin等
└── var 保存經常容易變化的數據,如日志、httpd的網頁文件、郵件等相關內容
2、inode的認識總結
個人總結的關于文件系統inode的一些原理:
文件系統在組織文件存儲時,遵循一定的存儲規則。在文件系統創建時,會將底層存儲設備(硬盤)邏輯劃分為一個一個的磁盤(block),一般一個block大小默認為4096個字節,也就是4K,這個值在ext系列文件系統上支持1024、2048、4096,可以在創建文件系統的時候指定(利用mke2fs -b SIZE來指定block大小,一旦指定后,后期不能更改),然后將多個磁盤塊劃分為一個個的塊組,一個分區里面有有多個塊組,但一個分區里面會有一部分block用來存儲整個分區的一些屬性狀態的超級塊,(用tune2fs -l DEVICE可以查看到分區超級塊里面存儲的信息,如分區卷標、分區的特性、掛載時的默認選項、總共有多少inode、總共多少block、每個塊組有多少block、每個塊組有多少inode等信息)。
linxu上文件有兩部分組成,一個是文件的元數據,一個是文件的數據本身,兩部分分開存儲,文件系統劃分出來的磁盤塊有部分用來存儲inode table,有部分用來存儲數據本身,文件的數據至少占據1個block大小,即使數據只有1byte,如果blick大小為4K,那么該文件數據占用的磁盤空間也是4K。inode table里面存儲每每個文件的inode條目,每個條目在在同一個文件系統內部有一個唯一的ID號,一個inode條目記錄一個文件的元數據信息,這些信息包括:該文件的權限、屬主屬組、大小、時間戳(但是inode條目里面是沒有存儲該文件的文件名的,這點要注意,文件名是存儲在目錄文件的數據塊中)。
inode條目還存儲了該文件的數據所在的block的指針信息,也就是該文件數據存在哪個磁盤塊上,一般一個inode條目的指針部分,分為直接指針、間接指針、二重指針、三重指針…直接指針在ext系列文件系統上有12個,一個直接指針指向一個磁盤塊,故利用直接指針可以存儲的數據大小,為4K*12。當數據超過48K時,就需要利用間接指針指向的數據區域來存儲了,所謂間接指針就是inode的數據塊指針指向了一個block塊,但這個block本身存儲的不是文件數據本身,而是存儲的指針信息(在ext文件系統上,一個指針信息占用4字節的空間,故一個block可以有1024個指針信息),然后,由這個block塊里面的指針指向具體文件數據存儲磁盤塊,這樣,利用間接指針可以存儲的文件大小為1024*4K。要存儲的文件超過了間接指針能指向的范圍,則需要用到二重指針,二重指針是指,inode條目里面的指針指向一個block,該block存儲的依然是指針信息,一個指針指向一個block,而被指向的這個block存儲的依然是指針信息,具體是這樣:inode條目–>block(存的是指針)–>block(存的是指針)–>block(存的是文件數據),這樣二重指針所能存儲的文件數據大小就是1024*1024*4K,以此類推。
直接指針:inode條目–>block(存的是文件數據)
間接指針:inode條目–>block(存的是指針)–>block(存的是文件數據)
二重指針:inode條目–>block(存的是指針)–>block(存的是指針)–>block(存的是文件數據)
三重指針:inode條目–>block(存的是指針)–>block(存的是指針)–>block(存的是指針)–>block(存的是文件數據)
利用直接指針能存儲的文件大?。?2*4K
利用間接指針能存儲的文件大?。?*1024*4K (一個inode條目只有1個間接指針)
利用二重指針能存儲的文件大?。?*1024*1024*4K
利用三重指針能存儲的文件大?。?*1024*1024*1024*4K
而對于文件和目錄的存儲,在文件系統存儲時是不一樣的,文件存儲中,數據部分存的是文件本身的數據文件,而目錄文件,數據部分存儲的是目錄下面文件名與該文件的inode號的對應關系
故當我們訪問某個文件時,文件系統內部尋找的過程大致是這樣的:(以尋找/etc/issue為例)
首先找/根,因為根是自啟動的,可以知道自己是在哪個inode上,找到/的inode后,inode指向了/下相應的數據存儲的block,該block內部存儲了/下一級子目錄的名稱和inode對應關系(當然如果/下有直接的文件,那某些數據塊上存儲的就是文件的數據),通過對應關系,就找到了etc所在的inode,然后通過etc的indode,就找到了etc下面的文件和目錄的數據存儲的block,進而找到了issue文件的數據
3、文件類型和軟硬鏈接的介紹
ls -l 中查看到的權限字段的信息中第一位即表示該文件的類型,常見的文件類型有:
– 表示普通文件
d 表示目錄文件
b 表示塊設備文件,如硬盤
c 表示字符設備文件,如/dev/zero、/dev/null、/dev/ramdom
l 表示符號鏈接文件
p 表示管道文件
s 表示socket套接字文件
硬鏈接:多個文件路徑指向的是同一個innod,故通過innod找到的磁盤塊也就是同樣的
特性:
1、目錄不支持硬鏈接
2、硬鏈接不能跨文件系統
3、創建硬鏈接會增加inode引用計數
硬鏈接創建方式:ln 原文件 鏈接文件
軟鏈接:指向一個文件路徑的另一個文件路徑,符號鏈接文件本身的innod中存放磁盤塊指針的位置,不是存的磁盤塊指針,而是指向了另外一個路徑
特性:
1、符號鏈接與文件時兩個各自獨立的文件,各有自己的inode;對原文件創建軟鏈接,不會增加引用計數
2、支持對目錄創建符號鏈接,可以跨文件系統
3、刪除符號鏈接文件不影響原文件,但刪除原文件,符號鏈接指定的路徑即不存在,此時會變成無效的鏈接
4、符號鏈接文件的大小,是其指向的文件的路徑字符串的字節數
軟鏈接創建方式:ln -s 原文件 鏈接文件
注意:創建軟鏈接時,原始文件的路徑要使用絕對路徑,如果要使用相對路徑,則要相對于鏈接文件的路徑,不能是相對于當前工作目錄的相對路徑
4、文件系統相關命令
cd:改變工作目錄
cd /PATH/TO/SOMEDIR 切換到指定目錄
cd 切換回家目錄
cd ~ 切換回自己家目錄
cd ~USERNAME 切換到指定用戶的家目錄(只有管理員才有權限切換到其他用戶的家目錄)
cd – 在上一次所在目錄與當前目錄之間來回切換
PWD 用來記錄當前工作目錄的環境變量
OLDPWD 用來記錄上一次工作目錄的環境變量
ls:列出指定目錄下的內容
語法:ls [OPTION]…[FILE]…
常用選項:
-a 顯示所有文件,包括隱藏文件
-A 顯示除.和..之外的所有文件
-l 長格式列表,表示顯示文件的詳細屬性信息
顯示出來的信息為
-rw-r-x— 2 root root 8827 10月15 20:34 testa.log
-rw-r-x—該文件的文件類型和相應的權限
2 表示文件被硬鏈接的次數
root 表示文件的屬主
root 表示文件的屬組
8827 表示文件的大小
但是如果對ll /dev 該處顯示的是兩個數字,類似brw-rw—-. 1 root cdrom 11, 0 7月13 00:34 sr0
這里的數字前一個表示主設備號,后一個表示次設備號,前一個數字一樣,表示設備類型一樣,后一個數字表示該種設備下的不同的設備
10月15 20:34 表示文件最后一次被修改的時間
-h 表示對文件大小做單位換算,換算后的結果可能為非精確值(1000和1024的區別)
-d 表示僅顯示目錄自身,而不是目錄下面每個文件的屬性,要與-l一起使用,顯示目錄自身的屬性信息
-r ,–reverse 表示顯示時以逆序的方式進行顯示,默認是升序顯示
-R ,–recursive 表示遞歸顯示
ls -ld 目錄和符號鏈接信息
ls -1 文件分行顯示
ls -S 按從大到小排序
ls -u 配合-t,顯示并按atime從新到舊排序
ls -U不排序按目錄存放順序顯示
ls -i 可以顯示文件的inode編號
stat命令:顯示文件或文件系統的狀態,顯示文件的元數據
例如:stat /etc/passwd
顯示大小、innod號,權限、最近一次訪問時間(atime)、最近一次的更改時間(mtime)(改變文件內容),最近一次的改變時間(ctime)(改變文件元數據);
touch命令:改變文件的時間戳(atime、mtime、ctime)
語法:touch [OPTION]…FILE…
touch 以存在的文件,表示改變文件的三個時間戳
touch 不存在的文件,表示新建該文件
touch -a 已存在的文件 表示改變文件的訪問時間atime
touch -m 已存在的文件 表示改變文件的改變時間mtime
-c 表示如果文件不存在,則不創建該文件
-t 時間;表示修改為的時間
例如:touch -m -t 201607211658.20 /tmp/nwc.txt
表示修改/tmp/nwc.txt文件的修改時間為2016年07月21日16點58分20秒
cp命令:文件復制命令
從文件系統存儲級別來理解cp:分配一個空閑的inode號,在inode表中生成一個新的條目,在目錄中創建一個目錄項,將名稱與inode編號關聯,拷貝數據,生成新的文件
語法:
單源復制:cp [OPTION]… [-T] SOURCE DEST
多源復制:cp [OPTION]… SOURCE… DIRECTORY
單源復制:cp [OPTION]… [-T] SOURCE DEST
如果DEST不存在,則事先創建此文件,并復制源文件的數據至DEST中;
如果DEST存在:
如果DEST是非目錄文件,則覆蓋目標文件
如果DEST是目錄文件,則事先在DEST目錄下創建一個與源文件同名的文件,并復制其數據流
多源復制:cp [OPTION]… SOURCE… DIRECTORY
如果DEST不存在:錯誤
如果DEST存在:
如果DEST是常規文件:錯誤
如果DEST是目錄:分別復制每個文件至目標目錄中,并保持原名
常用選項:
-i 覆蓋之前提醒用戶確認,默認cp就帶此選項
-f 強制覆蓋目標文件
-r,-R 遞歸復制目錄及目錄中的內容至目標目錄
-d 復制軟鏈接文件本身,而不是指向的源文件
-a 復制文件時保留文件的全部元數據信息,實現歸檔,可用作備份
–preserv=LIST 指定復制時要保留那些屬性信息
mode:權限
ownership:屬主和屬組
timestamps:時間戳信息
context:安全標簽
xattr:擴展屬性
links:符號鏈接
all:上述所有屬性
mv命令:文件移動命令
(注意:同一個分區的mv操作,只是改了對應目錄文件數據中針對該文件的指針信息,文件自身的inode和數據塊都沒發生改變,但是不同分區之間的mv操作是全部都改掉的)
從文件系統存儲級別來理解mv:如果源和目標在同一個文件系統內部進行mv操作,則對應的操作相當于用新的文件名,創建對應新的目錄項,刪除舊的目錄項及對應的舊的文件名,整個操作不會涉及到文件本身的inode號的改變和數據塊的改變,只會修改inode條目上的時間戳信息,數據塊的內容不會發生移動
如果源和目標不在同一文件系統,則相當于cp和rm的操作
語法:與cp一樣
常用選項 -i、-f
rm命令:刪除文件(建議自己建個目錄文件,把要刪除的文件先mv到此目錄,過段時間后確認不用后,再刪除)
從文件系統存儲級別來理解rm:鏈接數遞減,取消inode與數據block之間的關聯關系,釋放inode號,將數據塊標志為空閑狀態,刪除目錄項。rm命令是不會刪除數據塊中的數據的,只是標記為空閑,讓其他文件的數據可以寫到該數據塊,從而覆蓋掉以前的數據
常用選項:-i、-f、-r
alias 可以顯示當前系統上的命令別名信息
定義命令別名:
alias NAME='COMMAND' 只對當前shell有效,立即生效,重啟后失效
例如 alias cds=‘cd /etc/sysconfig/network-scripts/’
撤銷別名:
umalias NAME
例如 unalias cds
要想永久生效,可定義在/etc/bashrc配置文件中,如果只想對某個用戶永久有效,可以在該用戶家目錄中.bashrc中定義
tree命令 顯示目錄樹
-d 只顯示目錄
-L LEVEL 指定顯示的層級數目
-P PARTEREN 指定顯示通配符的目錄
mkdir 創建目錄
-p 遞歸創建,存在于不報錯,且可以自動創建所需的各目錄
-v 顯示詳細過程
-m MODE 創建目錄時指定權限
mkdir -pv /testdir/dir1/{x,y}/{a,b}
mkdir -pv /testdir/dir2/{x/{a,b},y}
mkdir -pv /testdir/dir{3,4,5/dir{6,7}}
rmdir 刪除空目錄
-p 遞歸刪除父空目錄
-v 顯示詳細信息
file命令
語法file [OPTION] FILENAME
選項:
-b 顯示時不顯示文件名
-f FILE 將需要判斷文件類型的文件寫到一個文件中,用-f指定這個文件,批量判斷文件類型
-F 顯示時用指定的符號作為分隔符,默認是:冒號
-i 顯示出文件的編碼類型
-L 判斷軟鏈接時,默認只顯示軟鏈接文件本身的類型,不顯示原文件的類型,加上-L后,可以顯示出源文件的類型
5、通配符
* 匹配零個或多個任意字符
? 匹配任意單個字符
~ 當前用戶家目錄
~USERNAME 指定用戶家目錄
~+ 當前工作目錄
~- 前一個工作目錄
[0-9] 匹配一個數字范圍
[a-z] 大寫和小寫字母,表示aAbBcC…yYz 不包含大Z
[A-Z] 大寫和小寫字母,表示AbBcC…yYzZ 不包含小a
例如:[a-d]表示匹配 aAbBcCd 不包含大D
但[abcd]則只匹配abcd
[nwc9] 匹配括號內的單個字符
[^nwc9] 匹配除括號內的字符意外的任意單個字符
[[:digit:]] 匹配任意數字,相當于[0-9]
[^[:digit:]] 匹配除數字之外的字符
[[:lower:]] 匹配任意小寫字母
[[:upper:]] 匹配任意大寫字母
[[:alpha:]] 匹配任意大小字母
[[:alnum:]] 匹配任意數字或大小寫字母
[[:space:]] 匹配空格
[[:punct:]] 匹配標點
第二部分 管道和IO重定向
1、標準輸入輸出介紹
linux為程序提供三種I/O設備:
標準輸入(STDIN):0 默認是鍵盤
標準輸出(STDOUT):1 默認是終端窗口屏幕
標準錯誤輸出(STDERR):2 默認是終端窗口屏幕
2、IO重定向
I/O重定向就是將默認標準的輸入、輸出、錯誤輸出定向的別的地方
重定向的方法:命令 重定向操作符 重定向的目標
> 標準輸出重定向,覆蓋目標的內容
>> 標準輸出重定向,將結果追加到目標,不會覆蓋目標的內容
2> 標準錯誤輸出重定向,覆蓋目標的內容
2>> 標準錯誤輸出重定向,將結果追加到目標,不會覆蓋目標的內容
&> 標準輸出和標準錯誤輸出重定向,覆蓋目標的內容
&>> 標準輸出和標準錯誤輸出重定向,將結果追加到目標,不會覆蓋目標的內容
多個命令合并的輸出:
例如:(cal 2015;cal2016)>/testdir/cal.txt
< 輸入重定向
例如:mail -s “help” root</etc/issue
tr ‘a-z’ ‘A-Z’</etc/issue
tr命令:轉換和刪除字符
語法:tr [OPTION]… ‘SET1’ [‘SET2’]
選項:
-c 取字符集的補集
-s 把連續重復的字符,以單個字符表示
tr -s‘\n’ 表示把連續的換行符,變成1個換行符,可實現刪除空白行
-d 刪除SET1匹配到的內容
-t 將SET1的內容轉換成SET2的內容
SET支持的內容格式:
\NNN 八進制值為NNN 的字符(1 至3 個數位)
\\ 反斜杠
\a 終端鳴響
\b 退格
\f 換頁
\n 換行
\r 回車
\t 水平制表符
\v 垂直制表符
字符1-字符2 從字符1 到字符2 的升序遞增過程中經歷的所有字符
[字符*] 在SET2 中適用,指定字符會被連續復制直到吻合設置1 的長度
[字符*次數] 對字符執行指定次數的復制,若次數以 0 開頭則被視為八進制數
[:alnum:] 所有的字母和數字
[:alpha:] 所有的字母
[:blank:] 所有呈水平排列的空白字符
[:cntrl:] 所有的控制字符
[:digit:] 所有的數字
[:graph:] 所有的可打印字符,不包括空格
[:lower:] 所有的小寫字母
[:print:] 所有的可打印字符,包括空格
[:punct:] 所有的標點字符
[:space:] 所有呈水平或垂直排列的空白字符
[:upper:] 所有的大寫字母
[:xdigit:] 所有的十六進制數
[=字符=] 所有和指定字符相等的字符
3、管道
管道(|)用來連接命令,例如:
COMMAND1|COMMAND|COMMAND3…
表示將COMMAND1的輸出作為COMMAND2的輸入,COMMAND的標準輸出作為COMMAND3的輸入
注意:錯誤輸出默認不能通過管道進行發送,如果要發送,可以利用2>&1或|&來實現
第三部分 練習
1、將/etc/issue文件中的內容轉換為大寫后保存至/tmp/issue.out文件中
tr 'a-z' 'A-Z' < /etc/issue >/tmp/issue.out
2、將當前系統登錄用戶的信息轉換為大寫后保存至/tmp/who.out文件中
who|tr 'a-z' 'A-Z' >/tmp/who.out
3、一個linux用戶給root發郵件,要求郵件標題為”help”,郵件正文如下:
Hello, I am 用戶名,the system version is here,pleasehelp me to check it ,thanks!
操作系統版本信息
echo -e "hello,I am `whoami`,The system version is ,please help me to check it,thanks\n`uname -sr`" |mail -s "help" root
4、將/root/下文件列表,顯示成一行,并文件名之間用空格隔開
for i in `ls /root`;do echo -n "$i ";done;echo
5、file1文件的內容為:”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和
i=$((`tr ' ' '+' </testdir/file1`));echo $i
6、刪除Windows文本文件中的'^M'字符
cat -A /testdir/新建文本文檔.txt | tr -d '^M'
7、處理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的數字和空格
echo 'xt.,l 1 jr#!$mn2 c*/fe3 uz4'|tr -d '[:alpha:][:punct:]'
8、將PATH變量每個目錄顯示在獨立的一行
echo $PATH|tr ':' '\n'
9、刪除指定文件的空行
tr -s '\n' '\n' </testdir/f1
10、將文件中每個單詞(字母)顯示在獨立的一行,并無空行
tr -s '\n' '\n' <f1|tr ' ' '\n'
原創文章,作者:M20-1倪文超,如若轉載,請注明出處:http://www.www58058.com/26505