Linux文件管理
1 文件系統(tǒng)目錄結(jié)構(gòu)
1.1 文件系統(tǒng)目錄結(jié)構(gòu)
- 文件和目錄被組織成一個單根倒置樹結(jié)構(gòu)
- 文件系統(tǒng)從根目錄下開始, 用"/"表示
- 根文件系統(tǒng)(rootfs): root filesystem
- 標(biāo)準(zhǔn)Linux文件系統(tǒng)(如: ext4), 文件名稱大小寫敏感
- 以.開頭的為隱藏文件
- 路徑分隔符為/
- 文件名最長255個字節(jié)
- 包含路徑在內(nèi), 文件名稱最長4095個字節(jié)
- 藍色: 目錄, 綠色: 可執(zhí)行文件, 紅色: 壓縮文件, 淺藍色: 鏈接文件, 灰色: 其他文件
- 文件名和目錄名: 除了斜杠和NUL, 所有字符都有效. 但使用特殊字符的目錄名和文件名不推薦使用, 有些字符需要用引號來引用
- Linux的文件系統(tǒng)分層結(jié)構(gòu): FHS
Linux文件中看到的數(shù)據(jù)有兩種存儲方式:
因為Linxu一切接文件, 所以在系統(tǒng)中看到的文件和數(shù)據(jù)可能是內(nèi)存數(shù)據(jù)和文件, 也可能是硬盤數(shù)據(jù)和文件
外存-硬盤文件-存儲器-輔助存儲
內(nèi)存-主存儲器
1.2 常見的文件系統(tǒng)目錄功能
- bin 二進制程序
- boot 引導(dǎo)程序 - 內(nèi)核
- dev 設(shè)備
- etc 配置文件
- home 用戶數(shù)據(jù)
- root 根用戶數(shù)據(jù)
- run 運行臨時數(shù)據(jù)
- sbin 管理員運行程序
- tmp 臨時目錄
- usr 操作系統(tǒng)相關(guān)文件, 小Linux系統(tǒng)
- var 變化數(shù)據(jù), 日志
1.3 應(yīng)用程序的組成部分
1.4 CentOS7以后版本目錄結(jié)構(gòu)變化
Centos7以后, 兩個存放內(nèi)容相同的目錄, 會被做成軟鏈接形式:
/bin->/usr/bin
/sbin->/usr/sbin
/lib->/usr/lib
/lib64->/usr/lib64
1.5 Linux下的文件類型
- -: 普通文件
- d: 目錄文件Directory
- b: 塊設(shè)備Block, 以塊的方式進行數(shù)據(jù)讀寫, 典型的就是磁盤設(shè)備
- c: 字符設(shè)備Character, 以字符的方式進行讀寫, 比如鍵盤設(shè)備
- l: 符號鏈接文件Link
- p: 管道文件Pipe, 實現(xiàn)兩個進程間互相通訊, 但是是單項通訊, 一個程序發(fā)一個程序讀, 兩個程序不能同時讀或者發(fā)
- s: 套接字文件Socket, 實現(xiàn)兩個進程間雙向通訊, 兩個進程可以同時進行讀和寫
2 文件操作命令
2.1 顯示當(dāng)前工作目錄
每個Shell和系統(tǒng)進程都有一個當(dāng)前的工作目錄: Current Working Directory
顯示當(dāng)前所在目錄命令: pwd
[22:17:41 root@demo-c8 ~]#pwd
/root
2.2 絕對路徑和相對路徑
絕對路徑: 從根/開始描述
相對路徑: 從當(dāng)前工作目錄開始描述
2.3 更改目錄
- 切換到某一個用戶的家目錄
cd ~USERNAME
- 回到自己的家目錄
cd
- 回到上一個目錄
# 只能回到上一個目錄, 上一次目錄記錄在OLDPWD變量, 當(dāng)前目錄記錄在PWD變量
cd -
[20:32:16 root@Anabile-1 /]#cd root
[20:32:25 root@Anabile-1 ~]#echo $PWD
/root
[20:32:29 root@Anabile-1 ~]#echo $OLDPWD
/
[20:32:32 root@Anabile-1 ~]#cd -
/
[20:32:56 root@Anabile-1 /]#cd -
/root
[20:32:57 root@Anabile-1 ~]#cd -
/
- 進入當(dāng)前位置的上一級目錄
[22:37:07 root@demo-c8 ~]#cd /etc/profile.d
[22:37:14 root@demo-c8 /etc/profile.d]#cd ..
[22:37:15 root@demo-c8 /etc]#cd ..
[22:37:16 root@demo-c8 /]#cd ..
[22:37:17 root@demo-c8 /]#cd ..
[22:37:20 root@demo-c8 /]# # 最外層就是/目錄
- 進入當(dāng)前目錄
cd .
當(dāng)前目錄用.表示, 上層目錄用..表示
basename: 只取文件名
dirname: 只取文件所在的目錄, 從/開始取
basename+dirname即為一個文件的完整路徑
[20:26:39 root@Anabile-1 ~]#basename /root/anaconda-ks.cfg
anaconda-ks.cfg
[20:29:38 root@Anabile-1 ~]#dirname /root/anaconda-ks.cfg
/root
2.4 列出目錄內(nèi)容
常見選項:
-R: 目錄遞歸, 默認(rèn)只顯示當(dāng)前目錄內(nèi)的內(nèi)容, 遞歸后, 會進入到每個目錄, 進行數(shù)據(jù)顯示
-1: 讓文件名分行顯示, ls -1
-S: 按照文件大小, 從大到小排序, -r -S, 從小到大排序
-t: 按照mtime排序, 默認(rèn)從新到舊
-u: 配合-t選項, 按照atime時間, 從新到舊排序
-U: 按照目錄存放順序排序
-X: 按照文件后綴排序
-r: 按照默認(rèn)順序的反向順序排序
- ls: 僅列出文件名, 不包含隱藏文件
anaconda-ks.cfg.bak Desktop Downloads Music Public test.txt Videos
asicc.txt.txt Documents initial-setup-ks.cfg Pictures Templates 't.txt'$'\033'':Q!'
- ls -l: 列出文件詳細(xì)信息
[22:44:01 root@demo-c8 ~]#ls -l
total 28
-rw-------. 1 root root 1385 Aug 15 17:06 anaconda-ks.cfg.bak
-rw-r--r--. 1 root root 7 Aug 17 12:02 asicc.txt.txt
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Desktop
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Documents
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Downloads
-rw-r--r--. 1 root root 1495 Aug 15 17:17 initial-setup-ks.cfg
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Music
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Pictures
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Public
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Templates
-rw-r--r--. 1 root root 6 Aug 17 11:55 test.txt
-rw-r--r--. 1 root root 8233 Aug 17 11:54 't.txt'$'\033'':Q!'
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Videos
- ls -l: 顯示的是文件的修改時間modify
- 一個文件的三個時間屬性
modify time(mtime): 內(nèi)容更改
access time(atime):讀文件
change time(ctime):屬性,元數(shù)據(jù)變化
- 顯示文件的某個時間
ls -l --time=atime FILE
ls -l --time=mtime FILE
ls -l --time=ctime FILE
[20:36:54 root@Anabile-1 ~]#ls -l --time=atime anaconda-ks.cfg # atime
-rw-------. 1 root root 1412 Aug 13 20:36 anaconda-ks.cfg
[20:36:58 root@Anabile-1 ~]#ls -l anaconda-ks.cfg # 默認(rèn)顯示mtime
-rw-------. 1 root root 1412 Aug 12 14:06 anaconda-ks.cfg
- 只顯示隱藏文件: l.
[20:37:46 root@Anabile-1 ~]#l. # l.是別名
. .ansible .bash_history .bash_profile .cshrc .tcshrc .vimrc
.. .ansible-console_history .bash_logout .bashrc .ssh .viminfo .vimrc.0
[20:38:25 root@Anabile-1 ~]#alias l.
alias l.='ls -d .* --color=auto'
- 顯示所有文件, 包含隱藏文件
[22:44:16 root@demo-c8 ~]#ls -a
. asicc.txt.txt .bash_profile .config Desktop .esd_auth .lesshst Pictures .tcshrc 't.txt'$'\033'':Q!' .Xauthority
.. .bash_history .bashrc .cshrc Documents .ICEauthority .local .pki Templates Videos
anaconda-ks.cfg.bak .bash_logout .cache .dbus Downloads initial-setup-ks.cfg Music Public test.txt .viminfo
- ls -d DIRECTORY vs ls -l DIRECTORY
-d: 顯示目錄本身信息, 配合通配符時, -d只會顯示目錄這一層, 不會繼續(xù)顯示子目錄的內(nèi)容
-l: 顯示目錄內(nèi)部的文件內(nèi)容信息
-ld: 顯示目錄本身詳細(xì)信息
[22:51:01 root@demo-c8 ~]#ls .config # .config是一個隱藏目錄
dconf evolution gconf gnome-initial-setup-done gnome-session goa-1.0 gtk-3.0 ibus pulse user-dirs.dirs user-dirs.locale yelp
[22:51:05 root@demo-c8 ~]#ls -d .config
.config
[22:51:13 root@demo-c8 ~]#ls -l .config
total 16
drwxr-xr-x. 2 root root 18 Aug 15 17:25 dconf
drwx------. 3 root root 21 Aug 15 17:19 evolution
drwx------. 2 root root 6 Aug 15 17:19 gconf
-rw-r--r--. 1 root root 3 Aug 15 17:21 gnome-initial-setup-done
drwx------. 3 root root 27 Aug 15 17:19 gnome-session
drwxr-xr-x. 2 root root 6 Aug 15 17:19 goa-1.0
drwx------. 2 root root 23 Aug 15 17:19 gtk-3.0
drwx------. 3 root root 17 Aug 15 17:16 ibus
drwx------. 2 root root 4096 Aug 15 17:19 pulse
-rw-------. 1 root root 633 Aug 15 17:19 user-dirs.dirs
-rw-r--r--. 1 root root 5 Aug 15 17:19 user-dirs.locale
drwxr-xr-x. 2 root root 22 Aug 15 17:21 yelp
[22:51:23 root@demo-c8 ~]#ls -ld .config
drwx------. 11 root root 215 Aug 15 17:21 .config
- ls -Sla: 把目錄內(nèi)的所有文件和目錄按照大小排序, 默認(rèn)從大到小
[22:51:28 root@demo-c8 ~]#ls -Sla
total 84
-rw-r--r--. 1 root root 8233 Aug 17 11:54 't.txt'$'\033'':Q!'
-rw-------. 1 root root 8090 Aug 17 21:43 .viminfo
-rw-------. 1 root root 7275 Aug 17 21:43 .bash_history
dr-xr-x---. 15 root root 4096 Aug 17 21:43 .
-rw-r--r--. 1 root root 1495 Aug 15 17:17 initial-setup-ks.cfg
-rw-------. 1 root root 1385 Aug 15 17:06 anaconda-ks.cfg.bak
-rw-------. 1 root root 310 Aug 15 17:19 .ICEauthority
dr-xr-xr-x. 18 root root 236 Aug 17 10:15 ..
drwx------. 10 root root 230 Aug 15 17:21 .cache
-rw-r--r--. 1 root root 224 Aug 16 21:14 .bashrc
-rw-r--r--. 1 root root 216 Aug 17 19:05 .bash_profile
drwx------. 11 root root 215 Aug 15 17:21 .config
-rw-r--r--. 1 root root 129 May 11 2019 .tcshrc
-rw-r--r--. 1 root root 100 May 11 2019 .cshrc
-rw-------. 1 root root 58 Aug 16 21:52 .Xauthority
-rw-------. 1 root root 37 Aug 17 20:00 .lesshst
drwx------. 3 root root 25 Aug 15 17:16 .dbus
drwx------. 3 root root 19 Aug 15 17:19 .local
drwxr-----. 3 root root 19 Aug 15 17:19 .pki
-rw-r--r--. 1 root root 18 May 11 2019 .bash_logout
-rw-------. 1 root root 16 Aug 15 17:19 .esd_auth
-rw-r--r--. 1 root root 7 Aug 17 12:02 asicc.txt.txt
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Desktop
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Documents
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Downloads
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Music
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Pictures
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Public
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Templates
-rw-r--r--. 1 root root 6 Aug 17 11:55 test.txt
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Videos
[22:57:13 root@demo-c8 ~]#ls -Slar # -r: 從小到大, 反向
total 84
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Videos
-rw-r--r--. 1 root root 6 Aug 17 11:55 test.txt
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Templates
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Public
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Pictures
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Music
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Downloads
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Documents
drwxr-xr-x. 2 root root 6 Aug 15 17:19 Desktop
-rw-r--r--. 1 root root 7 Aug 17 12:02 asicc.txt.txt
-rw-------. 1 root root 16 Aug 15 17:19 .esd_auth
-rw-r--r--. 1 root root 18 May 11 2019 .bash_logout
drwxr-----. 3 root root 19 Aug 15 17:19 .pki
drwx------. 3 root root 19 Aug 15 17:19 .local
drwx------. 3 root root 25 Aug 15 17:16 .dbus
-rw-------. 1 root root 37 Aug 17 20:00 .lesshst
-rw-------. 1 root root 58 Aug 16 21:52 .Xauthority
-rw-r--r--. 1 root root 100 May 11 2019 .cshrc
-rw-r--r--. 1 root root 129 May 11 2019 .tcshrc
drwx------. 11 root root 215 Aug 15 17:21 .config
-rw-r--r--. 1 root root 216 Aug 17 19:05 .bash_profile
-rw-r--r--. 1 root root 224 Aug 16 21:14 .bashrc
drwx------. 10 root root 230 Aug 15 17:21 .cache
dr-xr-xr-x. 18 root root 236 Aug 17 10:15 ..
-rw-------. 1 root root 310 Aug 15 17:19 .ICEauthority
-rw-------. 1 root root 1385 Aug 15 17:06 anaconda-ks.cfg.bak
-rw-r--r--. 1 root root 1495 Aug 15 17:17 initial-setup-ks.cfg
dr-xr-x---. 15 root root 4096 Aug 17 21:43 .
-rw-------. 1 root root 7275 Aug 17 21:43 .bash_history
-rw-------. 1 root root 8090 Aug 17 21:43 .viminfo
-rw-r--r--. 1 root root 8233 Aug 17 11:54 't.txt'$'\033'':Q!'
-
ls -R: 遞歸顯示, 會進入到每個子目錄內(nèi)顯示出所有文件, 而ls默認(rèn)只顯示當(dāng)前目錄內(nèi)的內(nèi)容
ls查看不同后綴文件時的顏色由
/etc/DIR_COLORS
和@LS_COLORS變量定義
案例: jpg類型默認(rèn)顯示為紫色, 我們修改為綠色
- 修改配置文件
[23:22:35 root@demo-c8 ~]#vim /etc/DIR_COLORS
# image formats
.jpg 01;32
-
退出當(dāng)前終端, 重新登錄
2.5 查看文件狀態(tài)-stat
Linux文件包含元數(shù)據(jù)Metadata和實際數(shù)據(jù)Data
- stat: 顯示文件詳細(xì)屬性, Metadata
- 每個文件由三個時間戳
access time: 訪問時間, atime, 讀取文件內(nèi)容
modify time: 修改時間, mtime, 改變文件內(nèi)容(數(shù)據(jù))
change time: 改變時間, ctime, 元數(shù)據(jù)發(fā)生改變
[20:37:02 root@Anabile-1 ~]#stat anaconda-ks.cfg
File: anaconda-ks.cfg
Size: 1412 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 202265935 Links: 1
Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-08-13 20:36:54.310987472 +1000
Modify: 2020-08-12 14:06:15.405009322 +1000
Change: 2020-08-12 14:06:15.405009322 +1000
Birth: -
2.6 確定文件內(nèi)容
2.6.1 查看文件類型 - file
文件可以包含多種類型的數(shù)據(jù), 可以使用file
命令檢查文件的類型, 然后確定適當(dāng)?shù)拇蜷_命令或使用對應(yīng)的應(yīng)用程序
file通過檢測文件前幾位, 也就是元數(shù)據(jù)來判斷文件類型
- 一個普通文件包含多種類型: jpg, exe, txt等
Linux文件對后綴沒有要求, 即便是二進制可執(zhí)行程序改成了.txt后綴, 也可以照樣執(zhí)行, 但是執(zhí)行時需要寫上文件后綴,否則會提示找不到文件, 因為不加后綴執(zhí)行,系統(tǒng)會認(rèn)為執(zhí)行的還是原來的程序文件
比如 把/usr/bin/ls 改成/usr/bin/ls.txt
那么執(zhí)行命令時就要用ls.txt而不是ls
[23:25:16 root@demo-c8 ~]#ls
anaconda-ks.cfg.bak Desktop Downloads Music Public test.jpg 't.txt'$'\033'':Q!'
asicc.txt.txt Documents initial-setup-ks.cfg Pictures Templates test.txt Videos
[23:43:14 root@demo-c8 ~]#mv /usr/bin/ls /usr/bin/ls.txt
[23:43:26 root@demo-c8 ~]#ls
-bash: /usr/bin/ls: No such file or directory
[23:43:31 root@demo-c8 ~]#ls.txt
anaconda-ks.cfg.bak Desktop Downloads Music Public test.jpg 't.txt'$'\033'':Q!'
asicc.txt.txt Documents initial-setup-ks.cfg Pictures Templates test.txt Videos
[23:43:40 root@demo-c8 ~]#mv /usr/bin/ls.txt /usr/bin/ls
[23:43:58 root@demo-c8 ~]#ls
anaconda-ks.cfg.bak Desktop Downloads Music Public test.jpg 't.txt'$'\033'':Q!'
asicc.txt.txt Documents initial-setup-ks.cfg Pictures Templates test.txt Videos
ELF: Linux二進制可執(zhí)行程序
軟鏈接: symbolic link to FILE
2.6.2 Windows和Linux文本格式區(qū)別
- Windows vs Linux 文本格式區(qū)別
Windows的換行是回車+換行
實現(xiàn)的, 換行是光標(biāo)移動到當(dāng)前位置下一行的同一位置, 回車是回到當(dāng)前行首. 所以Windows是先執(zhí)行0d再執(zhí)行0a.
Linux 只有換行,沒有回車,也就是Linux換行把兩件事都干了. 所以, Linux只有0a
換行 \n 0a
回車 \r 0d
Windows文件在Linux里用
file
命令查看會顯示為CRLF line terminators
, 表示帶有回車的行結(jié)束符, 因為Windows文件比Linux文件多一個\r
回車符hexdump -C: 將文件內(nèi)容以16進制展示
避免文本亂碼, 需要確保文本保存和打開使用相同的編碼機制. 用UTF-8保存的文本, 就要用UTF-8編碼去打開, 否則會亂碼
Windows文本格式轉(zhuǎn)換成Linux格式
dos2unix
- Linux文本格式轉(zhuǎn)換成Windows格式
unix2dos
dos2unix和unix2dos只是轉(zhuǎn)換文本格式(修改0a和0d), 而不會修改文本的編碼
在Linux上完成對Windows文本文件的轉(zhuǎn)碼, 從其他編碼轉(zhuǎn)到UTF-8
案例:
- 在Windows記事本創(chuàng)建文件, 保存為ANSI(GBK)編碼
-
將a.txt從Windows傳到Linux中, 驗證打開為亂碼, 因為Linux默認(rèn)用UTF-8編碼保存和打開文件
[23:57:03 root@demo-c8 ~]#file a.txt # ISO-8859表示的就是GBK編碼
a.txt: ISO-8859 text, with CRLF line terminators
- 通過
iconv
命令, 將GBK編碼文件轉(zhuǎn)換為UTF-8編碼
-
iconv
也可以把UTF-8轉(zhuǎn)成其他編碼格式
2.7 文件通配符模式-wildcard pattern
文件通配符可以用來匹配符合條件的多個文件名和目錄名, 方便批量管理文件和目錄.
通配符采用特定的符號, 表示特定的含義, 此特定符號稱為元meta字符
通配符除了*
匹配0個或任意個字符外, 其余的通配符都是逐位匹配, 無法通過某一個通配符, 匹配一串字符
常見通配符如下:
這里的字符指的是任何人類字符, 漢字,英文,數(shù)字,標(biāo)點
* 匹配零個或多個任意字符, 但是不匹配'.'開頭的文件, 也就是隱藏文件和目錄
? 匹配任意單個字符
[0-9] 匹配0-9內(nèi)的任意一個數(shù)字
[a-z] 匹配aAbBcCdDeE...z內(nèi)的任意一個字母
[A-Z] 匹配AbBcCdDeE...zZ內(nèi)的任意一個字母
[wang] 匹配列表內(nèi)的任意一個字符, w, a, n, g都符合要求
[^wang] 匹配列表內(nèi)的所有字符以外的任意單個字符, 也就是匹配不是w, a, n, g的任意一個字符
通配符[]
匹配連續(xù)范圍字母時的順序為aAbBcC...zZ; 花括號{}
作為擴展命令時, 其順序為ASCII順序
書寫通配符時, 只需要按照要求的模式, 把每一個字符位上的模式寫出來即可, 從文件第一個字符位, 寫到最后一個字符位
另外還有在Linux系統(tǒng)中預(yù)定義的字符類: man 7 glob, 這些字符類在使用時需要寫在[]
里
[:digit:] 相當(dāng)于0-9, 表示任意單個數(shù)字, 范圍是0-9
[:lower:] 任意一個小寫字母, 和[a-z]不等價
[:upper:] 任意一個大寫字母, 和[A-Z]不等價
[:alpha:] 任意一個大寫或小寫字母
[:blank:] 任意一個水平空白字符
[:space:] 任意一個水平或垂直空白字符
[:punct:] 任意一個標(biāo)點符號
[:print:] 任意一個可打印字符
[:cntrl:] 任意一個控制(非打印)字符
[:graph:] 圖形字符
[:xdigit:] 任意一個16進制字符
- 通配符問號
?
匹配的是一個字符, 可以是英文, 也可以是中文.?
匹配的是字符個數(shù), 不是字節(jié)個數(shù).
UTF-8編碼: 在磁盤上,一個英文單詞占一個字節(jié),byte, 一個漢字占3-4個字節(jié),byte
- 花括號擴展, 用于創(chuàng)建文件和目錄,
[]
中括號通配符, 用于匹配文件名或目錄名 - 中括號內(nèi), 用
-
分開兩個字符[字符1-字符2]
, 表示的是匹配從字符1到字符2的任意單個字符, 如果要匹配離散字符, 也就是指定的字符, 用[136aW!]
這種 - 中括號匹配連續(xù)字符時, 數(shù)字和字母可以放在一起匹配, [0-Z], 匹配0,1,2,3..9,aAbB..zZ內(nèi)的任意單個字符
-
ls
顯示文件就是按照順序aAbB..zZ
顯示, 如果首字母相同, 再比較第二個,,, - Linux中, 目錄是以
/
結(jié)尾的, 而文件的結(jié)尾沒有/
, 所以使用通配符管理文件和目錄時, 可以按照結(jié)尾是否有/
來區(qū)分文件和目錄
案例: 比較有無*
的功能區(qū)別, *
不顯示隱藏文件和目錄
ls -a * : 不顯示隱藏文件和目錄
ls -a: 顯示隱藏文件和目錄
2.8 創(chuàng)建空文件和刷新時間
touch可以用來創(chuàng)建空文件或刷新已有文件的時間戳
- 選項說明:
-a 僅改變atime和ctime
-m 僅改變mtime和ctime
-t [[CC]YY]MMDDhhmm[.ss] 指定atime和mtime的時間戳
-c 如果文件不存在, 則不予創(chuàng)建
- touch: 如果文件不存在,則創(chuàng)建文件, 如果文件存在,則刷新時間戳(三個時間都刷新), 但是不會覆蓋源文件
[20:54:49 root@demo-c8 ~]#mkdir /data/test
[20:54:53 root@demo-c8 ~]#cd /data/test
[20:54:56 root@demo-c8 /data/test]#touch `date +%F_%T`.log
[20:55:06 root@demo-c8 /data/test]#ls
2022-08-18_20:55:06.log
- ">": 重定向也可以創(chuàng)建新文件, 如果文件不存在,則創(chuàng)建空文件, 但是如果文件存在, 則清空源文件, 有風(fēng)險. 如果想清空文件可以用
>
2.9 復(fù)制文件和目錄
利用cp
命令可以實現(xiàn)文件或目錄的復(fù)制, 復(fù)制文件或目錄時, 源文件會保留, 生成新的文件或目錄
工作中, 無論是復(fù)制還是移動文件, 最好先把源文件和目標(biāo)文件都備份一下, 避免誤操作
root
賬號下的cp
命令是cp -i
的別名, 如果目標(biāo)存在, 會提示是否覆蓋, 而普通賬號下的cp
不是別名, 復(fù)制不會提示是否覆蓋
格式:
CP [OPTION]... [-T] SOURCE DEST
CP [OPTION]... SOURCE... DIRECTORY
CP [OPTION]... -t DIRECTORY SOURCE...
復(fù)制的不同情況:
1. 源是單個文件:
目標(biāo)文件不存在: 在目標(biāo)目錄創(chuàng)建目標(biāo)文件, 將源文件中的內(nèi)容, 覆蓋到新創(chuàng)建的目標(biāo)文件
cp -a /etc/fstab /tmp/fstab.bak # 將fstab復(fù)制到/tmp下, 文件名為fstab.bak
目標(biāo)存在, 且為文件: 將源文件中的內(nèi)容, 覆蓋到已存在的目標(biāo)文件. root賬號會提示是否覆蓋, 普通賬號建議用cp -i, 避免數(shù)據(jù)丟失
cp -a /etc/bashrc /tmp/fstab.bak # 因為fstab.bak已經(jīng)存在, 所以在cp時會提示是否覆蓋
目標(biāo)存在, 且為目錄: 在目標(biāo)目錄下, 創(chuàng)建與源文件同名的文件, 將源文件的內(nèi)容, 填充至新創(chuàng)建的文件
cp -a /etc/fstab /tmp # 將fstab復(fù)制到/tmp下, 文件名為fstab
2. 源是多個文件:
目標(biāo)不存在: 提示錯誤
目標(biāo)存在且為文件: 提示錯誤, 源是多個文件, 那么目標(biāo)必須是一個已存在的目錄
目標(biāo)存在且為目錄: 在目標(biāo)目錄下, 創(chuàng)建與源文件同名的多個文件, 并且將源文件內(nèi)容對應(yīng)寫到新創(chuàng)建的目標(biāo)文件
3. 源是目錄, 則必須使用-r/-R遞歸復(fù)制
目標(biāo)目錄不存在: 在目標(biāo)目錄的父目錄創(chuàng)建目標(biāo)目錄, 把源目錄中的內(nèi)容, 復(fù)制到新創(chuàng)建的目標(biāo)目錄下
cp -a /etc /etc_backup # 在/根目錄創(chuàng)建名為etc_backup的目錄, 把/etc目錄內(nèi)的內(nèi)容, 復(fù)制到/etc_backup目錄下
目標(biāo)存在且為文件: 提示錯誤
目標(biāo)存在且為目錄: 在已存在的目錄下, 創(chuàng)建與源目錄同名的目錄, 并且將源目錄中的內(nèi)容, 復(fù)制到目標(biāo)目錄下
cp -a /etc /etc_backup # 如果/etc_backup已經(jīng)存在, 則在/etc_backup目錄下, 創(chuàng)建新的目錄etc, 把/etc內(nèi)的內(nèi)容復(fù)制過去
-u: 僅復(fù)制源比目標(biāo)更新newer的文件, 或目標(biāo)不存在的文件, 兩個目錄保存了名字相同的文件, 可以用-u去更新, 避免由于要覆蓋的文件量太大, 命令執(zhí)行時間慢
-b: 會把已經(jīng)存在的目標(biāo)文件, 在復(fù)制前做備份, 因為目標(biāo)文件存在, cp命令會用源文件覆蓋目標(biāo)文件. 默認(rèn)只備份一次, 加--backup=numbered
選項會保留多個目標(biāo)文件版本
[21:01:43 root@demo-c8 /data/test]#ll /dev/zero
crw-rw-rw-. 1 root root 1, 5 Aug 18 13:50 /dev/zero
[21:04:18 root@demo-c8 /data/test]#ll /dev/sda*
# 8 major類型, 0-5minor類型
brw-rw----. 1 root disk 8, 0 Aug 18 13:50 /dev/sda
brw-rw----. 1 root disk 8, 1 Aug 18 13:50 /dev/sda1
brw-rw----. 1 root disk 8, 2 Aug 18 13:50 /dev/sda2
brw-rw----. 1 root disk 8, 3 Aug 18 13:50 /dev/sda3
brw-rw----. 1 root disk 8, 4 Aug 18 13:50 /dev/sda4
brw-rw----. 1 root disk 8, 5 Aug 18 13:50 /dev/sda5
-
cp
過程中, 文件的元數(shù)據(jù)默認(rèn)不會全部保留, 可能會丟失一部分
普通文本文件, 三個時間戳可能會變成復(fù)制命令執(zhí)行時的時間, 新產(chǎn)生的文件的所有者也可能發(fā)生變化
字符文件, cp /dev/zero /tmp/zero.bak 新的bak文件會變成普通文件
cp對于普通文件影響較小, 不會影響文件類型, 對于特殊文件如字符文件, 復(fù)制后, 文件類型會發(fā)生變化
- 正常復(fù)制時, 無論改不改名, 文件時間都會改變
[12:12:13 root@centos8-2 /data/prac]#cp /etc/issue .
[12:18:07 root@centos8-2 /data/prac]#ll /etc/issue ./issue
-rw-r--r--. 1 root root 23 Jun 3 11:02 /etc/issue
-rw-r--r-- 1 root root 23 Aug 18 12:18 ./issue # mtime發(fā)生變化
復(fù)制出來的文件, 三個時間戳都是執(zhí)行復(fù)制命令時的時間
[12:18:28 root@centos8-2 /data/prac]#stat !*
stat /etc/issue ./issue
File: /etc/issue
Size: 23 Blocks: 8 IO Block: 4096 regular file
Device: 802h/2050d Inode: 134329398 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-08-17 20:09:23.017015589 +1000
Modify: 2020-06-03 11:02:49.000000000 +1000
Change: 2020-08-12 13:59:15.012002240 +1000
Birth: -
File: ./issue
Size: 23 Blocks: 8 IO Block: 4096 regular file
Device: 805h/2053d Inode: 67108993 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2020-08-18 12:18:04.055021409 +1000 # 復(fù)制出來的文件, 三個時間戳都發(fā)生了變化, 時間戳都是執(zhí)行復(fù)制命令時的時間
Modify: 2020-08-18 12:18:04.055021409 +1000
Change: 2020-08-18 12:18:04.055021409 +1000
Birth: -
- cp復(fù)制特殊文件時,比如字符文件, 文件大小,文件類型,文件時間都會改變
[12:19:37 root@centos8-2 /data/prac]#cp /dev/zero ./zero.bak
^C
[12:22:23 root@centos8-2 /data/prac]#ll !*
ll /dev/zero ./zero.bak
crw-rw-rw- 1 root root 1, 5 Aug 18 10:38 /dev/zero # 1-設(shè)備大類別 5-第五個設(shè)備
-rw-r--r-- 1 root root 91480064 Aug 18 12:22 ./zero.bak # 字符文件c變成了普通文件, 文件大小和三個時間戳也都變成了復(fù)制命令執(zhí)行的時間
- 文件屬主, 屬組變化, 用cp命令, 復(fù)制不是以當(dāng)前賬號為屬主或?qū)俳M的文件時, 復(fù)制出來的文件, 屬主和屬組會變成當(dāng)前用戶
[12:26:32 root@centos8-2 ~]#cp ~david/test.123 ./hh.txt
[12:26:56 root@centos8-2 ~]#ll !*
ll ~david/test.123 ./hh.txt
-rw-r--r-- 1 root root 6 Aug 18 12:26 ./hh.txt # 復(fù)制出來的文件的屬主和屬組變成了root, 源文件是david
-rw-rw-r-- 1 david david 6 Aug 18 12:26 /home/david/test.123
- 如何復(fù)制時保留源文件屬性
-p 選項: 復(fù)制時, 保留源文件部分屬性, 包括權(quán)限r(nóng)wx, owner, group, 和atime和mtime. ctime是文件元數(shù)據(jù)修改的時間, 和源文件是不一樣的
-p same as --preserve=mode,ownership,timestamps
--preserve[=ATTR_LIST] preserve the specified attributes (default:
mode,ownership,timestamps), if possible
additional attributes: context, links, xattr,
all
[12:29:16 root@centos8-2 ~]#cp -p ~david/test.123 ./lala.txt
[12:29:39 root@centos8-2 ~]#ll !*
ll -p ~david/test.123 ./lala.txt
-rw-rw-r-- 1 david david 6 Aug 18 12:26 /home/david/test.123
-rw-rw-r-- 1 david david 6 Aug 18 12:26 ./lala.txt
但是-p
也有可能丟失文件類型信息, 比如, 復(fù)制軟鏈接時會丟失軟鏈接屬性, 而實際復(fù)制的是軟鏈接指向的文件, 結(jié)果就是源文件是軟鏈接, 復(fù)制出來的文件變成了普通文件
# /etc/grub2.cfg是/boot/grub2/grub.cfg的軟鏈接, 如果不加任何選項進行復(fù)制, 那么復(fù)制后的目標(biāo)文件會變成普通文件
[12:36:39 root@centos8-2 /data/prac]#cp /etc/grub2.cfg ./grub2.bak
[12:36:49 root@centos8-2 /data/prac]#ll !*
ll /etc/grub2.cfg ./grub2.bak
lrwxrwxrwx. 1 root root 22 Apr 15 00:53 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
-rw-r--r-- 1 root root 5140 Aug 18 12:36 ./grub2.bak
-d 選項: 復(fù)制快捷方式本身, 不會復(fù)制軟鏈接指向的實際文件, 這樣可以保留軟鏈接的屬性
-r/-R 選項: 遞歸復(fù)制整個目錄內(nèi)容, 不加-r/-R是無法復(fù)制整個目錄的
[21:04:22 root@demo-c8 /data/test]#cp /boot .
cp: -r not specified; omitting directory '/boot'
[21:10:39 root@demo-c8 /data/test]#cp -r /boot .
-a 選項: 用于歸檔, 相當(dāng)于-dR, --preserv=all, 保留所有屬性,常用于備份功能
[13:15:08 root@centos8-2 /data/prac]#cp -a /etc/grub2.cfg ./grub2.cfg.bak
[13:16:25 root@centos8-2 /data/prac]#ll !*
ll -a /etc/grub2.cfg ./grub2.cfg.bak
lrwxrwxrwx. 1 root root 22 Apr 15 00:53 /etc/grub2.cfg -> ../boot/grub2/grub.cfg
lrwxrwxrwx. 1 root root 22 Apr 15 00:53 ./grub2.cfg.bak -> ../boot/grub2/grub.cfg
# 典型備份命令, 利用花括號擴展, 這樣備份文件名字會在源文件后加.bak
cp -a test.sh{,.bak}
cp命令多次執(zhí)行時效果不一樣
[13:17:11 root@centos8-2 /data/prac]#ls
[13:25:19 root@centos8-2 /data/prac]#cp /boot /data/prac/bootbak #復(fù)制目錄時, 需要-r或者-R遞歸復(fù)制目錄里的文件
cp: -r not specified; omitting directory '/boot'
[13:25:36 root@centos8-2 /data/prac]#cp -r /boot /data/prac/bootbak #第一次復(fù)制時, 由于目標(biāo)目錄不存在, 則cp會把源目錄,復(fù)制到指定目錄下,并且更名為指定的新目錄
[13:25:40 root@centos8-2 /data/prac]#ls
bootbak
[13:25:44 root@centos8-2 /data/prac]#cp -r /boot /data/prac/bootbak #第二次復(fù)制,由于目標(biāo)目錄已經(jīng)存在, 則cp命令會把源目錄復(fù)制到該已經(jīng)存的目錄下作為子目錄, 這時bootbak目錄里包含第一次從boot里復(fù)制來的文件,和第二次復(fù)制來的整個boot目錄,
[13:25:48 root@centos8-2 /data/prac]#ls
bootbak
[13:25:50 root@centos8-2 /data/prac]#ls bootbak/
boot
config-4.18.0-193.el8.x86_64
efi
grub2
initramfs-0-rescue-f072eccf217a4374b5b44dc4461b3c54.img
initramfs-4.18.0-193.el8.x86_64.img
initramfs-4.18.0-193.el8.x86_64kdump.img
loader
lost+found
System.map-4.18.0-193.el8.x86_64
vmlinuz-0-rescue-f072eccf217a4374b5b44dc4461b3c54
vmlinuz-4.18.0-193.el8.x86_64
[13:26:00 root@centos8-2 /data/prac]#cp -r /boot /data/prac/bootbak #第三次再復(fù)制, 由于bootbak目錄存在, 則cp把boot復(fù)制到bootbak目錄下,但是由于boot目錄在第二次已經(jīng)復(fù)制時已經(jīng)復(fù)制到boobak目錄了,那么就會提示是否替換內(nèi)容
#如果不想提示覆蓋, 可以用\cp, cp的-f并不是強制覆蓋
cp: overwrite '/data/prac/bootbak/boot/vmlinuz-4.18.0-193.el8.x86_64'?
cp: overwrite '/data/prac/bootbak/boot/System.map-4.18.0-193.el8.x86_64'?
cp: overwrite '/data/prac/bootbak/boot/config-4.18.0-193.el8.x86_64'?
- v選項: 顯示復(fù)制的詳細(xì)過程
修改配置文件之前要備份
/etc/motd: 用戶登錄后提示信息設(shè)置, 全局用戶有效
cp -av /etc/motd{,.bak}
2.10 移動文件和重命名文件
mv命令可以實現(xiàn)文件或目錄的移動和改名
同一個分區(qū), 移動數(shù)據(jù), 速度很快, 因為數(shù)據(jù)位置沒有變化
不同分區(qū), 移動數(shù)據(jù), 速度相對慢, 因為數(shù)據(jù)位置發(fā)生了變化
mv支持:
- 單個文件移動到一個目錄
- 多個文件移動到一個目錄
- 不支持多個文件,分別移動到不同目錄
格式:
mv [OPTION]... [-T] SOURCE DEST
mv [OPTION]... SOURCE... DIRECTORY
nv [OPTION]... -t DIRECTORY SOURCE...
常用選項:
-i 交互式, 提示目標(biāo)存在是否覆蓋, root用戶使用mv會提示是否覆蓋
-f 強制移動
-b 當(dāng)目標(biāo)文件/目錄已存在, 在覆蓋前先備份
mv只能一次處理一個文件的改名操作, 而rename可以批量修改文件名
格式:
rename [options] <expression> <replacement> <file>...
rename的expression就是目標(biāo)文件的文件名中需要修改的部分, replacement為替換后的內(nèi)容. <file>支持通配符
rename適用于當(dāng)多個文件的文件名有相同的部分時, 需要把這個相同的部分統(tǒng)一做修改
范例1: 為所有的conf文件, 加上后綴.bak
rename "conf" "conf.bak" file*
范例2: 去掉所有文件的.bak后綴
rename ".bak" "" *.bak
- 范例3: 為指定的文件名加后綴
[root@demo-c8 ~]# cd /tmp
[root@demo-c8 tmp]# rm -rf *
[root@demo-c8 tmp]# touch f{1..10}.txt
[root@demo-c8 tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 18 23:33 f10.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f1.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f2.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f3.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f4.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f5.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f6.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f7.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f8.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f9.txt
[root@demo-c8 tmp]# rename "txt" "txt.bak" f[1-9].txt
[root@demo-c8 tmp]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 18 23:33 f10.txt
-rw-r--r--. 1 root root 0 Aug 18 23:33 f1.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f2.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f3.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f4.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f5.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f6.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f7.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f8.txt.bak
-rw-r--r--. 1 root root 0 Aug 18 23:33 f9.txt.bak
2.11 刪除文件
rm命令可以刪除Linux系統(tǒng)上的文件, 此命令非常危險
格式:
rm [OPTION]... FILE
常用選項:
-i 交互式
-f 強制刪除
-r 遞歸
--no-preserve-root 刪除/目錄
root上的rm是別名, 會提示是否刪除, rm -f會強制刪除文件, rm -rf會強制刪除目錄
Linux中, 即使文件正在編輯,也是可以刪除的
移動, 復(fù)制, 刪除大文件時, 要找系統(tǒng)空閑的時間進行, 避免對系統(tǒng)造成過大壓力
范例1: 刪根
rm -rf / # 從CentOS6開始, 已經(jīng)禁止執(zhí)行此命令
[root@demo-c8 tmp]# rm -rf /
rm: it is dangerous to operate recursively on '/'
rm: use --no-preserve-root to override this failsafe
rm -rf /* 仍然可以執(zhí)行, 工作中要命令禁止此命令
比如: 如果要刪除test目錄內(nèi)的內(nèi)容, 保留test目錄, 需要執(zhí)行rm -rf test/*
[root@demo-c8 data]# ls
test
[root@demo-c8 data]# rm -rf test/*
但是, 一旦在test和/*中間, 無意間加了空格, 那么就是執(zhí)行rm -rf test和rm -rf /*, 就會把根刪了
范例2: 將rm設(shè)置為mv的別名
# root用戶, rm為rm -i的別名, 刪除會提示是否刪除
# 把rm設(shè)置為mv的別名后, 執(zhí)行rm是無法刪除任何文件和目錄的, 因為mv命令需要兩個參數(shù), 此時, 執(zhí)行rm的用戶就會知道rm是不讓使用的, 需要執(zhí)行mv命令
[root@demo-c8 data]# alias rm
alias rm='rm -i'
[root@demo-c8 data]# alias rm=mv
[root@demo-c8 data]# alias rm
alias rm='mv'
[root@demo-c8 data]# rm test
mv: missing destination file operand after 'test'
Try 'mv --help' for more information.
[root@demo-c8 data]# rm -rf test
mv: invalid option -- 'r'
Try 'mv --help' for more information.
# 或者把rm改成echo, 執(zhí)行rm提示不要刪除文件也行
[root@demo-c8 data]# alias rm="echo DO NOT RM ANY FILES"
[root@demo-c8 data]# rm test
DO NOT RM ANY FILES test
- 特殊格式文件的創(chuàng)建和刪除
# 創(chuàng)建/data/-f文件
[root@demo-c8 data]# touch ./-f
[root@demo-c8 data]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 18 23:52 -f
[root@demo-c8 data]# ls
-f
# 刪除/data/-f文件
方法1. 使用相對或者絕對路徑
方法2. 使用rm -- -f
[root@demo-c8 data]# rm -- -f
[root@demo-c8 data]# ll
total 0
Linux的rm刪除文件, 只是刪除文件名, 磁盤文件還是存在的, 如果想把磁盤文件也刪了, rm不能徹底刪除干凈, 可以使用一些工具進行恢復(fù)
- shred會將文件徹底清除, 在安全要求較高的情況下, 可以使用shred安全刪除文件
格式:
shred [OPTION]... FILE...
選項:
-z 最后一次覆蓋文件時添加0, 以隱藏覆蓋操作
-v 顯示操作進度
-u 覆蓋后截斷并刪除文件
-n 數(shù)字 指定覆蓋文件內(nèi)容的次數(shù), 默認(rèn)是3次
范例: shred刪除文件
[root@demo-c8 data]# cp -a /etc/passwd ./passwd.txt
[root@demo-c8 data]# ll
total 4
-rw-r--r--. 1 root root 2658 Aug 15 17:05 passwd.txt
[root@demo-c8 data]# shred -zvun 5 passwd.txt
shred: passwd.txt: pass 1/6 (random)...
shred: passwd.txt: pass 2/6 (ffffff)...
shred: passwd.txt: pass 3/6 (random)...
shred: passwd.txt: pass 4/6 (000000)...
shred: passwd.txt: pass 5/6 (random)...
shred: passwd.txt: pass 6/6 (000000)...
shred: passwd.txt: removing
shred: passwd.txt: renamed to 0000000000
shred: 0000000000: renamed to 000000000
shred: 000000000: renamed to 00000000
shred: 00000000: renamed to 0000000
shred: 0000000: renamed to 000000
shred: 000000: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: passwd.txt: removed
2.12 目錄操作
2.12.1 tree
常見選項:
默認(rèn)顯示目錄內(nèi)所有層級的目錄和文件
-d 只列出所有層級的目錄結(jié)構(gòu), 不顯示文件
-L # 指定顯示的層級數(shù)目
-P pattern 只顯示由指定通配符匹配到的路徑
[root@demo-c8 ~]# tree -d -L 2 /tmp
/tmp
├── systemd-private-a07e43724f874410b0748e3d9d005f9d-bluetooth.service-phNwvu
│?? └── tmp
├── systemd-private-a07e43724f874410b0748e3d9d005f9d-colord.service-8Pl0aZ
│?? └── tmp
├── systemd-private-a07e43724f874410b0748e3d9d005f9d-ModemManager.service-mSF6wP
│?? └── tmp
├── systemd-private-a07e43724f874410b0748e3d9d005f9d-rtkit-daemon.service-RhHyFa
│?? └── tmp
└── vmware-root_953-3979774151
2.12.2 創(chuàng)建目錄 mkdir
常見選項:
-p 自動遞歸創(chuàng)建所需的各層級目錄
-v 顯示詳細(xì)信息
-m MODE 創(chuàng)建目錄時直接指定權(quán)限
2.12.3 刪除空目錄rmdir
常見選項:
-p 遞歸刪除父級空目錄, rmdir -p 逆向刪除空目錄, 父目錄如果是空的, 也會被刪除
-v 顯示詳細(xì)信息
rmdir只能刪除空目錄, 如果目錄內(nèi)有內(nèi)容,則無法刪除, 因此rmdir可以用來批量刪除空目錄
如果想要刪除非空目錄, 需要用rm -rf, 遞歸刪除目錄樹
- 磁盤掛載點目錄內(nèi)容可以清空, 但是無法把目錄也刪除了
[root@demo-c8 ~]# rm -rf /data
rm: cannot remove '/data': Device or resource busy
[root@demo-c8 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 40G 0 part /
├─sda3 8:3 0 2G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 40G 0 part /data # sda5掛載到了/data下, 所以/data是無法被刪除的, 只能刪除/data里的內(nèi)容
sr0 11:0 1 7.7G 0 rom
- 給rm設(shè)置別名, 執(zhí)行刪除時, 會把要刪除的文件, 移動到指定目錄
# 僅對rm命令有效, 如果執(zhí)行rm -rf是會報錯的, 因為mv命令沒有-rf選項, 所以rm -rf也是無法執(zhí)行的
alias rm='DIR=/data/backup_`date +%F_%T`; mkdir -p $DIR; mv -t $DIR'
- 練習(xí)
如何創(chuàng)建目錄/testdir/dir1/x, /testdir/dir1/y, /testdir/dir1/x/a,/testdir/dir1/x/b,/testdir/dir1/y/a,/testdir/dir1/y/b
mkdir -p /testdir/dir1/{x,y}/{a,b}
[root@demo-c8 ~]# mkdir -p /testdir/dir1/{x,y}/{a,b}
[root@demo-c8 ~]# tree /testdir/dir1
/testdir/dir1
├── x
│ ├── a
│ └── b
└── y
├── a
└── b
如何創(chuàng)建目錄/testdir/dir2/x. /testdir/dir2/y, /testdir/dir2/x/a, /testdir/dir2/x/b
mkdir -p /testdir/dir2/x/{a,b}
mkdir -p /testdir/dir2/y
[root@demo-c8 ~]# mkdir -p /testdir/dir2/{x/{a,b},y}
[root@demo-c8 ~]# tree -d /testdir/dir2
/testdir/dir2
├── x
│ ├── a
│ └── b
└── y
如何創(chuàng)建目錄/testdir/dir3, /testdir/dir4, /testdir/dir5, /testdir/dir5/dir6, /testdir/dir5/dir7
mkdir -p /testdir/dir{3,4,5/dir{6,7}}
[root@demo-c8 ~]# mkdir -p /testdir/dir{3,4,5/dir{6,7}}
[root@demo-c8 ~]# tree -d /testdir/
/testdir/
├── dir1
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
│ ├── a
│ └── b
├── dir2
│ ├── x
│ │ ├── a
│ │ └── b
│ └── y
├── dir3
├── dir4
└── dir5
├── dir6
└── dir7
3 文件元數(shù)據(jù)和節(jié)點表結(jié)構(gòu)
3.1 inode表結(jié)構(gòu)
3.1.1 文件
每個文件的屬性信息, 比如: 文件的大小, 時間, 類型等, 成為文件的元數(shù)據(jù)(meta data). 這些元數(shù)據(jù)是存放在node(index node)表中. node表中有很多條記錄組成, 每一條記錄對應(yīng)的存放了一個文件的元數(shù)據(jù)信息. 而文件名稱并不屬于一個文件的元數(shù)據(jù), 文件名稱屬于目錄的數(shù)據(jù)部分
- 元數(shù)據(jù)
每一個node表記錄對應(yīng)的保存了以下信息, 也就是文件的元數(shù)據(jù)信息:
inode number 節(jié)點號
文件類型
權(quán)限
UID
GID
鏈接數(shù)(指向這個文件名的名稱個數(shù), 硬鏈接個數(shù))
該文件的大小和不同的時間戳
指向磁盤上文件的數(shù)據(jù)塊指針
有關(guān)文件的其他數(shù)據(jù)
inode 文件節(jié)點編號, 整個系統(tǒng)唯一, 用來與其他文件區(qū)分開來, 操作系統(tǒng)會自動分配,底層管理文件會使用inode
# -i 選項會顯示inode編號
[root@demo-c8 ~]# ls -i
103221107 anaconda-ks.cfg 666292 Downloads 666294 Music 68360890 Public 68360891 Videos
101475423 Documents 101475459 initial-setup-ks.cfg 35080439 Pictures 35080438 Templates
- 元數(shù)據(jù)和實際數(shù)據(jù)存放
一個硬盤, 可以大致分為兩個空間, 一個存放元數(shù)據(jù), 另一部分空間存放時間數(shù)據(jù).
元數(shù)據(jù): 文件屬性, 索引, 通過指針指向文件在磁盤真正存放文件的位置
實際數(shù)據(jù): 通過指針, 指向文件在磁盤上真正存放的位置
# 1385為文件實際數(shù)據(jù)大小
[root@demo-c8 ~]# ll -i anaconda-ks.cfg
103221107 -rw-------. 1 root root 1385 Aug 15 17:06 anaconda-ks.cfg
block塊: 文件在磁盤存放的最小單元, 一般4kb, 即使一個文件大小不到4kb, 也要占4kb
- 指針
指針: 通過指針, 指向文件在磁盤上真正存放的位置
直接指針: 直接指向數(shù)據(jù)在磁盤的存放位置. 直接指針有12個, 每個指針指向一個4k塊, 那么最多有12個指針, 指向12個4k文件, 也就是最多有48k的數(shù)據(jù)可以通過直接指針找到
間接指針: 如果文件大于48k, 比如1M, 那么要使用間接指針
間接指針指向一個索引塊, 該索引塊并不是數(shù)據(jù)塊, 其大小為4kb, 該索引快被切割成多個相同大小的小塊, 每塊占4byte, 所以總共有1024個小塊. (這個索引塊一共4k, 每塊占4b, 1kb=1024b, 所以一共有1024個小塊)
每個小塊就是一個指針, 指向4k大小的空間, 一共1024個指針, 指向總大小為4k*1024=4096kb大小的數(shù)據(jù), 也就是指向4M數(shù)據(jù), 所以通過間接指針, 最多可以找到4M大小的數(shù)據(jù)
雙重間接指針: 最多指向4G大小, 雙重指針包含兩個索引塊
三重間接指向: 最多指向4T大小, 三重指針包含三個索引快
總結(jié):
單個文件數(shù)據(jù)小于4k, 用直接指針
單個文件數(shù)據(jù)大于4k小于4M,用間接指針
單個文件數(shù)據(jù)大于4M, 雙重,三重間接指針
數(shù)據(jù)文件越大, 找到該文件花費時間越多
- 不同的文件系統(tǒng), 工作原理不同, 以上指針工作過程是針對ext4系統(tǒng), 早期LinuxFAT系統(tǒng), 最多支持4M. 如今ext4和xfx支持更大的單個文件
3.1.2 目錄
- 目錄
目錄是個特殊文件, 一般文件存放的東西就是其數(shù)據(jù)本身, 而目錄文件的數(shù)據(jù)內(nèi)容保存了此目錄中, 文件的列表(文件名), 和文件inode number的對應(yīng)關(guān)系
- 目錄也會占用一個inode編號
文件引用的是inode編號
人是通過文件名來引用一個文件
一個目錄的實際數(shù)據(jù)是目錄下的文件名和文件名對應(yīng)inode號之間的映射
文件名是是目錄里的內(nèi)容, 屬于目錄的數(shù)據(jù)部分
[root@demo-c8 ~]# ls -i
103221107 anaconda-ks.cfg 666292 Downloads 666294 Music 68360890 Public 68360891 Videos
101475423 Documents 101475459 initial-setup-ks.cfg 35080439 Pictures 35080438 Templates
inode節(jié)點表并不保存文件名信息, 也就是說文件元數(shù)據(jù)不包含文件名, 而是包含, mode權(quán)限, owner信息,大小,時間戳,各種時間戳
目錄則存放的是里面的文件列表(文件名)和inode節(jié)點編號對應(yīng)信息
3.1.3 inode空間管理
一般inode表會占用文件系統(tǒng)磁盤空間的1%. 節(jié)點編號不是無限的, 每個分區(qū)會有固定的節(jié)點編號數(shù)量, 用光了就無法創(chuàng)建新的文件和目錄了. 分區(qū)空間越大, 節(jié)點編號越多
df -i
查看磁盤inode使用情況
[root@demo-c8 ~]# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
devtmpfs 989313 443 988870 1% /dev
tmpfs 996355 1 996354 1% /dev/shm
tmpfs 996355 907 995448 1% /run
tmpfs 996355 17 996338 1% /sys/fs/cgroup
/dev/sda2 20971520 119379 20852141 1% /
/dev/sda5 20971520 20 20971500 1% /data
/dev/sda1 65536 309 65227 1% /boot
tmpfs 996355 20 996335 1% /run/user/42
tmpfs 996355 11 996344 1% /run/user/0
當(dāng)inode不足時, 可以把小文件刪了, 釋放inode. 如果在一個分區(qū)里, 建的都是小文件, 那么就會出現(xiàn)空間大小有剩余, 但是inode不足, 導(dǎo)致無法創(chuàng)建新的文件或目錄
訪問一個文件的過程: 先在目錄里看文件的節(jié)點編號, 然后查看節(jié)點表, 節(jié)點表有節(jié)點編號和指針對應(yīng)關(guān)系, 通過節(jié)點編號, 找到指針,也就找到了文件在磁盤中的存儲位置
3.1.4 inode管理案例
- 案例1: 磁盤分區(qū)顯示 No space left on device
No space left on device一般是兩種原因, 1. inode用光, 2. 磁盤大小用光
通過`df -i`確定inode是否用光, 還是磁盤空間用光了
- 案例2: rm刪除文件后,磁盤空間沒有立即釋放, 通過
df
命令還是顯示磁盤空間快滿了
有可能是被刪除的文件,正在被訪問, 例如應(yīng)用程序文件, 這時需要找到該文件, 把對應(yīng)的應(yīng)用程序關(guān)閉, 然后再刪除該文件
構(gòu)建實驗環(huán)境:
# 先確定磁盤分區(qū)使用情況
[root@demo-c8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 9.7M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 40G 4.3G 36G 11% /
/dev/sda5 40G 318M 40G 1% /data
/dev/sda1 976M 189M 721M 21% /boot # boot分區(qū)還剩721M空間
tmpfs 779M 1.2M 778M 1% /run/user/42
tmpfs 779M 4.0K 779M 1% /run/user/0
# 利用/dev/zero文件, 在/boot分區(qū)創(chuàng)建一個測試大文件
[root@demo-c8 ~]# cp /dev/zero /boot/zero.bak
cp: error writing '/boot/zero.bak': No space left on device
[root@demo-c8 ~]# ll -h /boot
-rw-r--r--. 1 root root 772M Aug 19 15:06 zero.bak
[root@demo-c8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 9.7M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 40G 4.3G 36G 11% /
/dev/sda5 40G 318M 40G 1% /data
/dev/sda1 976M 960M 0 100% /boot # boot分區(qū)被撐滿
tmpfs 779M 1.2M 778M 1% /run/user/42
tmpfs 779M 4.0K 779M 1% /run/user/0
# 在另一個窗口, 通過vim打開/boot/zero.bak文件, 模擬文件再被應(yīng)用程序占用
[root@demo-c8 ~]# vim /boot/zero.bak
# 回到之前的窗口, 通過rm -rf把zero.bak刪除
[root@demo-c8 ~]# rm -rf /boot/zero.bak
# 可以看到, 即使zero.bak被刪除了, boot分區(qū)空間還是沒有釋放
[root@demo-c8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 9.7M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 40G 4.3G 36G 11% /
/dev/sda5 40G 318M 40G 1% /data
/dev/sda1 976M 960M 0 100% /boot
tmpfs 779M 1.2M 778M 1% /run/user/42
tmpfs 779M 4.0K 779M 1% /run/user/0
[root@demo-c8 ~]# ll /boot
total 184388
-rw-r--r--. 1 root root 187648 May 8 2020 config-4.18.0-193.el8.x86_64
drwxr-xr-x. 3 root root 4096 Aug 15 16:53 efi
drwx------. 4 root root 4096 Aug 15 17:05 grub2
-rw-------. 1 root root 98497217 Aug 15 17:03 initramfs-0-rescue-eaab49a3b5f746ae847c443ec9bc62c4.img
-rw-------. 1 root root 50808400 Aug 15 17:06 initramfs-4.18.0-193.el8.x86_64.img
-rw-------. 1 root root 17536677 Aug 15 17:16 initramfs-4.18.0-193.el8.x86_64kdump.img
drwxr-xr-x. 3 root root 4096 Aug 15 17:00 loader
drwx------. 2 root root 16384 Aug 15 16:52 lost+found
-rw-------. 1 root root 3909996 May 8 2020 System.map-4.18.0-193.el8.x86_64
-rwxr-xr-x. 1 root root 8913656 Aug 15 17:02 vmlinuz-0-rescue-eaab49a3b5f746ae847c443ec9bc62c4
-rwxr-xr-x. 1 root root 8913656 May 8 2020 vmlinuz-4.18.0-193.el8.x86_64
步驟1: 通過lsof 命令查詢剛被刪除的文件是被哪個程序所使用的, 找到進程的pid
# lsof命令會顯示正在被打開的文件信息
# lsof | grep deleted, 定位到被刪除的那個文件, 找到進程編號
[root@demo-c8 ~]# lsof | grep deleted
#程序名稱 #進程編號
vim 4238 root 5r REG 8,1 809349120 308 /boot/zero.bak (deleted)
步驟2: 找到該程序, 關(guān)閉進程或者如果是前臺運行的程序, 就把運行窗口關(guān)了, 然后在df
查看, 磁盤空間就會釋放了
# 關(guān)閉vim程序
[root@demo-c8 ~]# kill -9 4238
boot/zero.bak" Killed
# 再次通過df查看, boot分區(qū)空間已經(jīng)被釋放
[root@demo-c8 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.8G 0 3.8G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 9.7M 3.8G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda2 40G 4.3G 36G 11% /
/dev/sda5 40G 318M 40G 1% /data
/dev/sda1 976M 189M 721M 21% /boot
tmpfs 779M 1.2M 778M 1% /run/user/42
tmpfs 779M 4.0K 779M 1% /run/user/0
- 如果程序不允許關(guān)閉呢?, 很多應(yīng)用程序需要實時被用戶訪問, 不能被隨意關(guān)閉, 此時就要先把文件清空, 釋放空間, 然后再把文件刪了
方法1: 通過重定向> 要刪除的文件名
, 把文件清空, 但是只有bash shell支持重定向, 此方法不通用
- 切換系統(tǒng)使用的shell, 需要下載對應(yīng)包, 執(zhí)行對應(yīng)的命令, 比如執(zhí)行csh, 就會進行cshell
方法2: 通用方法, cat是外部命令, 不依賴于shell類型
cat /dev/null > 文件名, 這樣就可以清空大文件, 大小為0了 空間就釋放了
因此正確刪除正在運行的大文件, 立即釋放空間的方法
cat /dev/null > FILE, 先把文件清空
rm -rf FILE, 再把文件刪除
3.2 硬鏈接 hard link
硬鏈接本質(zhì)是給文件起一個新的名稱, 實質(zhì)上硬鏈接和原始文件都是同一個文件, 沒有區(qū)別
硬鏈接特性:
- 創(chuàng)建硬鏈接會在對應(yīng)的目錄中增加額外的記錄項, 以引用文件
- 同一個文件不同名字, 本質(zhì)是同一個文件
- 通過哪個文件訪問,看到的內(nèi)容都是同一個文件
- 修改任意一個文件,在其他文件也生效
- 兩個不同名字的文件, 共用相同的節(jié)點編號,指向磁盤相同的空間
- 如果節(jié)點編號一樣, 那就是同一個文件
- 硬鏈接和復(fù)制不一樣, 復(fù)制是生成一個完全不同的新文件, 節(jié)點編號不同, 硬鏈接是給一個文件創(chuàng)建不同的名字, 實際都是同一個文件
-
ll
命令顯示的權(quán)限和owner中間的數(shù)字就是這個文件的硬鏈接數(shù)量, 也就是同一個文件有幾個名字 - 硬鏈接和源文件都是對應(yīng)于同一個文件系統(tǒng)上的同一個物理文件, 修改任意一個硬鏈接, 都會影響其他硬鏈接
- 硬鏈接和源文件的inode相同
- 創(chuàng)建硬鏈接時, 文件的鏈接數(shù)加一, 刪除時減一
- 不能跨越驅(qū)動器或磁盤分區(qū)創(chuàng)建硬鏈接
- 不支持對目錄創(chuàng)建硬鏈接
- 刪除文件時: rm命令會遞減文件的鏈接數(shù), 一個文件如果是存在的, 那么最少有一個鏈接數(shù), 當(dāng)鏈接數(shù)為0時, 文件就被刪除了
格式:
ln 源文件 硬鏈接文件
[15:07:52 root@centos8-2 /data/prac]#touch f1.txt
[15:07:57 root@centos8-2 /data/prac]#ln f1.txt f2.txt # ln src dest
[15:08:04 root@centos8-2 /data/prac]#ls
f2.txt f1.txt
[15:08:05 root@centos8-2 /data/prac]#ll
total 0
-rw-r--r-- 2 root root 0 Aug 18 15:07 f2.txt
-rw-r--r-- 2 root root 0 Aug 18 15:07 f1.txt
[15:08:19 root@centos8-2 /data/prac]#ll -i
total 0
67109585 -rw-r--r-- 2 root root 0 Aug 18 15:07 f2.txt
67109585 -rw-r--r-- 2 root root 0 Aug 18 15:07 f1.txt
當(dāng)f1.txt 是 f2.txt的硬鏈接時, 實際兩個文件是同一個文件的不同名字, 兩個文件具有相同的元數(shù)據(jù), 也就是inode編號,等其他信息,見上, 元數(shù)據(jù)相同, 指針相同, 指向磁盤中相同的數(shù)據(jù)空間
為什么rm無法徹底刪除磁盤文件?
如果一個文件有多個硬鏈接, 那么刪除硬鏈接, 僅僅是刪除一個文件名, 哪怕把最后一個文件名也給刪了, 也是刪除的元數(shù)據(jù), 節(jié)點編號被收回
但是數(shù)據(jù)還是保存在磁盤相應(yīng)的位置, 因此只要給對應(yīng)的磁盤空間分配節(jié)點編號,創(chuàng)建元數(shù)據(jù)和指針就可以重新訪問數(shù)據(jù)了, 這就是rm刪除文件后, 可以恢復(fù)的邏輯
硬鏈接缺點:
- 不能跨分區(qū)創(chuàng)建硬鏈接
每個分區(qū)都有自己獨立的節(jié)點數(shù)量和編號, 每個分區(qū)自己分配自己的節(jié)點編號和數(shù)量, 不能跨節(jié)點創(chuàng)建硬鏈接,
因為硬鏈接是給一個文件創(chuàng)建不同的名稱, 實際兩個名字指向相同的磁盤空間, 相同的磁盤空間必定在同一個分區(qū), 跨分區(qū)創(chuàng)建因此不可能, 違反了硬鏈接本質(zhì) - 不支持文件夾硬鏈接, 容易產(chǎn)生目錄嵌套, 造成死循環(huán)
- 因此用的不多
# root在/分區(qū), data在/data分區(qū), 無法跨分區(qū)創(chuàng)建硬鏈接
[15:38:12 root@centos8-2 /data/prac]#ln /root/.bashrc /data/test.txt
ln: failed to create hard link '/data/test.txt' => '/root/.bashrc': Invalid cross-device link
3.3 軟鏈接 soft link
軟鏈接
- 創(chuàng)建出來的軟鏈接必須是不存在的
- 也就是不能把一個已經(jīng)存在的文件, 創(chuàng)建成另一個文件的軟鏈接
- 軟鏈接和原始文件并不是同一個文件, 節(jié)點編號不同
- 軟鏈接實際就是快捷方式, 修改原始文件后, 通過快捷方式訪問也能看到變化
- 軟鏈接可以跨分區(qū), 硬鏈接無法跨分區(qū), 因為硬鏈接的inode節(jié)點編號相同, 節(jié)點編號相同的文件必是在同一個分區(qū), 指向同一個文件
- 軟鏈接對應(yīng)原始文件如果被刪除, 即使軟鏈接雖然還在, 但是也無法使用
- 原始文件刪除后, 可以把軟鏈接再指向新的文件, 這樣可以訪問新的內(nèi)容
- 可以給軟鏈接也創(chuàng)建軟鏈接
- 軟鏈接指向的是另一個文件的存放路徑, 軟鏈接文件的大小為其指向的路徑字符串的長度, 創(chuàng)建或刪除軟鏈接不會增加或者減少目標(biāo)文件inode的鏈接數(shù)
- 軟鏈接如果使用相對路徑, 是相對于源文件的路徑, 而非相對于當(dāng)前目錄
格式:
ln -s src dest
ln -s appv1.0 app
ln -s app testapp
[root@demo-c8 data]# mkdir appv1.0
[root@demo-c8 data]# ln -s appv1.0/ app
# 通過軟鏈接和原始目錄, 都可以訪問到源目錄中的文件
[root@demo-c8 data]# touch appv1.0/file{1..9}.log
[root@demo-c8 data]# ll app/
total 0
-rw-r--r--. 1 root root 0 Aug 19 18:46 file1.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file2.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file3.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file4.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file5.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file6.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file7.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file8.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file9.log
[root@demo-c8 data]# ll appv1.0/
total 0
-rw-r--r--. 1 root root 0 Aug 19 18:46 file1.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file2.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file3.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file4.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file5.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file6.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file7.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file8.log
-rw-r--r--. 1 root root 0 Aug 19 18:46 file9.log
- 軟鏈接可以跨分區(qū)創(chuàng)建
# boot_data在/data分區(qū), 而/boot是單獨的分區(qū)
[root@demo-c8 data]# ll
total 0
lrwxrwxrwx. 1 root root 5 Aug 19 18:55 boot_data -> /boot
- 創(chuàng)建軟鏈接, 鏈接數(shù)是不增長的
[root@demo-c8 data]# touch f1.txt
[root@demo-c8 data]# ll -i f1.txt # ll -i顯示inode編號, 不加-i不顯示編號, 無論加不加-i都會顯示文件的鏈接數(shù)
133 -rw-r--r--. 1 root root 0 Aug 19 18:55 f1.txt # 鏈接數(shù)為1
[root@demo-c8 data]# ln -s f1.txt f11.txt
[root@demo-c8 data]# ll
total 0
lrwxrwxrwx. 1 root root 6 Aug 19 19:01 f11.txt -> f1.txt
-rw-r--r--. 1 root root 0 Aug 19 18:55 f1.txt # 創(chuàng)建軟鏈接f11.txt后, f1鏈接數(shù)還是1
硬鏈接和原始文件是平等關(guān)系, 把原始文件刪了, 硬鏈接還能用
軟鏈接依賴于原始文件, 原始文件刪了, 軟鏈接就無法使用了
- 相對路徑: 創(chuàng)建軟鏈接時要用絕對路徑指定源文件的位置, 否則如果軟鏈接和源文件不在同一個目錄下時, 軟鏈接是找不到源文件的, 因為軟鏈接文件默認(rèn)會在自己所在的目錄下去找源文件, 案例如下
[root@demo-c8 data]# ln -s f1.txt /boot/f111.txt
[root@demo-c8 data]# ll /boot/f111.txt
lrwxrwxrwx. 1 root root 6 Aug 19 19:03 /boot/f111.txt -> f1.txt
源文件f1.txt在/data目錄下, 軟鏈接文件f111.txt在/boot目錄下, 因為創(chuàng)建/boot/f111.txt時, 使用的是相對路徑指定的源文件, 所以/boot/f111.txt軟鏈接會認(rèn)為f1.txt這個源文件和自己一樣, 在/boot目錄, 但是/boot目錄是沒有f1.txt文件的, 所以就找不到源文件, 會顯示紅色, 說明找不到源文件
軟鏈接指向的源文件顯示紅色可能是因為使用了相對路徑, 造成軟鏈接文件找不到原始文件, 也可能是因為原始文件被刪除了
- 或者源文件要用目標(biāo)軟鏈接所在的路徑的相對路徑來指明源文件所在位置, Linux系統(tǒng)自帶的軟鏈接一般都是使用相對路徑
一般相對路徑都是相對于當(dāng)前目錄, 但是在創(chuàng)建軟鏈接時相對路徑是相對于軟鏈接文件的路徑
# 相對路徑創(chuàng)建軟連接案例
[root@demo-c8 data]# touch f1.txt # 創(chuàng)建源文件
[root@demo-c8 data]# ll
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:31 f1.txt
[root@demo-c8 data]# ln -s ../data/f1.txt /boot/f11.txt # 根據(jù)目標(biāo)軟鏈接文件所在的目錄, 用相對路徑書寫源文件所在位置. 目標(biāo)軟鏈接在/boot目錄, /boot上一層是/, 根的下一層是/data, 所以原始文件的路徑為 ../data/f1.txt
[root@demo-c8 data]# ll /boot/f11.txt
lrwxrwxrwx. 1 root root 14 Aug 19 19:31 /boot/f11.txt -> ../data/f1.txt
- 軟鏈接應(yīng)用場景: 軟件升級
用戶使用訪問軟鏈接/app這個目錄
但是軟鏈接/app這個目錄實際指向的目錄是在發(fā)生變化的
當(dāng)開發(fā)出1.0版本時, 可以創(chuàng)建軟鏈接, ln -s /appv1.0 /app
當(dāng)/appv2.0準(zhǔn)備上線時, 只需要把/app這個軟鏈接刪除, 重新再建一個/app軟鏈接指向/appv2.0即可
rm -rf /app
ln -s /appv2.0 /app
因為不能把已經(jīng)存在的文件, 創(chuàng)建成別的文件的軟鏈接, 所以要先把/app刪除再重新創(chuàng)建
刪除軟連鏈接時容易造成的誤操作
刪除軟鏈接目錄時,不要tab補全
當(dāng)給一個目錄創(chuàng)建了軟鏈接后, 如果我們想要把軟鏈接刪除, 這時不能給軟鏈接目錄自動補全, 否則系統(tǒng)會把軟鏈接名字替換成真正的目錄名字, 然后把真正目錄里的內(nèi)容都刪了, 結(jié)果就是軟鏈接不會被刪, 真實的目錄本身也不會被刪除, 但是目錄內(nèi)的內(nèi)容都沒了
- 問題演示
# 準(zhǔn)備原始目錄和文件
[root@demo-c8 data]# mkdir appv1.0
[root@demo-c8 data]# touch appv1.0/f{1..9}.txt
[root@demo-c8 data]# ll appv1.0/
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:18 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f9.txt
# 創(chuàng)建軟鏈接
[root@demo-c8 data]# ln -s appv1.0/ app
[root@demo-c8 data]# ll app
lrwxrwxrwx. 1 root root 8 Aug 19 19:19 app -> appv1.0/
[root@demo-c8 data]# ll
total 0
lrwxrwxrwx. 1 root root 8 Aug 19 19:19 app -> appv1.0/
drwxr-xr-x. 2 root root 132 Aug 19 19:18 appv1.0
[root@demo-c8 data]# ll app/
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:18 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:18 f9.txt
# 刪除app軟鏈接, 并且補全路徑分隔符
[root@demo-c8 data]# rm -rf app/ # 補全了分隔符, 會把原始目錄內(nèi)的文件全部刪除, 但是軟鏈接目錄和原始目錄本身會保留
[root@demo-c8 data]# ll
total 0
lrwxrwxrwx. 1 root root 8 Aug 19 19:19 app -> appv1.0/
drwxr-xr-x. 2 root root 6 Aug 19 19:20 appv1.0
[root@demo-c8 data]# ll app/
total 0
[root@demo-c8 data]# ll appv1.0/
total 0
- 正確做法
# 在appv1.0中, 先把刪除的文件創(chuàng)建出來
[root@demo-c8 data]# touch appv1.0/f{1..9}.txt
[root@demo-c8 data]# ll app
app/ appv1.0/
[root@demo-c8 data]# ll appv1.0/
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:22 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f9.txt
# 刪除時, 不給軟鏈接目錄補全路徑分隔符
[root@demo-c8 data]# rm -rf app
[root@demo-c8 data]# ll
total 0
drwxr-xr-x. 2 root root 132 Aug 19 19:22 appv1.0 # 這樣軟鏈接目錄自己會被刪除, 而原始目錄和文件都會被保存
[root@demo-c8 data]# ll appv1.0/
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:22 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f9.txt
- 復(fù)制一個目錄時, 如果用 /boot 或者 /boot/ 那么復(fù)制的是整個目錄, 如果用的是 /boot/* 那么只復(fù)制目錄內(nèi)的內(nèi)容, 目錄本身不會被復(fù)制
[root@demo-c8 data]# rm -rf /tmp/*
[root@demo-c8 data]# ls /tmp
[root@demo-c8 data]# cp -av appv1.0/ /tmp
'appv1.0/' -> '/tmp/appv1.0'
'appv1.0/f1.txt' -> '/tmp/appv1.0/f1.txt'
'appv1.0/f2.txt' -> '/tmp/appv1.0/f2.txt'
'appv1.0/f3.txt' -> '/tmp/appv1.0/f3.txt'
'appv1.0/f4.txt' -> '/tmp/appv1.0/f4.txt'
'appv1.0/f5.txt' -> '/tmp/appv1.0/f5.txt'
'appv1.0/f6.txt' -> '/tmp/appv1.0/f6.txt'
'appv1.0/f7.txt' -> '/tmp/appv1.0/f7.txt'
'appv1.0/f8.txt' -> '/tmp/appv1.0/f8.txt'
'appv1.0/f9.txt' -> '/tmp/appv1.0/f9.txt'
[root@demo-c8 data]# ll /tmp
total 0
drwxr-xr-x. 2 root root 132 Aug 19 19:22 appv1.0
[root@demo-c8 data]# ll /tmp/appv1.0/
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:22 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f9.txt
[root@demo-c8 data]# rm -rf /tmp/*
[root@demo-c8 data]# ll /tmp
total 0
[root@demo-c8 data]# cp -av appv1.0 /tmp
'appv1.0' -> '/tmp/appv1.0'
'appv1.0/f1.txt' -> '/tmp/appv1.0/f1.txt'
'appv1.0/f2.txt' -> '/tmp/appv1.0/f2.txt'
'appv1.0/f3.txt' -> '/tmp/appv1.0/f3.txt'
'appv1.0/f4.txt' -> '/tmp/appv1.0/f4.txt'
'appv1.0/f5.txt' -> '/tmp/appv1.0/f5.txt'
'appv1.0/f6.txt' -> '/tmp/appv1.0/f6.txt'
'appv1.0/f7.txt' -> '/tmp/appv1.0/f7.txt'
'appv1.0/f8.txt' -> '/tmp/appv1.0/f8.txt'
'appv1.0/f9.txt' -> '/tmp/appv1.0/f9.txt'
[root@demo-c8 data]# ll /tmp
total 0
drwxr-xr-x. 2 root root 132 Aug 19 19:22 appv1.0
[root@demo-c8 data]# ll /tmp/appv1.0/
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:22 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f9.txt
[root@demo-c8 data]# rm -rf /tmp/*
[root@demo-c8 data]# ll /tmp
total 0
[root@demo-c8 data]# cp -av appv1.0/* /tmp
'appv1.0/f1.txt' -> '/tmp/f1.txt'
'appv1.0/f2.txt' -> '/tmp/f2.txt'
'appv1.0/f3.txt' -> '/tmp/f3.txt'
'appv1.0/f4.txt' -> '/tmp/f4.txt'
'appv1.0/f5.txt' -> '/tmp/f5.txt'
'appv1.0/f6.txt' -> '/tmp/f6.txt'
'appv1.0/f7.txt' -> '/tmp/f7.txt'
'appv1.0/f8.txt' -> '/tmp/f8.txt'
'appv1.0/f9.txt' -> '/tmp/f9.txt'
[root@demo-c8 data]# ll /tmp
total 0
-rw-r--r--. 1 root root 0 Aug 19 19:22 f1.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f2.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f3.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f4.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f5.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f6.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f7.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f8.txt
-rw-r--r--. 1 root root 0 Aug 19 19:22 f9.txt
readlink: 判斷軟鏈接指向的原始文件, 后面必須跟的是軟鏈接, 否則沒有返回結(jié)果, 腳本中會使用, 查看軟鏈接指向的原始文件路徑
針對目錄創(chuàng)建軟鏈接時, 源目錄和目標(biāo)目錄都無需/
補全, 刪除軟鏈接目錄時, 不要補全/
3.4 硬鏈接和軟鏈接區(qū)別總結(jié)
- 本質(zhì)
硬鏈接: 本質(zhì)是同一個文件, 起了多個名字
軟鏈接: 本質(zhì)不是同一個文件
- 跨設(shè)備(磁盤分區(qū))
硬鏈接: 不支持
軟鏈接: 支持
- inode
硬鏈接: inode相同, 因為本質(zhì)是同一個文件
軟鏈接: inode不同, 因為本質(zhì)不是同一個文件
- 鏈接數(shù)
硬鏈接: 創(chuàng)建新的硬鏈接, 鏈接數(shù)會增加, 刪除硬鏈接, 鏈接數(shù)減少
軟鏈接: 創(chuàng)建或刪除, 鏈接數(shù)不會變化
一個文件的鏈接數(shù), 指的是硬鏈接數(shù)量, 也就是一個文件有幾個名
- 文件夾
硬鏈接: 不支持
軟鏈接: 支持
- 相對路徑
硬鏈接: 原始文件相對路徑是相對于當(dāng)前工作目錄
軟鏈接: 原始文件的相對路徑是相對于鏈接文件的相對路徑
- 刪除源文件
硬鏈接: 只是鏈接數(shù)減1, 但是鏈接文件的訪問不受影響
軟鏈接: 鏈接文件將無法訪問
- 文件類型
硬鏈接: 和源文件相同
軟鏈接: 鏈接文件和源文件無關(guān)
I/O重定向
1. I/O重定向
1.1 標(biāo)準(zhǔn)輸入和輸出
程序: 指令+數(shù)據(jù)
讀入數(shù)據(jù): Input
輸出數(shù)據(jù): Output
文件描述符: 打開的文件都有一個fd, file descriptor
Linux給程序提供了三個設(shè)備, 標(biāo)準(zhǔn)輸入, 標(biāo)準(zhǔn)輸出, 標(biāo)準(zhǔn)錯誤, 用文件描述符0,1,2 分別表示, 這三個描述符對應(yīng)的設(shè)備實際是由當(dāng)前終端窗口實現(xiàn), 依靠終端窗口來實現(xiàn), 輸入, 輸出和錯誤
當(dāng)前終端窗口不同, 文件描述符指向的窗口也不同
因此每個窗口都是有獨立的文件描述符, 每個窗口內(nèi)操作的命令不影響其他窗口
- 標(biāo)注輸入(STDIN) - 0 默認(rèn)接受來自終端窗口的輸入
- 標(biāo)準(zhǔn)輸出(STDOUT) - 1 默認(rèn)輸出到終端窗口
- 標(biāo)準(zhǔn)錯誤(SRDERR) - 2 默認(rèn)輸出到終端窗口
范例: 文件描述符
[root@demo-c8 ~]# ll /dev/std*
lrwxrwxrwx. 1 root root 15 Aug 19 11:41 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx. 1 root root 15 Aug 19 11:41 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx. 1 root root 15 Aug 19 11:41 /dev/stdout -> /proc/self/fd/1
[17:07:05 root@centos8-2 ~]#ll /dev/std*
lrwxrwxrwx 1 root root 15 Aug 18 16:34 /dev/stderr -> /proc/self/fd/2
lrwxrwxrwx 1 root root 15 Aug 18 16:34 /dev/stdin -> /proc/self/fd/0
lrwxrwxrwx 1 root root 15 Aug 18 16:34 /dev/stdout -> /proc/self/fd/1
[17:07:11 root@centos8-2 ~]#ll /proc/self/fd
total 0
lrwx------ 1 root root 64 Aug 18 17:07 0 -> /dev/pts/0 # 當(dāng)前終端的0,1,2標(biāo)準(zhǔn)輸入, 輸出, 錯誤都是指向終端pts/0
lrwx------ 1 root root 64 Aug 18 17:07 1 -> /dev/pts/0
lrwx------ 1 root root 64 Aug 18 17:07 2 -> /dev/pts/0
lr-x------ 1 root root 64 Aug 18 17:07 3 -> /var/lib/sss/mc/passwd
lrwx------ 1 root root 64 Aug 18 17:07 4 -> 'socket:[32968]'
lr-x------ 1 root root 64 Aug 18 17:07 5 -> /var/lib/sss/mc/group
lr-x------ 1 root root 64 Aug 18 17:07 6 -> /proc/1449/fd
[17:07:14 root@centos8-2 ~]#tty
/dev/pts/0 # 當(dāng)前使用的終端是pts/0, 所以, 在當(dāng)前終端執(zhí)行的命令的結(jié)果, 已經(jīng)輸入的命令都是只顯示在當(dāng)前終端
[root@demo-c8 ~]# ls # ls的輸出為標(biāo)準(zhǔn)輸出, fd=1, 顯示在當(dāng)前終端
anaconda-ks.cfg Desktop Documents Downloads initial-setup-ks.cfg Music Pictures Public Templates Videos
[root@demo-c8 ~]# rm anaconda-ks.cfg
rm: remove regular file 'anaconda-ks.cfg'? n # rm的提示為標(biāo)準(zhǔn)輸入, 需要用戶在當(dāng)前終端輸入信息
[root@demo-c8 ~]# xxx
bash: xxx: command not found... # 錯誤信息為標(biāo)準(zhǔn)錯誤, 也是顯示在當(dāng)前終端
Failed to search for file: cannot update repo 'AppStream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
- 執(zhí)行命令后的提示不一定就是標(biāo)準(zhǔn)輸出, 比如rm命令提示是否確認(rèn)刪除, 不算標(biāo)準(zhǔn)輸出, 因為標(biāo)準(zhǔn)輸出是可以重定向到文件中的, > test.txt
[17:17:49 root@centos8-2 ~]#rm anaconda-ks.cfg > /dev/pts/1
rm: remove regular file 'anaconda-ks.cfg'?
- 標(biāo)準(zhǔn)錯誤也不一定只包含錯誤提示, rm的提示就屬于標(biāo)準(zhǔn)錯誤, 可以用2>重定向, 這需要根據(jù)程序開發(fā)時的定義來確定
[root@demo-c8 data]# rm test.txt 2> /dev/null
y
[root@demo-c8 data]# ll
total 8
-rw-r--r--. 1 root root 60 Aug 19 20:48 all.log
-rw-r--r--. 1 root root 732 Aug 19 20:49 all.txt
- 執(zhí)行命令正常顯示信息, 比如wget和curl的返回信息也被加到了錯誤輸出, 但他們不是錯誤
1.2 重定向
重定向就是把輸入,輸出或者錯誤對應(yīng)的設(shè)備進行改變, 由原本的窗口比如pts/0, 轉(zhuǎn)移到pts/1, 這就是重定向. 重定向也可以把輸入輸出和錯誤, 定向到文件中
- 修改默認(rèn)的輸出, 輸入, 錯誤顯示窗口
[17:07:17 root@centos8-2 ~]#tty
/dev/pts/0
[17:15:45 root@centos8-2 ~]#hostname > /dev/pts/1
[17:15:58 root@centos8-2 ~]#
[17:09:31 root@centos8-2 ~]#tty
/dev/pts/1
[17:15:48 root@centos8-2 ~]#centos8-2.linux
- 可以重定向三個設(shè)備, 輸出, 輸入, 錯誤
1.2.1 標(biāo)準(zhǔn)輸出和錯誤重定向
STDOUT和STDERR可以被重新定向到指定文件, 而非默認(rèn)的當(dāng)前終端
格式:
命令 操作符合 文件名
支持的操作符號包括:
1> 或 > 把標(biāo)準(zhǔn)輸出STDOUT重定向到指定文件
2> 把標(biāo)準(zhǔn)錯誤STDERR重定向到指定文件
&> 把標(biāo)準(zhǔn)輸出和錯誤都重定向到指定文件
>& 和&>功能一樣, 建議用&>
- 標(biāo)準(zhǔn)輸出和錯誤輸出分別重定向到不同的文件
[17:27:18 root@centos8-2 /data/prac]#clear
[17:27:19 root@centos8-2 /data/prac]#ls /data /dddd > r.txt 2> w.txt
[17:27:46 root@centos8-2 /data/prac]#cat r.txt
/data:
prac
scripts
testing_scripts
[17:27:48 root@centos8-2 /data/prac]#cat w.txt
ls: cannot access '/dddd': No such file or directory
- 如果重定向的文件存在, 那么默認(rèn)會被文件內(nèi)容覆蓋
set -C 禁止覆蓋, 但可以追加, 不過利用 >| 操作符仍可以強制覆蓋
set +C 允許覆蓋, 默認(rèn)就是允許覆蓋
追加: >>, 在原有內(nèi)容基礎(chǔ)上, 追加新的內(nèi)容
把輸出和錯誤重新定向追加到文件中
>> 追加標(biāo)準(zhǔn)輸出重定向到文件
2>> 追加標(biāo)準(zhǔn)錯誤重定向到文件
- 合并標(biāo)準(zhǔn)輸出和錯誤輸出為同一個數(shù)據(jù)流然后進行重定向
&> 覆蓋重定向
&>> 追加重定向
- 順序書寫帶來的影響
CMD > test.txt 2>&1
CMD 2> test.txt 1>&2
CMD &> test.txt
vs
CMD 2>&1 > test.txt
前三種實現(xiàn)的效果相同, 都是把輸出和錯誤重定向到test.txt文件中
先把標(biāo)椎輸出重定向到一個文件里, 這樣這個文件就生成了
然后再把錯誤輸出重定向到標(biāo)準(zhǔn)輸出, 此前標(biāo)準(zhǔn)輸出已經(jīng)是被重定向到test.txt文件
因此這個順序可以實現(xiàn)標(biāo)準(zhǔn)輸出和錯誤輸出都重定向到test.txt文件
第四種寫法會有不同結(jié)果
如果先把錯誤輸出重定向到標(biāo)準(zhǔn)輸出, 這時候還沒有文件存放標(biāo)準(zhǔn)輸出
因此錯誤輸出直接打印在屏幕, 之后 > test.log將標(biāo)準(zhǔn)輸出重定向到文件里
所以這種方法, 錯誤會直接輸出在終端, 只有輸出被重定向到了test.txt
[17:27:50 root@centos8-2 /data/prac]#ls /opt /xxx > test1.log 2>&1
[17:33:02 root@centos8-2 /data/prac]#cat test1.log
ls: cannot access '/xxx': No such file or directory
/opt:
[17:33:05 root@centos8-2 /data/prac]#ls /opt /xxx 2>&1 > test1.log
ls: cannot access '/xxx': No such file or directory
[17:33:18 root@centos8-2 /data/prac]#cat test1.log
/opt:
范例: 標(biāo)準(zhǔn)錯誤重定向
[root@demo-c8 ~]# rm /data/f1.log 2> /data/all.log # 重定向的文件會自動生成
[root@demo-c8 ~]# cat /data/all.log
rm: cannot remove '/data/f1.log': No such file or directory
范例: 合并多個命令的結(jié)果到一個文件
# 方法1: 小括號
[root@demo-c8 ~]# (cat /etc/issue; cat /etc/fstab) > /data/all.txt
[root@demo-c8 ~]# cat /data/all.txt
\S
Kernel \r on an \m
#
# /etc/fstab
# Created by anaconda on Mon Aug 15 16:52:19 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
UUID=b1ab1ace-2582-4afd-8693-39bd9855041c / xfs defaults 0 0
UUID=d5131695-82b3-4a23-bc28-5c8a4bf381a0 /boot ext4 defaults 1 2
UUID=bdd66510-e510-4fe7-ba71-e2a35e6dc492 /data xfs defaults 0 0
UUID=05c944fb-d6f9-4544-ba10-8b7bf3cc8fed swap swap defaults 0 0
# 方法2: 花括號
[root@demo-c8 ~]# { ls;hostname; } > /data/test.txt
[root@demo-c8 ~]# cat /data/test.txt
anaconda-ks.cfg
Desktop
Documents
Downloads
initial-setup-ks.cfg
Music
Pictures
Public
Templates
Videos
demo-c8.demo
范例: 清空大文件
cat /dev/null /data/big_file.log
范例: 輸出和錯誤分別重定向
ls /data /xxx > /data/out.log 2> /data/err.log
1.2.2 標(biāo)準(zhǔn)輸入重定向
從文件中導(dǎo)入STDIN, 代替當(dāng)前終端的輸入設(shè)備, 使用<來重定向標(biāo)準(zhǔn)輸入, 某些命令能夠接受從文件中導(dǎo)入的STDIN
當(dāng)命令執(zhí)行時, 需要手動輸入額外信息時, 可以借助標(biāo)準(zhǔn)輸入重定向, 把需要手動輸入的信息, 放到一個文件里, 通過標(biāo)準(zhǔn)輸入把信息傳遞給執(zhí)行的命令. 把人機交互的命令,變成非交互式批量執(zhí)行
使用標(biāo)準(zhǔn)輸入, 要求命令接受標(biāo)準(zhǔn)輸入
# rm支持標(biāo)準(zhǔn)輸入
[root@demo-c8 data]# echo y > rm.txt
[root@demo-c8 data]# rm aa.txt < rm.txt
rm: remove regular file 'aa.txt'? [root@demo-c8 data]# ll
total 28
-rw-r--r--. 1 root root 60 Aug 19 20:48 all.log
-rw-r--r--. 1 root root 732 Aug 19 20:49 all.txt
-rw-r--r--. 1 root root 7 Aug 19 21:35 a.txt
-rw-r--r--. 1 root root 5 Aug 19 21:40 b.txt
-rw-r--r--. 1 root root 2 Aug 19 21:48 rm.txt
-rw-r--r--. 1 root root 52 Aug 19 21:26 tr.log
-rw-r--r--. 1 root root 4 Aug 19 21:24 tr.txt
1.2.2.1 bc命令
[19:58:56 root@centos8-2 /data/prac]#echo 1+2+3+4 > bc.txt
[20:05:15 root@centos8-2 /data/prac]#bc < bc.txt
10
[20:05:46 root@centos8-2 /data/prac]#cat < bc.txt > bc2.txt
[20:05:51 root@centos8-2 /data/prac]#cat bc2.txt
1+2+3+4
連續(xù)數(shù)字求和
seq -s+ NUMBER
Usage: seq [OPTION]... LAST
or: seq [OPTION]... FIRST LAST
or: seq [OPTION]... FIRST INCREMENT LAST
seq
-s, --separator=STRING use STRING to separate numbers (default: \n)
[20:07:19 root@centos8-2 /data/prac]#seq -s+ 100
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
[20:08:21 root@centos8-2 /data/prac]#seq -s+ 100 | bc
5050
[root@demo-c8 data]# seq -s+ 100 > cal.txt
[root@demo-c8 data]# bc < cal.txt
5050
1.2.2.2 cat命令
cat支持標(biāo)準(zhǔn)輸入重定向, 讀進來什么, 就輸出什么
[root@demo-c8 data]# seq -s+ 100 > a.txt
[root@demo-c8 data]# cat < a.txt > b.txt # 把a文件內(nèi)容讀到cat里, 再輸出給b
[root@demo-c8 data]# cat b.txt
1+2+3+4+5+6+7+8+9+10+11+12+13+14+15+16+17+18+19+20+21+22+23+24+25+26+27+28+29+30+31+32+33+34+35+36+37+38+39+40+41+42+43+44+45+46+47+48+49+50+51+52+53+54+55+56+57+58+59+60+61+62+63+64+65+66+67+68+69+70+71+72+73+74+75+76+77+78+79+80+81+82+83+84+85+86+87+88+89+90+91+92+93+94+95+96+97+98+99+100
- cat < a.file > a.file 這樣會清空a文件, 不能同時讀和寫同一個文件
[20:13:37 root@centos8-2 /data/prac]#cat a.txt
Tue Aug 18 19:58:54 AEST 2020
root
root pts/0 2020-08-18 16:36 (10.0.0.1)
[20:13:39 root@centos8-2 /data/prac]#cat < a.txt > a.txt
[20:13:46 root@centos8-2 /data/prac]#cat a.txt
[20:13:48 root@centos8-2 /data/prac]#
1.2.2.3 tr命令
tr命令用于轉(zhuǎn)換和刪除字符, 接受標(biāo)準(zhǔn)輸入
tr [OPTION]... SET1 [SET2]
SET1表示第一字符串, 包含要替換哪些數(shù)字和字母, SET2為第二字符集, 包含修改后的字母或數(shù)字
SET1和SET2的字符或數(shù)字, 一一對應(yīng)修
默認(rèn), 如果SET1的個數(shù)大于SET2, 那么SET1的最后一位會取SET2最后一位的值. 如果加了-t選項, 那么就是一一對應(yīng)修改, 多出來的字符不會被修改
[:digit:] 相當(dāng)于0-9, 表示任意單個數(shù)字, 范圍是0-9
[:lower:] 任意一個小寫字母, 和[a-z]不等價
[:upper:] 任意一個大寫字母, 和[A-Z]不等價
[:alpha:] 任意一個大寫或小寫字母
[:blank:] 任意一個水平空白字符
[:space:] 任意一個水平或垂直空白字符
[:punct:] 任意一個標(biāo)點符號
[:print:] 任意一個可打印字符
[:cntrl:] 任意一個控制(非打印)字符
[:graph:] 圖形字符
[:xdigit:] 任意一個16進制字符
- tr -c
顯示指定字符集的補集
范例: tr不加選項, 可以實現(xiàn)字符替換, 1-a, 2-b, 3-c, 默認(rèn)從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù), 輸出到標(biāo)準(zhǔn)輸出
[20:13:48 root@centos8-2 /data/prac]#tr 123 abc
1a2b3c
aabbcc
1A2B3C
aAbBcC
# 大小寫轉(zhuǎn)換
[root@demo-c8 data]# echo {a..z} > lower.txt
[root@demo-c8 data]# tr [a-z] [A-Z] < lower.txt > upper.txt # tr中[a-z]表示小寫, [A-Z]是大寫, 這里并不是通配符, 因為通配符針對的是文件, 而tr是針對標(biāo)準(zhǔn)輸入傳進來的內(nèi)容做修改.
# tr的SET字符集有多種寫法, 可以是[a-z], 也可以是'a-z', 都表示范圍內(nèi)的字符
[root@demo-c8 data]# cat upper.txt
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
# 當(dāng)需要替換的字符個數(shù), 大于替換后的字符個數(shù)時, 被替換的最后一個字符的值會按照替換后的最后一個字符取值, 這里4會變成c
[root@demo-c8 data]# tr 1234 abc
1234
abcc
# tr接受標(biāo)準(zhǔn)輸入重定向, 可以把輸入的內(nèi)容, 寫到文件里, 然后通過標(biāo)準(zhǔn)輸入, 傳給tr命令. 但此時, tr僅僅是把標(biāo)準(zhǔn)輸入里的字符, 進行轉(zhuǎn)換, 然后顯示到標(biāo)準(zhǔn)輸出上, 并不會修改標(biāo)準(zhǔn)輸入的文件內(nèi)容
[root@demo-c8 data]# cat tr.txt
ABC
[root@demo-c8 data]# tr ABC 123 < tr.txt
123
[root@demo-c8 data]# cat tr.txt
ABC
[20:27:09 root@centos8-2 /data/prac]#echo {a..z} > tr.log
[20:28:09 root@centos8-2 /data/prac]#tr [a-z] [A-Z] < tr.log
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
- tr -d abc
把標(biāo)準(zhǔn)輸入中的abc刪除, 如果通過文件標(biāo)準(zhǔn)輸入傳個tr, 那么并不會真把文件內(nèi)容修改, 只是轉(zhuǎn)換或者刪除后顯示在屏幕而已
[20:28:30 root@centos8-2 /data/prac]#tr -d abc < tr.log
d e f g h i j k l m n o p q r s t u v w x y z
- tr -s
把重復(fù)且連續(xù)的字符(數(shù)字和字母和符號)壓縮成單個字符, 通常用于壓縮空格, 比如配合df命令
[20:30:56 root@centos8-2 /data/prac]#tr -s abc # 只會壓縮連續(xù)重復(fù)的a, b和c
aaaabbbbccccggggaaakkk
abcggggakkk
[20:33:06 root@centos8-2 /data/prac]#tr -s ab12AB
11223311212AABBABA
12331212ABABA
[20:34:25 root@centos8-2 /data/prac]#df | tr -s " " # 壓縮空格
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 904560 0 904560 0% /dev
tmpfs 921340 0 921340 0% /dev/shm
tmpfs 921340 8912 912428 1% /run
tmpfs 921340 0 921340 0% /sys/fs/cgroup
/dev/sda2 104806400 2392860 102413540 3% /
/dev/sda5 101660164 741948 100918216 1% /data
/dev/sda1 999320 137624 792884 15% /boot
tmpfs 184268 0 184268 0% /run/user/0
[20:34:45 root@centos8-2 /data/prac]#tr -s " " < df.log
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 904560 0 904560 0% /dev
tmpfs 921340 0 921340 0% /dev/shm
tmpfs 921340 8912 912428 1% /run
tmpfs 921340 0 921340 0% /sys/fs/cgroup
/dev/sda2 104806400 2392860 102413540 3% /
/dev/sda5 101660164 741948 100918216 1% /data
/dev/sda1 999320 137624 792884 15% /boot
tmpfs 184268 0 184268 0% /run/user/0
利用tr -d把回車鍵\r刪除,這樣Windows格式就變成了Linux格式
[root@demo-c8 data]# cat a.txt
a
b
c[root@demo-c8 data]# file a.txt
a.txt: ASCII text, with CRLF line terminators # CRLF表示帶有回車0d(\r)的Windows文件
[root@demo-c8 data]# tr -d '\r' < a.txt > b.txt
[root@demo-c8 data]# cat b.txt
a
b
c[root@demo-c8 data]# file b.txt
b.txt: ASCII text
[root@demo-c8 data]# hexdump -C a.txt
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
[root@demo-c8 data]# hexdump -C b.txt
00000000 61 0a 62 0a 63 |a.b.c|
00000005
- 利用tr命令, 將Linux文件改為Windows文件
1.2.2.4 標(biāo)準(zhǔn)輸入單行重定向
利用cat命令實現(xiàn), 每輸入一行,摁回車,輸入信息就重定向到文件里
單行重定向只能實現(xiàn)一次重定向一行, 無法批量重定向
-
輸入第一行, 按回車, 查看f1.txt
-
輸入第二行, 按回車, 查看f1.txt
1.2.2.5 多行重定向
cat命令也可以實現(xiàn)多行重定向, 多行重定向的終止符可以是任何字符, 但是前后必須完全一致
下面案例中, 終止符是efo, 但其可以是任何字符組合, 但是最后一行的結(jié)束符必須和起始一致且不能有額外符號, 比如空格
# 默認(rèn)情況, 會把輸入的多行數(shù)據(jù), 顯示在標(biāo)準(zhǔn)輸出
[20:50:29 root@centos8-2 /data/prac]#cat <<efo
> 123
> 456
> efo
123
456
# 也可以把輸入的多行數(shù)據(jù), 輸出到文本
[root@demo-c8 data]# cat > f2.txt <<EOF
> line1
> line2
> line3
> line4
> EOF
[root@demo-c8 data]# cat f2.txt
line1
line2
line
line4
范例: 生成配置文件, 一般直接寫到腳本里
[20:58:15 root@centos8-2 /data/prac]#cat > httpd.cnf <<EOF
> [httpd]
> dir=/data
> EOF
[20:58:31 root@centos8-2 /data/prac]#cat httpd.cnf
[httpd]
dir=/data
[20:58:15 root@centos8-2 /data/prac]#cat > httpd.cnf <<-EOF #在腳本里,可以加個-解決文本對齊問題
- mail命令也支持標(biāo)準(zhǔn)輸入重定向, 可以在Linux上向外發(fā)郵件
在Linux中利用特定郵箱往外發(fā)郵件
需要Linux安裝mailx
包, 然后再發(fā)件郵件上開啟授權(quán), 這里演示利用QQ郵箱向外發(fā)郵件,這樣就可以以指定的郵箱給任何郵箱發(fā)郵件了
[20:58:35 root@centos8-2 /data/prac]#mail -s IloveLinux abc@123.com
i love linux
ha ha ha
. #'.'是郵件結(jié)束符
EOT
[21:03:44 root@centos8-2 /data/prac]#No configuration file found at /root/.esmtprc or /etc/esmtprc
如果只像上面那樣操作是發(fā)不出去的, 因為Linux發(fā)郵件,需要特定的服務(wù)
而Linux收的郵件是存在 /var/spool/mail/ 對應(yīng)用戶目錄下
- 這里演示利用QQ郵箱向外發(fā)郵件
登錄到QQ郵箱, 獲取發(fā)郵件的授權(quán)碼
編輯.mairc文件, 放到用戶家目錄下, 這樣只有對應(yīng)的用戶登錄時才能使用發(fā)郵件的功能, 放到/etc/mail.rc則對所有用戶有效
不過, 這個要看郵件應(yīng)用是以誰的身份來運行, 比如mailx是以root身份運行, 那么不管是把.mailrc放在root家目錄還是其他用戶家目錄, 其他用戶都可以利用mail發(fā)郵件,因為最終運行程序的是root, mailx會調(diào)用root家目錄下的mailrc文件. 如果應(yīng)用是以別的用戶身份運行, 那么就會去對應(yīng)的用戶家目錄找mailrc文件. 如果想對所有用戶都有效, 就放到/etc/mail.rc
[21:23:36 root@centos8-2 ~]#cat .mailrc
set from=abc@123.com #郵件以哪個地址發(fā)送
set smtp=smtp.qq.com #騰旭qq郵箱服務(wù)器
set smtp-auth-user=abc@123.com #qq郵箱
set smtp-auth-password=fpwmwpjcjcmobfad #授權(quán)碼
set smtp-auth=login
set smtp-verity=ignore
- 安裝mailx包, 有了這個包才能使用mail命令
[21:28:11 root@centos8-2 ~]#yum provides mailx
Last metadata expiration check: 1:39:26 ago on Tue 18 Aug 2020 07:48:53 PM AEST.
mailx-12.5-29.el8.x86_64 : Enhanced implementation of the mailx command
Repo : @System
Matched from:
Provide : mailx = 12.5-29.el8
yum -y install mailx
mailx-12.5-29.el8.x86_64 : Enhanced implementation of the mailx command
Repo : BaseOS
Matched from:
Provide : mailx = 12.5-29.el8
[21:28:19 root@centos8-2 ~]#rpm -ql mailx
/bin/mail
/bin/mailx
/etc/mail.rc
...
- 發(fā)郵件
[21:28:57 root@centos8-2 ~]#echo linuxtest > mail.txt
[21:30:16 root@centos8-2 ~]#mail -s testmail abc@123.com < mail.txt # -s: 指定郵件標(biāo)題
或者利用多行重定向
[21:31:55 root@centos8-2 ~]#mail -s testmail2 abc@123.com << EOF
> i love linux
> ha ha ha
> EOF
- 以.rc結(jié)尾的配置文件, 可以理解為run command, 運行命令
2. 管道
- 管道: 把前一個命令的標(biāo)準(zhǔn)輸出, 作為后一個命令的標(biāo)準(zhǔn)輸入
格式: CMD 1 | CMD 2 | CMD3...
CMD 1必須有標(biāo)準(zhǔn)輸出, 否則無法傳給管道,因為管道只接收標(biāo)準(zhǔn)輸出
CMD 2必須支持標(biāo)準(zhǔn)輸入
原本需要標(biāo)準(zhǔn)輸入才能執(zhí)行的命令, 可以利用管道, 將輸入信息, 通過管道傳給命令, 也就是原本需要標(biāo)出輸入信息才能執(zhí)行的命令, 都可以通過管道把信息傳給該命令, 不需要人機交互執(zhí)行
[root@demo-c8 data]# seq -s+ 100 | bc
5050
cat /etc/issue | mail -s lalala abc@123.com
[root@demo-c8 data]# echo hello | tr 'a-z' 'A-Z'
HELLO
或者如果不確定前面命令是否會有錯誤輸出, 可以使用 CMD
2>&1 | tr 'a-z' 'A-Z', 把錯誤先重定向到標(biāo)準(zhǔn)輸出,再傳給管道
或者 使用xxx |& tr 'a-z' 'A-Z'
[10:17:30 root@centos8-2 ~]#xxx | tr 'a-z' 'A-Z' #正常情況, 錯誤輸出不會傳給管道. 因為如果傳給管道了, 那么小寫字母就會被tr轉(zhuǎn)為大寫了
-bash: xxx: command not found
[10:17:18 root@centos8-2 ~]#xxx 2>&1 | tr 'a-z' 'A-Z #添加了 2>&1將錯誤輸出先重'定向到標(biāo)準(zhǔn)輸出, 再傳給管道. 這樣錯誤輸出也可以被傳個管道做處理
-BASH: XXX: COMMAND NOT FOUND
[10:17:23 root@centos8-2 ~]#xxx |& tr 'a-z' 'A-Z' #添加了 |& 將錯誤輸出先重定向到標(biāo)準(zhǔn)輸出, 再傳給管道
-BASH: XXX: COMMAND NOT FOUND
管道可以多次處理
- 管道更改密碼
# 該--stdin僅在紅帽系統(tǒng)支持
[root@demo-c8 data]# echo "0000" | passwd --stdin wang
Changing password for user wang.
passwd: all authentication tokens updated successfully.
[10:21:45 root@centos8-2 ~]#xxx |& tr 'a-z' 'A-Z' | tr -d ':'
-BASH XXX COMMAND NOT FOUND
- Ubuntu系統(tǒng)可以使用chpasswd命令來修改密碼
echo wang:000000 | chpasswd
- tee 命令
重定向和管道僅能實現(xiàn)單一的結(jié)果展示方式, 要么把結(jié)果輸出到標(biāo)準(zhǔn)輸出, 在終端展示, 要么重定向到文件里
tee命令既能把輸出, 重定向到文件, 也能把輸出打印在屏幕上
想把命令結(jié)果重定向到文件, 也想看看命令輸出結(jié)果是什么, 可以用tee命令
如果輸出文件存在, 默認(rèn)會覆蓋, tee -a
則追加
格式:
CMD | tee FILE/TO/PATH
[10:29:36 root@centos8-2 ~]#ls | tee /data/prac/ls.log
anaconda-ks.cfg
mail.txt
test.txt
[10:29:42 root@centos8-2 ~]#cat /data/prac/ls.log
anaconda-ks.cfg
mail.txt
test.txt
eg: 利用cat 多行重定向, 編輯文件, 既能把標(biāo)準(zhǔn)輸入重定向到文件, 也能在屏幕看到輸入內(nèi)容
[10:29:50 root@demo-c8 ~]#cat << EOF > file.log
> ert
> dfg
> EOF
[root@demo-c8 data]# cat file.log
ert
dfg
[10:32:43 root@demo-c8 ~]#cat << EOF | tee file1.log
> lalala
> hahaha
> ooo
> EOF
lalala
hahaha
ooo
[root@demo-c8 data]# cat file1.log
lalala
hahaha
ooo
- 重定向中
-
的作用, 把網(wǎng)絡(luò)上的文件內(nèi)容顯示在屏幕上而非下載到文件里
[10:52:07 root@centos8-2 ~]#curl http://abc.123.com/testdir/hello.sh #curl是專門的字符界面瀏覽器命令
#!/bin/bash
#經(jīng)典寫法
echo "hello, world"
#流行寫法
echo 'Hello, world!'
# wget不加選項, 默認(rèn)把文件下載到當(dāng)前目錄, 同時輸出wget命令的輸出到屏幕
# -q不顯示wget自己的輸出信息
# -O 支持把下載的內(nèi)容寫到文檔或輸出到屏幕, -O -, 把內(nèi)容打印到標(biāo)準(zhǔn)輸出, -O FILE, 輸出到指定文件, 文件名可以自己指定
# -O - 文件內(nèi)容輸出到屏幕
# -P 把文件下載到指定目錄, 無法修改源文件名
[10:54:10 root@centos8-2 ~]#wget -qO - http://abc.123.com/testdir/hello.sh # wget -qO - 間接實現(xiàn)瀏覽器功能, 把網(wǎng)上的文件顯示到終端
#!/bin/bash
#經(jīng)典寫法
echo "hello, world"
#流行寫法
echo 'Hello, world!'
[root@demo-c8 data]# wget -O - http://abc.123.com/testdir/hello.sh 2>/dev/null # 把wget命令本身的輸出信息重定向到/dev/null
#!/bin/bash
#經(jīng)典寫法
echo "hello, world"
#流行寫法
echo 'Hello, world!
- 練習(xí)
顯示/etc目錄下, 所有以l
開頭, 以一個小寫字母結(jié)尾, 且中間出現(xiàn)至少一位數(shù)字的文件或目錄列表
ls /etc/l*[0-9]*[[:lower:]] -d
顯示/etc目錄下, 以任意一位數(shù)字開頭, 且以非數(shù)字結(jié)尾的文件或目錄列表
ls /etc/[0-9]*[^0-9] -d
顯示/etc目錄下, 以非字母開頭, 后面跟了一個字母及其他任意長度任意字符的文件或目錄列表
ls /etc/[^[:alpha:]][[:alpha:]]* -d
顯示/etc目錄下, 所有以rc
開頭, 并且后面是0-6
之間的數(shù)字, 其他為任意字符的文件或目錄列表
ls /etc/rc[0-6]* -d
顯示/etc目錄下, 所有以.conf
結(jié)尾, 且以m,n,r,p
開頭的文件或目錄列表
ls /etc/[mnrp]*.conf -d
只顯示/root
下的隱藏文件和目錄列表
ls /root/.* -d
只顯示/etc
下的非隱藏目錄列表
ls -ld /etc/[^.]* | grep ^d
ls -d /etc/[^.]*/ # Linux中, 目錄是以/結(jié)尾的, 而文件的結(jié)尾沒有/, 所以使用通配符管理文件和目錄時, 可以按照結(jié)尾是否有/來區(qū)分文件和目錄
計算, 1-100, 奇數(shù)和偶數(shù)之和
# seq START INCREMENT STOP
[root@demo-c8 data]# seq -s+ 1 2 100 | bc
2500
[root@demo-c8 data]# seq -s+ 2 2 100 | bc
2550
[root@demo-c8 data]# echo {1..100..2}
1 3 5 7 9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49 51 53 55 57 59 61 63 65 67 69 71 73 75 77 79 81 83 85 87 89 91 93 95 97 99
[root@demo-c8 data]# echo {1..100..2} | tr -s " " "+" | bc
2500