涉及 文件管理;標準I/O和管道;inode
ln 創建鏈接
-d 硬鏈接 相當於文件別名;多個名字 指向同一個inode
在選定位置新建一個文件名,顯示文件大小與源文件相同,但並沒有佔用磁盤空間
只增加了極少量inode數據; A與B都指向硬盤數據block
-s 軟連接 相當於快捷方式;可以跨分區創建;!最好用絕對路徑創建
ls -s /SPATH(原始文件的絕對路徑,或相對路徑;相對於軟鏈接DPATH路徑) /DPATH
會在你選定的位置上生成一個文件,保存了路徑信息; A指向B的路徑
不論是硬鏈結或軟鏈結都 不會將原本的文件數據複製一份,只會佔用非常少量的磁盤空間。
硬鏈接數 = 名字數量
inode索引節點:儲存文件 元信息的區域
每個inode都有一個號碼,Unix/Linux系統內部不使用文件名,而使用inode號碼來識別文件。
當使用rm刪除一個文件時,實際上是刪除了 指向該文件硬盤數據塊的inode信息
目錄(directory)也是一種文件;一個目錄是 目錄下的文件名和 文件inode號之間的映射
inode包含文件的元信息: 可用 stat FILENAME 查看
* 文件的字節數
* 文件擁有者的User ID
* 文件的Group ID
* 文件的讀、寫、執行權限
* 文件的時間戳,共有三個:
ctime指inode上一次變動的時間;
mtime指文件內容上一次變動的時間;
atime指文件上一次打開的時間。
* 鏈接數,即有多少文件名指向這個inode
* 文件數據block的位置
df -i查看每個硬盤分區的inode總數和已經使用的數量
ll -i 查看文件|目錄節點號
dumpe2fs -h /dev/sda# | grep "Inode size" 查看每個inode節點大小 #爲硬盤分區號
注意:
1. 不同分區 的文件可以出現 相同的節點號,每個分區有獨立的inode信息
2. 有時,文件名包含特殊字符,無法正常刪除。
這時,利用find直接刪除inode節點,就能起到刪除文件的作用。
例 find ./PATH -inum INODENUM -exec rm -i {} \;
3. 移動文件或重命名文件,只是改變文件名,不影響inode號碼。
4. 打開一個文件以後,系統就以inode號碼來識別這個文件,不再考慮文件名。
因此通常來說,系統無法從inode號碼得知文件名。
***程序:指令+數據
讀入數據:Input
輸出數據:Output
打開的文件都有一個fd: file descriptor(文件描述符)
/proc/pid/fd 進程所打開的所有文件
Linux給程序提供三種I/O設備
標準輸入(STDIN)-0默認接受來自鍵盤的輸入
標準輸出(STDOUT)-1默認輸出到當前終端窗口
標準錯誤(STDERR)-2默認輸出到終端窗口錯誤信息
I/O重定向:改變默認位置 ls > /dev/pts/0 重定向到另一個終端窗口
STDOUT和STDERR可以被重定向到文件:
命令 操作符號 文件名
操作符號:
> 把STDOUT 重定向到文件[1]>
2>把STDERR 重定向到文件只會重定向錯誤的信息
&>把所有輸出重定向到文件
例 ls /testdir /xxx >r 2>e 把標準輸出 和標準錯誤 分別存放;
可能出現的 既有標準輸出也有標準錯誤情況
*> 重定向到已存在的文件,內容會覆蓋該文件
2>: 覆蓋重定向錯誤輸出數據流;
&>:覆蓋重定向所有輸出
例#cat > filea
zhou
將用戶輸入信息保存至文件
按ctrl+d離開
*>> 原有內容基礎上,追加內容
2>>: 追加重定向錯誤輸出數據流;
&>>:追加重定向所有輸出
*< 重定向標準輸入
tr‘a-z’‘A-Z’</etc/issue 將/etc/issue中的小寫字符都轉換成大寫字符
使用文件來代替鍵盤的輸入
Cat > filea < fileb
將fileb內容覆蓋重定向至filea
*使用“<<終止詞”命令從鍵盤把多行重導向給STDIN 就地文本
知道終止詞位置前的所有信息追加至STDIN
終止詞通常爲EOF,可自定義,結束時必須爲單獨一行純粹終止詞
# set -C: 禁止將內容覆蓋已有文件,但可追加>>
強制覆蓋:>| 刪除重建
# set +C: 允許覆蓋
1.標準輸出和錯誤輸出各自定向 至不同位置:
COMMAND > /path/to/file.out 2> /path/to/error.out
2.合併 標準輸出和 錯誤輸出 至同一個文件:
COMMAND > /path/to/file.out2> &1
COMMAND >> /path/to/file.out2>> &1
2>&1 把輸出信息中的 2標準錯誤 轉化爲 1標準輸出
3.不顯示錯誤信息 /dev/null接收所有數據
find/etc-namepasswd2>/dev/null
4.():合併多個程序的STDOUT
(pwd;ls)>/testdir/aa.log
(cal2007;cal2008)> all.txt
*tr[OPTION]... SET1 [SET2](translate) 轉換和刪除字符
-c或--complerment: 取 輸入 的補集
-d或--delete: 刪除 輸入字符裏的 SET1;
-s或-squeeze-repeats: 合併多個連續重複字符
-t或--truncate-set1: 先刪除第一字符集較第二字符集多出的字符
例tr 'abcd' 'xyz' abcde xyzze !
例tr -t 'abcd' 'xyz' abcde xyzde !
*|管道
將管道前命令的SDOUT 發送給管道後命令的STDIN
STDERR默認不能通過管道轉發,可利用2>&1 或|& 實現
最後一個命令會在當前shell進程的子shell進程
*tee可以同時將輸出信息 重定向至 管道|> 和標準輸出(終端屏幕)
保存不同階段的輸出
複雜管道的故障排除
同時查看和記錄輸出
ls|tee>list.txt
練習:
5、file1文件的內容爲:”1 2 3 4 5 6 7 8 9 10” 計算出所有數字的總和
tr ' ' '+'<file1|bc
55
6、處理字符串“xt.,l 1 jr#!$mn2 c*/fe3 uz4”,只保留其中的數字和空格
echo 'xt.,l 1 jr#bcmn2 c*/fe3 uz4'|tr -d -c [[:digit:]" "]
1 2 3 4
7、將PATH變量每個目錄顯示在獨立的一行
echo $PATH|tr ":" "\n"
/usr/lib64/qt-3.3/bin
/usr/local/sbin
/usr/local/bin
/sbin
/bin
/usr/sbin
/usr/bin
/root/bin
8、刪除指定文件的空行
cat crontab |tr -s "\n"
9、將文件中每個單詞(字母)顯示在獨立的一行,並無空行
cat crontab|tr -s " " "\n" 單詞
10、創建用戶gentoo,附加組爲bin和root,默認shell爲/bin/csh,註釋信息爲"Gentoo Distribution"
useradd gentoo -G bin,root -s shell -c "Gentoo Distribution"
11、創建下面的用戶、組和組成員關係
名字爲admins 的組
groupadd admins
用戶natasha,使用admins 作爲附屬組
useradd natasha -G admins
用戶harry,也使用admins 作爲附屬組
useradd harry -G admins
用戶sarah,不可交互登錄系統,且不是admins 的成員,natasha,harry,sarah密碼都是centos
useradd sarah
echo "centos"|passwd --stdin natasha
echo "centos"|passwd --stdin natasha
usermod -s /sbin/nologin sarah
或者usermod -L sarah 鎖定不讓登陸