1. 程式人生 > >Linux基礎-檔案管理和重定向

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:上一次目錄路徑
  • ~ :當前使用者家目錄
  • ~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中內容填充至新檔案中。
  • cp SRC... DEST

    • SRC...:多個檔案
      • DEST必須存在,且為目錄,其它情形均會出錯;
  • cp SRC DEST

    • SRC是目錄:此時使用選項:-r
      • 如果DEST不存在:則建立指定目錄,複製SRC目錄中所有檔案 至DEST中;
      • 如果DEST存在:
        • 如果DEST是檔案:報錯
        • 如果DEST是目錄
  • 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
  • 連結數(指向這個檔名路徑名稱個數)
  • 該檔案的大小和不同的時間戳
  • 指向磁碟上檔案的資料塊指標
  • 有關檔案的其他資料

11830691-b45e402408acf428.jpg

inode結構表

11830691-056ec985b755059a.png

inode存值形式

11830691-1a24908fb5a0b703.png

根據inode找檔案步驟

檔案引用一個是 inode號

人是通過檔名來引用一個檔案

一個目錄是目錄下的檔名和檔案inode號之間的對映

17. 硬連結和軟連結

詳細說明[https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/inde.html#listing1(https://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/inde.html#listing1 "轉載自IBM部落格")

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(忽略所有)