Linux基礎-檔案管理和重定向
Linux基礎-檔案管理和重定向
2018/7/27 15:00:07
1. 每一個分割槽都是一個獨立存在的檔案系統
2. 目錄:路徑對映符
3. 檔案
檔案有兩種資料
- 元資料:描述資料的資料屬性 metadata
- 資料:data
FHS:檔案系統層級結構標準
4. Linux下的檔案型別
- -:普通檔案
- d:目錄檔案
- b:塊裝置
- c:字元裝置
- l:符號連結檔案
- p:管道檔案pip,FIFO(first in,first out)
- s:套接字檔案:服務加IP埠,作為一個服務的入口。socket
5. 顯示當前路徑
- 每個shell和系統程序都有一個當前的工作目錄
- CWD:current work directory
- 顯示當前shell CWD的絕對路徑
- pwd: printing working directory
- -P 顯示真實物理路徑
- -L 顯示連結路徑(預設)
6. 絕對路徑和相對路徑
絕對路徑:
- 以正斜槓開始
- 完整的檔案的位置路徑
- 可用於任何想指定一個檔名的時候
相對路徑名:
- 不以斜線開始
- 指定相對於當前工作目錄或某目錄的位置
- 可以作為一個簡短的形式指定一個檔名
注:
- 基名:basename
- 目錄名:dirname
7. cd命令
cd 改變目錄
- 使用絕對或相對路徑:
- cd /home/wang/
- cd home/wang
- 切換至父目錄 :cd ..
- 切換至當前使用者主目錄: cd
- 切換至以前的工作目錄: cd -
- 選項:-P
- 相關的環境變數:
- 顯示環境變數:printenv
- PWD:當前目錄路徑
- OLDPWD:上一次目錄路徑
- 顯示環境變數:printenv
- ~ :當前使用者家目錄
- ~mage :使用者mage家目錄
- ~+ :當前工作目錄
- ~- :前一個工作目錄
8. 顯示目錄
- 列出當前目錄的內容或指定目錄(顯示的資料都是元資料)
- 用法:ls [options] [files_or_dirs]
- 示例:
- ls -a :包含隱藏檔案
- ls -l :顯示額外的資訊
- ls -R :目錄遞迴顯示
- ls -ld : 目錄和符號連結資訊
- ls -1 :檔案分行顯示
- ls –S :按從大到小排序
- ls –t : 按mtime排序
- ls –u :配合-t選項,顯示並按atime從新到舊排序
- ls –U : 按目錄存放順序顯示
- ls –X : 按檔案字尾排序
9. 檢視檔案狀態:顯示當前檔案的時間戳
命令:stat
- 檔案:metadata, data
- 三個時間戳:
- access time:訪問時間,atime,讀取檔案內容
- modify time: 修改時間, mtime,改變檔案內容(資料)
- change time: 改變時間, ctime,元資料發生改變
注意:
元資料發生變化,資料不一定變化
資料發生變化,元資料一定變化
10. 檔案萬用字元(對檔名做通配)(glob、globing、wildcard)
- * :匹配零個或多個字元
- ? :匹配任何單個字元
- [0-9] : 匹配數字範圍
- [a-z] :字母
- [A-Z] :字母
- [wang] : 匹配列表中的任何的一個字元
- [^wang] : 匹配列表中的所有字元以外的字元
- 預定義的字元類:(幫助:man 7 glob)
- [:digit:]:任意數字,相當於0-9
- [:lower:]:任意小寫字母
- [:upper:]:任意大寫字母
- [:alpha:]:任意大小寫字母
- [:alnum:]:任意數字或字母
- [:blank:]:水平空白字元
- [:space:]:水平或垂直空白字元
- [:punct:]:標點符號
- [:print:]:可列印字元
- [:cntrl:]:控制(非列印)字元
- [:graph:]:圖形字元
- [:xdigit:]:十六進位制字元
11. touch命令:
touch [OPTION]... FILE...
- -a 僅改變 atime和ctime
- -m 僅改變 mtime和ctime
- -t [[CC]YY]MMDDhhmm[.ss]
指定atime和mtime的時間戳 - -c 如果檔案不存在,則不予建立
例如:
touch -m -t 201806300000.00 /etc/passwd
[[email protected] ~]# stat /etc/passwd
File: `/etc/passwd'
Size: 1677 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 787752 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: (0/ root)
Access: 2018-07-26 18:57:44.311586312 +0800
Modify: 2018-07-25 18:48:32.693647980 +0800
Change: 2018-07-25 18:48:32.693647980 +0800
[[email protected] ~]# touch -m -t 201806300000.00 /etc/passwd
[[email protected] ~]# stat /etc/passwd
File: `/etc/passwd'
Size: 1677 Blocks: 8 IO Block: 4096 regular file
Device: 803h/2051d Inode: 787752 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2018-07-26 18:57:44.311586312 +0800
Modify: 2018-06-30 00:00:00.000000000 +0800
Change: 2018-07-27 14:13:22.439425983 +0800
12. 複製:所謂的複製就是建立一個新的空檔案,然後在將原始檔的數 據流讀出來,然後寫進去。
cp預設不復制目錄下的內容,選項:-r:遞迴複製
1.cp [OPTION]... [-T] SOURCE DEST
2.cp [OPTION]... SOURCE... DIRECTORY
3.cp [OPTION]... -t DIRECTORY SOURCE...(2.3等同)
4.cp SRC DEST
-
SRC是檔案:
- 如果目標不存在:新建DEST,並將SRC中內容填充至DEST中
- 如果目標存在:
- 如果DEST是檔案:將SRC中的內容覆蓋至DEST中。
基於安全,建議為cp命令使用-i選項。 - 如果DEST是目錄:在DEST下新建與原檔案同名的檔案,並 將SRC中內容填充至新檔案中。
- 如果DEST是檔案:將SRC中的內容覆蓋至DEST中。
-
cp SRC... DEST
- SRC...:多個檔案
- DEST必須存在,且為目錄,其它情形均會出錯;
- SRC...:多個檔案
-
cp SRC DEST
- SRC是目錄:此時使用選項:-r
- 如果DEST不存在:則建立指定目錄,複製SRC目錄中所有檔案 至DEST中;
- 如果DEST存在:
- 如果DEST是檔案:報錯
- 如果DEST是目錄
- SRC是目錄:此時使用選項:-r
-
cp的常用選項
-i:覆蓋前提示 –n:不覆蓋,注意兩者順序 -r, -R: 遞迴複製目錄及內部的所有內容 -a: 歸檔,相當於-dR --preserv=all -d:--no-dereference --preserv=links 不復製件,只 複製 連結名 --preserv[=ATTR_LIST] (元資料資訊) mode: 許可權 ownership: 屬主、屬組 timestamp: (時間戳(atime、mtime不變)(cti會變)) links:連結屬性 xattr:拓展屬性 context:保持selinux的安全屬性 all:以上所有 -p: 等同--preserv=mode,ownership,timestamp -v: --verbose 顯示提示資訊 -f: --force 強制 -u:--update 只複製源比目標更新檔案或目標不存在的檔案 --backup=numbered 目標存在,覆蓋前先備份加數字字尾
cp命令中:具體的流程是:
分配一個空閒的inode號,在inode表中生成新條目,在目錄中建立一個目錄項,將名稱inode編號關聯
拷貝資料生成新的檔案。
13. 移動和重新命名檔案
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
mv [OPTION]... -t DIRECTORY SOURCE...
常用選項:
-i: 互動式
-f: 強制
mv操作時,具體的流程是:
如果mv命令的目標和源在相同的檔案系統,作為mv 命令
用新的檔名建立對應新的目錄項,刪除舊目錄條目對應的舊的檔名,不影響inode(除時間戳)或磁碟上的資料位置:沒有資料被移動!
如果目標和源在一個不同的檔案系統, mv相當於cp和rm。
14. 刪除
rm [OPTION]... FILE...
常用選項:
- -i: 互動式
- -f: 強制刪除
- -r: 遞迴
- --no-preserve-root : 強制刪除/目錄,忽略root
示例:
rm -rf /
rm操作時候,具體的邏輯是:
- 連結數遞減,從而釋放的inode號可以被重用
- 把資料塊放在空閒列表中
- 刪除目錄項
- 資料實際上不會馬上被刪除,但當另一個檔案使用資料塊時將被覆蓋。
15. 目錄操作
tree 顯示目錄樹
- -d: 只顯示型別為目錄
- -L level:指定顯示的層級數目
- -P :pattern 只顯示由指定pattern匹配到的路徑
[[email protected] ~]# tree -P *Base* /etc/yum.repos.d/
/etc/yum.repos.d/
└── CentOS-Base.repo
mkdir 建立目錄
- -p: 存在於不報錯,且可自動建立所需的各目錄
- -v: 顯示詳細資訊
- -m MODE: 建立目錄時直接指定許可權
[[email protected] ~]# mkdir -p -v -m 777 /tmp/c
mkdir: created directory `/tmp/c'
[[email protected] ~]#
rmdir 刪除空目錄
- -p: 遞迴刪除父空目錄
- -v: 顯示詳細資訊
- rm -r 遞迴刪除目錄樹
[[email protected] ~]# mkdir -p -v /tmp/x/y/z
mkdir: created directory `/tmp/x'
mkdir: created directory `/tmp/x/y'
mkdir: created directory `/tmp/x/y/z'
[[email protected] ~]# rmdir -p -v /tmp/x/y/z
rmdir: removing directory, `/tmp/x/y/z'
rmdir: removing directory, `/tmp/x/y'
rmdir: removing directory, `/tmp/x'
rmdir: removing directory, `/tmp'
rmdir: failed to remove directory `/tmp': Directory not empty
16. 索引節點
inode(index node)表中包含檔案系統所有檔案列表
一個節點 (索引節點)是在一個表項(inode table),包含有關檔案的資訊( 元資料 包括:
- 檔案型別,許可權,UID,GID
- 連結數(指向這個檔名路徑名稱個數)
- 該檔案的大小和不同的時間戳
- 指向磁碟上檔案的資料塊指標
- 有關檔案的其他資料
inode結構表
inode存值形式
根據inode找檔案步驟
檔案引用一個是 inode號
人是通過檔名來引用一個檔案
一個目錄是目錄下的檔名和檔案inode號之間的對映
17. 硬連結和軟連結
1. 硬連結
- 建立硬連結會增加額外的記錄項以引用檔案
- 對應於同一檔案系統上一個物理檔案
- 每個目錄引用相同的inode號
- 建立時連結數遞增
- 刪除檔案時:
- rm命令遞減計數的連結
- 檔案要存在,至少有一個連結數
- 當連結數為零時,該檔案被刪除
- 不能跨越驅動器或分割槽
- 語法:
ln filename [linkname ]
注意: 目錄不能使用硬連結
2. 軟連結
- 一個符號連結指向另一個檔案
- ls - l的 顯示連結的名稱和引用的檔案
- 一個符號連結的內容是它引用檔案的名稱
- 可以對目錄進行
- 可以跨分割槽
- 指向的是另一個檔案的路徑;其大小為指向的路徑字串的長度;不增 - 加或減目標檔案inode的引用計數;
- 語法:
ln -s filename [linkname]
注意:加粗部分為硬連結和軟連結的核心區別。
18. 確定檔案內容
檔案可以包含多種型別的資料
檢查檔案的型別,然後確定適當的開啟命令或應用程式使用
語法:file [options] <filename>...
常用選項:
- -b 列出檔案辨識結果時,不顯示檔名稱
- -f filelist 列出檔案filelist中檔名的檔案型別
- -F 使用指定分隔符號替換輸出檔名後預設的”:”分隔符
- -L 檢視對應軟連結對應檔案的檔案型別
- --help 顯示命令線上幫助
19. 標準輸入與輸出
-
程式:指令+資料
- 讀入資料:Input
- 輸出資料:Output
-
開啟的檔案都有一個fd: file descriptor (檔案描述符)
-
Linux給程式提供三種I/O裝置
- 標準輸入(STDIN)-0 預設接受來自鍵盤的輸入
- 標準輸出(STDOUT)-1 預設輸出到終端視窗
- 標準錯誤(STDERR)-2 預設輸出到終端視窗
-
I/O重定向:改變預設位置
-
輸入重定向:
[[email protected] ~]# cat > /tmp/luoq.txt <<EOF > woshishui > EOF [[email protected] ~]# cat /tmp/luoq.txt woshishui
20. 把輸出和錯誤重新定向到檔案
- STDOUT和STDERR可以被重定向到檔案
- 命令 操作符號 檔名
- 支援的操作符號包括:
- > 把STDOUT重定向到檔案
- 2> 把STDERR重定向到檔案
- &> 把所有輸出重定向到檔案
[[email protected] ~]# touch /tmp/error.txt;cat /tmp/luo.txt1 2>/tmp/error.txt
[[email protected] ~]# cat /tmp/error.txt
cat: /tmp/luo.txt1: No such file or directory
[[email protected] ~]#
[[email protected] ~]# cat /tmp/luoq.txt &> /tmp/error.txt
[[email protected] ~]# cat /tmp/error.txt
woshishui
[[email protected] ~]# cat /tmp/luoq.txt11 &> /tmp/error.txt
[[email protected] ~]# cat /tmp/error.txt
cat: /tmp/luoq.txt11: No such file or directory
- > 檔案內容會被覆蓋
- set –C 禁止將內容覆蓋已有檔案,但可追加
- >| file 強制覆蓋
- set +C 允許覆蓋
- >> 原有內容基礎上,追加內容
- 2> 覆蓋重定向錯誤輸出資料流
- 2>> 追加重定向錯誤輸出資料流
- 標準輸出和錯誤輸出各自定向至不同位置
COMMAND > /path/to/file.out 2>/path/to/error.out
- 合併標準輸出和錯誤輸出為同一個資料流進行重定向
- &> 覆蓋重定向
- &>> 追加重定向
- COMMAND > /path/to/file.out 2>&1 (順序很重要)
- COMMAND >> /path/to/file.out 2>&1
- ():合併多個程式的STDOUT
- ( cal 2007 ; cal 2008 ) > all.txt
21. tr命令
tr 轉換和刪除字元
- 語法:
tr [OPTION]... SET1 [SET2]
- 選項:
- -c –C --complement:取字符集的補集
- -d --delete:刪除所有屬於第一字符集的字元
- -s --squeeze-repeats:把連續重複的字元以單獨一個字元表示
- -t --truncate-set1:將第一個字符集對應字元轉化為第二字符集對應的字元
- [:alnum:]:字母和數字 [:alpha:]:字母 [:cntrl:]:控制(非列印)字元 [:digit:]:數字 [:graph:]:圖形字元 [:lower:]:小寫字母 [:print:]:可列印字元 [:punct:]:標點符號 [:space:]:空白字元 [:upper:]:大寫字母 [:xdigit:]:十六進位制字元
例如:
tr ‘a-z’ ‘A-Z’< /etc/issue
22. 管道
-
管道(使用符號“|”表示)用來連線命令
-
命令1 | 命令2 | 命令3 | …
- 將命令1的STDOUT傳送給命令2的STDIN,命令2的STDOUT送到命令3的STDIN
- STDERR預設不能通過管道轉發,可利用2>&1 或 |& 實現
- 最後一個命令會在當前shell程序的子shell程序中執行來
- 組合多種工具的功能
- ls | tr 'a-z' 'A-Z'
-
有些命令不支援管道傳輸過來的資料,可以加上 - 執行
23. tee命令,一路輸入兩路輸出
- 命令1 | tee [-a ] 檔名 | 命令2
- 把命令1的STDOUT儲存在檔案中,做為命令2的輸入
- -a 追加
- 使用:
- 儲存不同階段的輸出
- 複雜管道的故障排除
- 同時檢視和記錄輸出
例如:
[[email protected] ~]# cat /etc/passwd | tr -d 'abc' | tr 'd-z' 'D-Z' | tee /tmp/luo.txt
24. selinux:安全Linux策略
- 配置檔案在/etc/selinux/config :
- 檢視狀態的命令:getenforce
- 三種狀態:
- enforcing:強制:違反規則不能執行
- permissive許可:可以允許執行,但是會記錄,用來後期的審計
- disabled:禁用:關閉selinux
- 三種狀態:
25. 歷史命令:history的環境變數配置:
HISTCONTROL
- -ignoredups(忽略重複)
- -ignorespace(忽略空格)
- -ignoreboth(忽略所有)