知識點小結

一、文件名通配符

*:任意長度任意字符
?: 任意單個字符
~danran:danran用戶家目錄
~+:當前工作目錄
~-:前一個工作目錄
[0-9]:匹配數字范圍,只能匹配一個字符
[a-z]:字母,不分大小寫
[A-Z]:字母,不區分大小寫
[dan]:匹配列表中的任何的一個字符
[^dan]:匹配列表中的所有字符以外的字符
[^]:匹配指定范圍之外的任意單個字符
[]:匹配指定范圍內的任意單個字符
    eg [abc],[a-m],[A-Z],[a-zA-Z],[0-9],[0-9a-zA-Z]
        [:space:]:水平或垂直空白字符
        [:blank:]:水平空白字符
        [:punct:]:標點符號
        [:print:]:可打印字符
        [:lower:]:小寫字母
        [:upper:]:大寫字母
        [:alpha:]:大小寫字母
        [:digit:]:數字
        [:alnum:]:數字和大小寫字母
        [:cntrl:]:控制(非打印字符)
        [:graph:]:圖形字符
        [:xdigit:]:十六進制字符
        # man 7 glob 

二、inode索引節點號

inode (index node )表中包含文件系統所有文件列表
一個節點(索引節點)是在一個表項,包含有關文件的信息(元數據 ),包括:

文件類型,權限,UID ,GID
鏈接數(指向這個文件名路徑名稱個數)
該文件的大小和不同的時間戳
指向磁盤上文件的數據塊指針
有關文件的其他數據
目錄的數據內容就是目錄里面的文件列表,目錄引用的是inode號,也就是目錄下的文件名和文件inode號之間的映射

  • 節點編號是由分區分配的,不是由磁盤分配,在同一個分區中,不會存在相同的節點編號。
  • 節點編號是唯一的。但在不同的分區中,節點編號可以相同
  • 在centos7中,根上的目錄文件的節點號都是64開始,centos6中,根上的目錄文件的節點號為2,/sys、/proc文件在內存中,節點編號為1,節點編號是有限的

當系統節點數被占用完時,再創建新文件會提示報錯,節點編號是可以耗盡的

  • ls -i 查看文件的節點編號
  • df -i 查看磁盤分區上的可用節點號
  • whatch -n1 每秒掃描一次

cp和inode號

分配一個空閑的inode號,在inode表中生成新條目,在目錄中創建一個目錄項,將目錄與inode編號關聯拷貝數據生成新的文件
在同分區移動文件時,僅移動目錄的數據塊信息,如果不是在同一個分區,則需要同事將節點編號和原數據同時移動。
刪除文件時,僅僅是先刪除inode節點號,數據并不會刪除,但在其他文件寫入時,可能會覆蓋占用被刪除節點的數據空間

rm和inode

使用rm命令:
1、鏈接數遞減,從而釋放的inode 號可以被重用
2、把數據塊放在空閑列表中
3、刪除目錄項
4、數據實際上不會馬上被刪除,但當另一個文件使用數據塊時將被覆蓋。

>mv和inode

如果mv 命令的目標和源在相同的文件系統,使用mv命令
1、用新的文件名創建對應新的目錄項
2、刪除舊目錄條目對應的舊的文件名
3、不影響inode 表(除時間戳)或磁盤上的數據位置:沒有數據被移動

如果目標和源在一個不同的文件系統, mv相當于cp 和rm

三、鏈接

硬鏈接

語法 :

ln filename [linkname ]

  • 創建硬鏈接會增加額外的記錄項以引用文件
  • 對應于同一文件系統上一個物理文件
  • 每個目錄引用相同的 inode 號
  • 創建時鏈接數遞增
  • 刪除文件時:

    rm 命令遞減計數的鏈接
    文件要存在,至少有一個鏈接數
    當鏈接數為零時,該文件被刪除

  • 不能跨越驅動器或分區

硬鏈接經常用于將同一個文件放在不同的目錄下,從而便于訪問,多個鏈接所在的空間為一個數據空間

硬鏈接 ln a b       將a文件新建一個鏈接b    

硬鏈接,更改其中一個文件,另一個文件會隨之改變
刪除其中一個文件,另一個文件依然存在,但是鏈接數減一

軟鏈接

語法:

ln -s filename [linkname]

一個符號鏈接指向另一個文件
ls -l:顯示鏈接的名稱和引用的文件
一個符號鏈接的內容是它引用文件的名稱

  • 軟鏈接文件使用不同的inode號,將原文件刪除后,鏈接文件即失效,但是在將一個新文件復制到鏈接原文件路徑下時,鏈接文件恢復正常,跟鏈接的文件內容無關,只能路徑有關。
  • 鏈接文件的大小并不是原文件本身的大小,而是鏈接路徑指向原文件的文件名字符所占字節的大小,即/tmp/dan文件名占八個字節。

軟、硬鏈接的區別

硬鏈接

1、硬鏈接必須在同一個分區中創建,不能跨分區,跨分區只能用軟鏈接
2、硬鏈接不支持對目錄創建,硬鏈接不支持跨設備跨分區
3、不復制原數據,僅分配一個inode號和文件名

4、硬鏈接文件使用同一個inode號   
5、硬鏈接工作的相對路徑相對于當前目錄   
6、鏈接文件沒有依賴性關系,鏈接數會加1   

軟鏈接

1、可以對目錄進行
2、可以跨分區
3、指向的是另一個文件的路徑;其大小為指向的路徑字符串的長度;不增加或減少目標文件inode的引用計數;
4、刪除鏈接原文件,則鏈接指向失效
5、軟鏈接用相對路徑時相對的不是當前工作目錄,而是相對軟鏈接工作路徑

四、重定向

重定向銜接文件,只能導入到文件,管道 | 銜接命令,將輸出導入到命令中
標準輸入輸出

Linux 給程序提供三種I/O 設備

標準輸入(STDIN )-0 默認接受來自鍵盤的輸入
標準輸出(STDOUT )-1 默認輸出到終端窗口
標準錯誤(STDERR )-2 默認輸出到終端窗口

STDOUT 和STDERR 可以被重定向到文件:

命令 操作符號 文件名
支持的操作符號包括:

>  把正確信息輸出重定向到文件   
2> 把錯誤信息輸出重定向到文件   
&> 把所有輸出重定向到文件   

>  文件內容會被覆蓋
>> 原有內容基礎上,追加內容 

set -C: 禁止將內容覆蓋已有文件, 但可追加

強制覆蓋:>|

set +C: 允許覆蓋

在腳本前面添加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

正確信息輸入到/app/all.log文件中,錯誤信息當成正確信息輸入到/app/all,log文件中,也就是把錯誤信息也當做正確信息輸出
2>&1 <=====>|& 互為等價,都是將錯誤的信息轉換為正確的輸出,即沒有錯誤都是正確,全部正確

() :合并多個程序的STDOUT

( cal 2007 ; cal 2008 ) > all.txt

  • 重定向輸入文件
    cat > q.txt

將mail.txt文件中的內容郵件發送給danran用戶
mail -s hello danran < mail.txt 將mail.txt文件中的內容郵件發送給danran用戶,hello為主題

  • 多行重定向:
    使用“<<終止詞”命令從鍵盤把多行重導向給STDIN
    直到 終止詞 位置的所有文本都發送給STDIN,<<終止詞可以任意定義,終止詞必須單獨占用一行

將 danran qqq aaa 輸入到q文件

cat << EOF > q
danran
qqq

aaa
EOF

EOF 為起始輸入端和終止輸入端

五、管道符 |

  • cmd1 | cmd2 將cmd1的標準輸出作為cmd2的標準輸入
  • 可以多級管道,多級管道需確定每一個管道都有標準輸入和標準輸出
  • 管道(使用符號“| ”表示)用來連接命令(傳送給命令)

命令1 | 命令2 | 命令3 | …

將命令1 的STDOUT 發送給命令2 的STDIN ,命令2的 的STDOUT 發送到命令3 的STDIN
STDERR 默認不能通過管道轉發,可利用2>&1 或 |& 實現
最后一個命令會在當前shell 進程的子shell 進程中執行用來

組合多種工具的功能

ls | tr 'a-z' 'A-Z'
less/more:分頁查看輸入

ls -l /etc | lsee/more

mail:通過電子郵件發送輸入

echo “text email” | mail -s “test” user@example.com

lpr:把輸入發送給打印機

echo “test print” | lpr -P priint_name

  • - (將前一個命令的標準輸出做后一個命令的標準輸出,可用作測試)

tar -cvf - /home | tar -xvf -
將home里面的文件打包,但打包得數據不是記錄到文件,而是傳送到stdout,經過管道后,將 tar -cvf - /home 傳送給后面的 tar -xvf - , 后面的這個 - 就是取前一個命令的stdout,因此就不需要臨時使用file了

六、tee:重定向到多個目標

命令1 | tee 文件名 | 命令2

把命令1的STDOUT保存在文件名中,然后管道輸入給命令2或輸出在屏幕上
使用:

保存不同階段的輸出
復雜管道的故障排除
同時查看和記錄輸出

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容