1. 程式人生 > >linux下部分文件管理類基本命令匯總以及bash展開特性介紹

linux下部分文件管理類基本命令匯總以及bash展開特性介紹

sil 報錯 生效 依次 知識 屏幕 dde context target

一、文件管理類基本命令

1.1、表格匯總

今天要講解的命令如下表所示,按照外部命令和內建命令做基本劃分:

內建命令列表:

命令名字 基本說明
file 檢測文件類型
cd 改變shell的工作目錄
dirs 顯示目錄堆棧信息
popd 從堆棧中移除目錄
pushd 向堆棧中添加目錄

外部命令列表:

命令名字 基本說明
ls 列出目錄內容
tree 以"樹狀"格式列出目錄內容
pwd 打印當前工作路徑的名字(是一個絕對路徑)
echo 顯示文本行
cat 連接文件內容,並打印到標準輸出
tac 連接文件內容,顛倒輸出,最後一行輸出到第一行
paste 合並文本行
rev 反轉一個或多個文件內容的行
nl 把指定單個或多個文件內容打印到標準輸出並附上行號,多個文件內容按先後順序標記上行號
wc 統計文件行數或字節數,或單詞數
more 分屏不可逆文本查看器(對於大文本建議用more或less替代cat來查看文本內容)
less 分屏可逆文本查看器(對於大文本建議用more或less替代cat來查看文本內容)
pr 給文本輸出加上標題並按照指定行數或者默認行數分割多個頁面輸出
locate 根據名字查找文件(find工具比較強大,我後續會有專題,本部分不會引入)
head 輸出文本的起始部分內容
tail 輸出文本的尾部部分的內容
tailf 跟蹤日誌文件內容(調試工具之一)
sort 排序文本文件行內容
uniq 報告或刪除重復的行
fmt 簡要優化格式化輸出文本內容
printf 格式化輸出文本內容
column 格式化輸出文本,按照指定字符控制輸出多列(有點和awk某些用法類似)
colrm 列刪除工具
join 通過相同字段來連接文件的行
od 以八進制或者其他格式轉儲文件內容(常用於查看二進制文件)
hexdump 以ascii,十進制,16進制,八進制顯示文本內容(常用於查看二進制文件)
cp 復制文件或目錄(文件)
mv 移動或重命名文件
touch 改變文件時間戳屬性(可以創建普通文本文件)
mkdir 創建目錄(文件)
mkfifo 創建命名管道(有名管道)文件
rmdir 刪除空目錄(文件)
rm 刪除文件或目錄(危險基礎指令top10之一)
ln 在文件之間做鏈接關系
du 評估文件實際空間使用情況
tr 轉換或刪除字符
split 把文件切割成多個零碎的部分

1.2、詳細解析

1.2.1、ls

語法結構:ls [OPTION]... [FILE]...
其中OPTION表示選項,可以省略不用。FILE表示查看的文件,也可以省略,可以多個。這裏
的文件表示的是廣義的文件,可以是文本文件,目錄文件或者其他特殊文件等。

常見選項以及含義:

-a, --all:隱藏文件也會被列舉出來
-l:長格式顯示列出的文件
-i, --inode:打印列出文件的索引編號
-d, --directory:列出目錄文件本身,不是目錄下的文件內容
-R, --recursive:列出包含子目錄在內的目錄和文件(遞歸列出)
-h, --human-readable:結合-l選項一起用。因為這個選項是和文件分配占用大小有關的(不一定是實際占用大小),
                                     顯示易讀的大小屬性,例如1K,234M,2G等
-Z, --context:顯示SElinux安全上下文屬性信息

舉例子:
a.>查看隱藏目錄
技術分享圖片
從圖中可以看出,以符號"."開頭的文件或目錄文件都被列舉出來了。這裏補充說明一下,linux下,除了以符號"."開頭的是隱藏文件外,在每個路徑目錄下,都有兩個特殊的目錄,它們分別是".","..",其中"."表示當前目錄,".."表示當前目錄的上級目錄,至於為什麽有這兩個目錄,這就是工具C語言源碼實現定義的兩個特殊屬性。

b.> 長格式輸出
技術分享圖片

技術分享圖片

長格式輸出非常有用。我們簡單來說說每一列的含義:
第一列:對象權限屬性和selinux標誌或acl權限標誌
第二列:對象硬鏈接數
第三列:對象所有者(屬主)
第四列:對象所有組(屬組)
第五列:對象大小屬性,此大小僅供參考,實際占用大小請用其他工具統計(例如du),例如稀疏文件以及其他特殊文件,
這一列的值不一定準確。
第六列:對象mtime屬性中的月份英文縮寫
第七列:對象mtime屬性中的日數字
第八列:對象mtime屬性中的時分
第九列:對象本身名字
額外說明:當ls -l查看的是字符設備或者塊設備時候,條目屬性共有9列,第四列表示的不是
屬組了而是硬件類型,第五列表示 的不是對象大小屬性而是硬件的主次版本號(主和次
版本號之間用逗號隔開),其他列和普通對象一致。

這裏關於第一列做一下補充說明,最後權限位之後的最後一位可以為"空格"或"."或"+".
如果沒有SElinux上下文標識,也沒有acl權限屬性,就用空格;
如果沒有SElinux上下文標識,但是有acl權限屬性,就用加號;
如果有SElinux上下文標識,沒有acl權限屬性,就用點號;
如果有SElinux上下文標識,且同時又acl權限屬性,還是用加號;

請參考下面的示例:

-rw-r--r--  root root ?                                a.file  #沒有SElinux上下文,沒有ACL
-rw-r--r--+ root root ?                                b.file  #只有ACL,沒有SElinux上下文
-rw-------. root root system_u:object_r:admin_home_t:s0 my.cnf #只有SElinux上下文,沒有ACL
-rw-rw-r--+ root root unconfined_u:object_r:user_tmp_t:s0 dd.c #有SElinux上下文,有ACL

c.> 查看inode編號
技術分享圖片

inode編號也分配消耗殆盡(正常控制情況下不會),inode的作用,我們要想知道原理,要對磁盤分區知識有了解才能
知道原理。暫時只需要基礎,inode的引入是為了效率和方便管理,inode叫索引編號。

d.> 查看目錄本身
技術分享圖片

e.> 遞歸查看目錄
技術分享圖片

f.> 長格式輸出易讀的文件大小屬性
技術分享圖片
這裏的易讀,是文件空間預分配占用大小占用實際文件比率會自動轉換成K,M,G等單位的數值。通常要配置長格式
輸出來一起使用。因為長格式輸出中有關於文件大小屬性的記錄。

g.> 查看文件selinux安全上下文屬性
技術分享圖片
SElinux安全上下文屬性比較復雜,暫時只需要知道,圖中紅色框框標記的就是安全上下文屬性。如果關閉了
SElinux,正常情況框框中的部分在selinux關閉後對文件屬性有變更的文件會顯示符號"?",關閉selinux後,文件屬性沒有變化的,還是會顯示其SElinux安全上下文屬性。

列出目錄內容

1.2.2、tree

語法結構:

tree  [-acdfghilnpqrstuvxACDFQNSUX] [-L level [-R]] [-H baseHREF] [-T title] [-o filename] [--nolinks] [-P pattern]
[-I pattern] [--inodes] [--device] [--noreport] [--dirsfirst] [--version] [--help] [--filelimit #] [--si] [--prune]
[--du] [--timefmt format] [directory ...]

簡化後:

tree [-L level [-R]] [--inodes] [directory ...]

常用選項及其含義:

-L level:顯示最大的目錄樹深度;
--inodes:顯示inode編號信息;

舉例:
a.>簡單用法以及指定具體樹狀深度
技術分享圖片
正常情況有多少層,就會顯示多少層。切記不可在目錄層級較多的目錄做統計,統計會帶來較大的io和cpu時鐘消耗。可以通過-L指定統計的層級深度。
技術分享圖片

b.> 加上索引編號
技術分享圖片

1.2.3、pwd

語法結構:
pwd [OPTION]...
選項可以省略

常用選項:無

用的最多的就是在一個環境下操作,命令行下,有時候不知道具體切換的深度,可以直接利用pwd打印出
當前所在工作目錄。舉例省略,打印的結果是一個以符號"/"開頭的絕對路徑。

1.2.4、echo

語法結構:
echo [SHORT-OPTION]... [STRING]...
echo LONG-OPTION

常用選項:

-n:不打印新換行符,默認會打印行尾的換行符
-e:解析反斜杠指定特殊字符含義
-E:默認選項。不解析反斜杠指定特殊字符的含義

特殊反斜杠字符含義:
\b  backspace 退格
\n  new line 新行
 \t horizontal tab 橫向制表符
 \\ backslash 反斜線本身
 \0nnn 八進制值表示的字節NNN(0到3個八進制數字)
 \xHH 十六進制值表示的字節HH(1或2個16進制數字)

特殊用法:標記顏色

echo命令可以修改字體類型,字體背景色以及字體顏色,
轉義序列\033(八進制用法)可以用於改變字體屬性。
要使轉義序列生效,必須使用-e選項。
下面列出了部分轉義代碼:
[0m: 正常
[1m: 粗體
[4m: 字體加上下劃線
[7m: 逆轉前景和背景色
[8m: 不可見字符
[9m: 跨行字體
[30m: 灰色字體
[31m: 紅色字體
[32m: 綠色字體
[33m: 棕色字體
[34m: 藍色字體
[35m: 紫色字體
[36m: 淺藍色字體
[37m: 淺灰字體
[38m: 黑色字體
[40m: 黑色背景
[41m: 紅色背景
[42m: 綠色背景
[43m: 棕色背景
[44m: 藍色背景
[45m: 紫色背景
[46m: 淺藍色背景
[47m: 淺灰色背景

舉例說明:
a.>正常使用,不加選項
技術分享圖片

b.> 轉移特殊字符,換行,橫向制表符等
技術分享圖片

d.>打印顏色字體(加粗,下劃線,字體色,背景色應用)
技術分享圖片

從上到下,依次輸出:
正常字體,不帶顏色;
加粗字體,不帶顏色;
下劃線字體,不帶顏色;
下劃線加粗字體,不帶顏色;
正常字號,紅色字體;
加粗紅色字體;
加粗下劃線紅色字體;
加粗下劃線紅色字體,綠色背景色;

1.2.5、cat,tac

cat語法結構:
cat [OPTION]... [FILE]...
如果省略FILE,或者FILE為-,表示cat從標準輸入中讀內容。例如:
cat f - g:表示輸出f的內容,標準輸入,然後是g的內容;
cat:表示復制標準輸入到標準輸出。(從鍵盤中得到什麽,屏幕就會顯示什麽)

PS:與管道以及重定向結合的方式,我們這裏就不介紹了。常用的就一個
cat << EOF
......
EOF

tac語法結構:
tac [OPTION]... [FILE]...

以cat為例,tac類似。
cat常用選項:

-n, --number:顯示行號;
-A:顯示所有特殊字符(linux換行符用$表示,windows換行符部分的回車符用^M表示,橫向制表符用^I表示)
-v, --show-nonprinting:use ^ and M- notation, except for LFD and TAB,這裏可以勉強理為windows的回車用^M標記;
-T, --show-tabs:用^I來標記文本中的橫向制表符;
-E, --show-ends:用$來標記每一行的末尾的換行符;

舉例:
a.>查看一個或多個文本內容,輸出不帶行號
b.>查看一個或多個文本內容,輸出帶行號
技術分享圖片

技術分享圖片

c.>顯示所有特殊字符
技術分享圖片

1.2.6、paste

語法結構:
paste [OPTION]... [FILE]...

常用選項及說明:

-d, --delimiters=LIST:粘貼文本之間的分隔符,默認是橫向制表符
-s, --serial:一次粘貼一個文件而非並行粘貼

舉例:
技術分享圖片

1.2.7、rev

語法結構:
rev [options] [file ...]
rev復制指定文本到標準輸出,翻轉每一行的字符的順序。
無常用實際選項。與tac是有區別的,這個rev是針對行的字符的順序。

例如:
技術分享圖片

1.2.8、nl

語法結構:
nl [OPTION]... [FILE]...

給指定文件或標準輸入(如果沒有FILE或者FILE為-)的內容輸出到標準輸出(默認為屏幕),然後給每一行加上行號。
nl與cat -n相比,可以理解為nl專為頁面行號設計的工具組件,包括行號相關的其他屬性。cat -n只是有輸出行號的功能。

選項:

-b, --body-numbering=STYLE   使用指定樣式編號文件的正文行目
-d, --section-delimiter=CC    使用指定的CC 分割邏輯頁數
-f, --footer-numbering=STYLE    使用指定樣式編號文件的頁腳行目
-h, --header-numbering=STYLE    使用指定樣式編號文件的頁眉行目
-i, --page-increment=NUMBER    設置每一行遍歷後的自動遞增值
-l, --join-blank-lines=NUMBER    設置數值為多少的若幹空行被視作一行

-n, --number-format=FORMAT 根據指定的格式插入行號 
-p, --no-renumber        在邏輯頁數切換時不將行號值復位 
-s, --number-separator=STRING    可能的話在行號後添加字符串 
-v, --starting-line-number=NUMBER   每個邏輯頁上的第一行的行號 
-w, --number-width=NUMBER    為行號使用指定的欄數

默認情況下,選項設置為: -v1 -i1 -l1 -sTAB -w6 -nrn -hn -bt -fn.

CC是用來分隔邏輯頁數時候的兩個分隔字符,省略的第二個字符包含了“:”,表示"\"要轉移"\\"
CC這兩個字符可用值為:
a      number all lines  對所有行編號(包括空行);
t      number only nonempty lines 只對非空行編號;
n      number no lines
pBRE   number only lines that contain a match for the basic regular expression, BRE,只對
 符合正則表達式BRE的行進行編號。

FORMAT可用格式:
ln     left justified, no leading zeros,左對齊,左邊沒有前導"0"填充;

rn     right justified, no leading zeros,右對齊,左邊沒有前導"0"填充;

rz     right justified, leading zeros,右對齊,左邊有前導"0"填充;

舉例說明:
a.> 默認選項
技術分享圖片

b.> 空行也計入行號
c.> 改變對齊方式
技術分享圖片

d.> 滿足指定正則匹配的行進行行號標記
技術分享圖片

1.2.9、wc

語法結構:
wc [OPTION]... [FILE]...
wc [OPTION]... --files0-from=F

常用選項:

-c, --bytes:打印字節數量;
-m, --chars:打印字符數量;
-l, --lines:打印行數;
-w, --words:打印單詞數量;
-L, --max-line-length:打印最長的行的字符長度;
--files0-from=F:從F指定的文件中讀取FILE參數,F中指定的FILE後面要以符號NULL結尾,這個輸入可以通過
    在vim編輯模式Ctrl+k,然後輸入NU即可(實際測試失敗,具體原因不詳)

舉例子:

技術分享圖片

1.2.10、more

分屏不可逆文本查看器(對於大文本建議用more或less替代cat來查看文本內容)
語法結構:
more [options] file [...]

常用選項:

+number   從笫number行開始顯示,例如+20表示從文本第20行開始顯示;
-n       定義屏幕大小為n行,即每一屏幕顯示n行;
+/pattern 在每個檔案顯示前搜尋該字串(pattern),然後從該字串前兩行開始顯示。 
-d       提示“Press space to continue,’q’ to quit(按空格鍵繼續,按q鍵退出)”,禁用響鈴功能
-s       把連續的多個空行顯示為一行

在more查看交互式模式下可以允許執行的命令:
h :顯示幫助信息;
SPACE:空格鍵表示向後滾動一屏;
Ctrl+F:向下滾動一屏;
Ctrl+B:往上滾動一屏;
回車鍵:每次一行往下走;
=:顯示當前行號信息;
/PATTERN:查找匹配的行;
!command or :!command:執行shell命令;
q:退出;

1.2.11、less

分屏可逆文本查看器(對於大文本建議用more或less替代cat來查看文本內容)
大部分選項與more差不多,比more更加好用智能,不僅支持組合鍵,還支持方向鍵,上下一行一行切換。

選項:

-e:文件內容顯示完畢後,自動退出;
-f:強制顯示文件;
-g:不加亮顯示搜索到的所有關鍵詞,僅顯示當前顯示的關鍵字,以提高顯示速度;
-l:搜索時忽略大小寫的差異;
-N:每一行行首顯示行號;
-s:將連續多個空行壓縮成一行顯示;
-S:在單行顯示較長的內容,而不換行顯示;
-x<數字>:將TAB字符顯示為指定個數的空格字符。

/pattern:向下搜索“字符串”的功能
?pattern:向上搜索“字符串”的功能
n:重復前一個搜索(與 / 或 ? 有關)
N:反向重復前一個搜索(與 / 或 ? 有關)
Ctrl+F:向前翻一頁;
Ctrl+b:向後翻一頁;

1.2.12、pr

給文本輸出加上標題並按照指定行數或者默認行數分割多個頁面輸出
語法結構:
pr [OPTION]... [FILE]...

選項說明:

-h, --header=HEADER:為頁指定一個標題;
-l, --length=PAGE_LENGTH:指定每頁的行數;

舉例子:
a.> 查看默認行為
技術分享圖片

技術分享圖片

b.>顯式指明標題和每頁的行數

技術分享圖片

1.2.13、locate

摘抄:https://www.cnblogs.com/xqzt/p/5426666.html
locate(locate) 命令用來查找文件或目錄。 locate命令要比find -name快得多,原因在於它不搜索具體目錄,而是搜索一個數據庫/var/lib/mlocate/mlocate.db 。這個數據庫中含有本地所有文件信息。Linux系統自動創建這個數據庫,並且每天自動更新一次,因此,我們在用whereis和locate 查找文件時,有時會找到已經被刪除的數據,或者剛剛建立文件,卻無法查找到,原因就是因為數據庫文件沒有被更新。為了避免這種情況,可以在使用locate之前,先使用updatedb命令,手動更新數據庫。整個locate工作其實是由四部分組成的:

/usr/bin/updatedb   主要用來更新數據庫,通過crontab自動完成的
/usr/bin/locate         查詢文件位置
/etc/updatedb.conf   updatedb的配置文件
/var/lib/mlocate/mlocate.db  存放文件信息的文件,數據庫文件。

需要通過命令updatedb來生成或者更新mlocate.db(/var/lib/mlocate/mlocate.db)這個數據庫,否則會提示一下報錯:

[root@localhost ~]# locate ~/1
locate: can not stat () `/var/lib/mlocate/mlocate.db‘: No such file or directory

常用選項:

-c, --count:輸出匹配到的數量而非文件名;
-d, --database DBPATH:指定locate使用數據庫的路徑,替換默認的/var/lib/mlocate/mlocate.db;
-S, --statistics:統計信息,列出一些統計。
-q, --quiet:靜默模式查找;
-i, --ignore-case:查找的時候忽略字母大小寫;
-r, --regexp REGEXP:通過指定基本正則表達式模式匹配查找;
--regex:通過指定擴展正則表達式模式匹配查找;

舉例子:
a.> 基本查找,查找root默認家目錄下以數字1開頭的文件
技術分享圖片

b.> 手動添加一個文件,立即查找該文件是否可以通過locate查找到,驗證?
技術分享圖片

c.> 忽略大小寫和不忽略大小寫
技術分享圖片

d.> 查看統計信息
技術分享圖片

e.> 使用正則表達式(不允許指定文件查找路徑參數,直接在根下查找,謹慎使用)
技術分享圖片

1.2.14、head

輸出文本的起始部分內容

語法結構:
head [OPTION]... [FILE]...

常用選項:

-n, --lines=[-]K:指定顯示文件開頭的多少行內容,默認是10行;
-number:指定顯示文件開頭的多少行內容,是-n Number的簡寫;
-q, --quiet, --silent:如果head有讀入多個文本,抑制文件標簽部分的輸出(默認會輸出,分隔文件內容)。

舉例:
技術分享圖片

1.2.15、tail

輸出文本的尾部部分的內容

語法結構:
tail [OPTION]... [FILE]...

常用選項:

-n, --lines=K:顯示文本尾部指定多少行;
-Number:顯示文本尾部指定多少行;
-f, --follow[={name|descriptor}]:當文件增長的時候,輸出後邊的內容.
常用組合:
tail -f FILE.log,顯示10行內容,然後等待後續文件內容輸出;
tail -n0 -f FILE.log,不再顯示指定文件的10行,而是一行都不顯示,後續如果文件有新增,會顯示出來;

--pid=PID:常與-f一起調試使用。指定進程死掉後結束tail 這個進程。
-q, --quiet, --silent:如果tail有讀入多個文本,抑制文件標簽部分的輸出(默認會輸出,分隔文件內容)。

舉例:
技術分享圖片

1.2.16、tailf

跟蹤日誌文件內容(調試工具之一)
語法結構:
tailf [OPTION] file

選項:

-n, --lines=N, -N:指定輸出尾部的多少後並輸出監視模式下;

tailf FILE.log
tailf -0 FILE.log

類似於tail -f的工具,不過要比tail -f性能要高,調試可以用這個工具。

1.2.17、sort

排序文本文件行內容

語法結構:
sort [OPTION]... [FILE]...
sort [OPTION]... --files0-from=F

常用選項:

-t, --field-separator=SEP:指定單個分隔符(默認是空白)
-n, --numeric-sort:按照數字大小排序;
-r, --reverse:反轉排序;
-o, --output=FILE:把排序後結果輸出到指定文件中;
-k, --key=KEYDEF:排序的鍵起始位置

KEYDEF is F[.C][OPTS][,F[.C][OPTS]] for start and stop position, where F is a field number and C a character  position in the field; both are origin 1, and the stop position defaults to the line‘s end.  If neither -t nor -b is i
effect, characters in a field are counted from the beginning of the preceding whitespace.  OPTS is one or more sin
gle-letter  ordering  options  [bdfgiMhnRrV],  which  override  global ordering options for that key.  If no key i
given, use the entire line as the key.

SIZE may be followed by the following multiplicative suffixes: % 1% of memory, b 1, K 1024 (default), and so on for
M, G, T, P, E, Z, Y.

舉例:
技術分享圖片

技術分享圖片

技術分享圖片

1.2.18、uniq

報告或刪除重復的行
語法結構:
uniq [OPTION]... [INPUT [OUTPUT]]

常用選項:

-c, --count:在每列旁邊顯示該行重復出現的次數(要緊挨著的重復行才會計算次數);
-u, --unique:顯示非重復行,連續的相同的都被忽略;
-d, --repeated:只輸出有重復的行(既連續兩個以及以上向同行),滿足條件的行只輸出一次;
-D, --all-repeated[=METHOD]:輸出所有重復的行(只有連續兩的行才算重復的行);
-i, --ignore-case:

舉例:
技術分享圖片

技術分享圖片

1.2.19、printf

格式化輸出文本內容
語法結構:
printf FORMAT [ARGUMENT]...
printf OPTION

引用:http://man.linuxde.net/printf
技術分享圖片

1.2.20、column

格式化輸出文本,按照指定字符控制輸出多列(有點和awk某些用法類似)

語法結構:
column [options] file...

常用參數:

-t, --table:
-s, --separator separators:指定表輸入分隔符,要配合-t一起使用。
可以指定多個分隔符,類似於awk處理一樣,按照指定的分隔符切割後,
然後配置-t輸出,可以通過-o輸出分隔符。

-o, --output-separator separators:指定表輸出分隔符

舉例:
技術分享圖片

1.2.21、colrm

列刪除工具
語法結構:
colrm [first [last]]

colrm工具從指定文件中移除選擇的列。其輸入來自於標準輸入,可以通過管道形式給定文件。
默認輸出是標準輸出。如果指定參數只有一個,表示從指定列開始到最後一列的內容全部刪除,
如果指定參數有兩個表示從第一個參數指定的列開始到第二個參數指定的列結束之間的列的內容
全部刪除。兩個參數都省略,不會刪除,默認輸出所有文件內容。

舉例子:
技術分享圖片

1.2.22、od

以八進制或者其他格式轉儲文件內容(常用於查看二進制文件)
語法結構:
od [OPTION]... [FILE]...
od [-abcdfilosx]... [FILE] [[+]OFFSET[.][b]]
od --traditional [OPTION]... [FILE] [[+]OFFSET[.][b] [+][LABEL][.][b]]

用的並不是很多,有時候用來分析特殊二進制文件或者特殊格式數據文件(普通文本文件無法參看)。

1.2.23、cp

復制文件或目錄(文件)

1.2.24、mv

移動或重命名文件

1.2.25、touch

改變文件時間戳屬性(可以創建普通文本文件)

1.2.26、stat

1.2.27、mkdir

創建目錄(文件)

1.2.28、rmdir

刪除空目錄(文件)

1.2.29、rm

刪除文件或目錄(危險基礎指令top10之一)

1.2.30、tr

轉換或刪除字符

以上這部分的內容,請參見上一部分:(這部分是非常常用的,上次做了總結,這裏時間關系,先引用一下)
http://blog.51cto.com/9657273/2171648

1.2.31、mkfifo

建命名管道(有名管道)文件
語法結構:
mkfifo [OPTION]... NAME...

常用選項:

-m, --mode=MODE:
-Z, --context[=CTX]:

舉例:
技術分享圖片

關於有名管道和匿名管道,可以參考:(引用博文)
https://blog.csdn.net/qq_33951180/article/details/68959819

1.2.32、ln 在文件之間做鏈接關系

語法結構:
ln [OPTION]... [-T] TARGET LINK_NAME (1st form)
ln [OPTION]... TARGET (2nd form)
ln [OPTION]... TARGET... DIRECTORY (3rd form)
ln [OPTION]... -t DIRECTORY TARGET... (4th form)

常用選項:

-f, --force:
-i, --interactive:
-P, --physical:
-s, --symbolic:

舉例:
技術分享圖片

這裏只是簡單的舉例說明了,如果要弄清原理,下次磁盤分區知識哪一塊,我會重新說明。

1.2.33、du

評估文件實際空間使用情況
語法結構:
du [OPTION]... [FILE]...

常用選項:

-h, --human-readable:易於讀的方式顯示大小;
--inodes:統計inode使用情況
-k     like --block-size=1K:kb
-s, --summarize:統計

用的最多的也就是一個du -sh file...
技術分享圖片

二、bash展開特性

2.1、花括號展開(brace expansion,{})

在{} (大括號,花括號)內,可以是以逗號(,)分隔的字符串,也可以是一個序列的表達式。
大括號前後可以跟前綴和後綴。

1.逗號分隔

[root@zabbix-server ~]# echo a{b,c,d}e
abe ace ade

2.序列表達式
‘{X..Y[..INCR]}‘
X,Y是數字或單個字符,INCR是步長。
當X和Y是數字時,展開為X和Y的所有數字。數字可加前綴0,例如:01,001等

當X和Y以0開頭時,shell嘗試將生成的結果保持相同的廣度,必要的時候會用0填充。
常見形式:{0..10},{a..z},{0..100..2},{a..z..2}等等,請看下面的示例:

[root@zabbix-server ~]# echo {0..10}
0 1 2 3 4 5 6 7 8 9 10
[root@zabbix-server ~]# echo {0..10..2}
0 2 4 6 8 10
[root@zabbix-server ~]# echo {0..10..3}
0 3 6 9
[root@zabbix-server ~]# echo {0..20..5}
0 5 10 15 20
[root@zabbix-server ~]# echo {a..z..3}
a d g j m p s v y

2.2、波浪線展開(tilde expansion,~)

~可以表示當前登錄用戶家目錄,及$HOME的值(echo $HOME)
這裏還有兩種特殊情況,一種是~+,一種是~-。在說這兩種特殊情況前,我們先來介紹兩個變量,
一個是PWD,一個是OLDPWD。
PWD表示當前所在shell的工作目錄;
OLDPWD表示上一次切換目shell的工作目錄,我們的cd -做目錄來回對切的時候,就引用了這兩個環境變量。

當遇到~+的時候,例如~+/lib,就會把~+替換成$PWD,即${PWD}/lib;
當遇到~-的時候,例如~-/lib,就會把~-替換成$OLDPWD,即${OLDPWD}/lib;

技術分享圖片

2.3、參數和變量展開(parameter and variable expansion )

參數和變量替換有很多高級用法,我這邊就簡單引入一些概念,具體詳細用法,還是要查看手冊。
以符號$引起來的字符串,例如${a},$a,${a_b}等,都表示一個變量;${STRINGS}中間STRINGS部分表示的是
參數,這部分可能會做替換的。常見形式有:


${parameter}
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word}
${parameter:offset}
${parameter:offset:length}
${!prefix*}
${!prefix@}
${!name[@]}
${!name[*]}
${#parameter}
${parameter#word}
${parameter##word}
${parameter%word}
${parameter%%word}
${parameter/pattern/string}
${parameter^pattern}
${parameter^^pattern}
${parameter,pattern}
${parameter,,pattern}

2.4、命令替換(command substitution)

命令替換常見的兩種形式:
$(命令)
命令

示例:
技術分享圖片

2.5、算數運算展開(arithmetic expansion)

形式:
$((算數表達式))

示例:
技術分享圖片

2.6、單詞分割(word splitting)

bash手冊中翻譯的部分:
在單詞拆分時,shell會掃描參數擴展、命令替換和算術運算的結果,如果它們不是在雙引號之間進行
的。
shell會把$IFS 中的每個字符都當成分隔符,並按照這些字符把其它擴展的結果拆分成單詞。如果
$IFS 沒有設置,或者它的值和默認的<space><tab><newline> 完全一樣,那麽在前述擴展的結果中開頭或
結尾出現的由<space>、<tab>、或者<newline> 構成的序列就會被忽略;而由$IFS 中任意字符組成的序
列如果不是出現在頭部或尾部就成為單詞的分隔符。如果$IFS 的值不是默認的並且含有由空格和制表符這
兩個空白符(稱為$IFS 分隔符)構成的空白符,則如果在單詞的頭部或尾部出現就會被刪除。$IFS 中除了
空白符以外的任何字符,包括與其毗鄰的空白符,就成為字段的分隔符;由$IFS 空白符組成的序列也是分
隔符。如果$IFS 的值為空,則不拆分單詞。
明確表示的空參數("" 或‘‘)會被保留下來。由沒有設置值的參數擴展後得到的未被引用的隱含空參
數會被刪除。如果沒有設置值的參數在雙引號之間擴展,則結果的空值會被保留。
註意,如果沒有進行擴展,則也不會進行單詞拆分。

PS:涉及循環流程語句部分,這裏不舉例不說明。(後面補充)

2.7、路徑展開(pathname expansion)

有些bash內建特性以及set值,這裏不做說明,我們主要來說說模式匹配。(比如nullglob,nocaseglo等)
bash瀏覽的時候會把以下幾個字符當作特殊字符處理,一般處理,關鍵字會被作為一個pattern來處理。
特別的pattern字符以及含義如下:
* 匹配任意長度的任意字符,包括空;
? 匹配任意單個字符
[...] 匹配指定範圍內的單個字符,以下幾種形式:
[a-z],[A-Z],[0-9],[a-z0-9],[a-zA-Z0-9]等等。
[[:upper:]] 表示所有大寫字母;
[[:lower:]] 表示所有小寫字母;
[[:alpha:]] 表示所有字母;
[[:digit:]] 表示所有數字;
[[:alnum:]] 表示所有字母和數字;
[[:space:]] 表示所有空白字符;
[[:punct:]] 表示所有標點符號;
[^...] 匹配指定範圍內的單個字符;

三、特性應用舉例

3.1、文件的元數據查看以及修改說明

文件元數據可以通過stat命令來查看:

[root@ACA86E6E ~]# stat anaconda-ks.cfg 
  File: ‘anaconda-ks.cfg’
  Size: 1422        Blocks: 8          IO Block: 4096   regular file
Device: 803h/2051d  Inode: 67157059    Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Context: system_u:object_r:admin_home_t:s0
Access: 2018-08-07 21:41:15.525992412 +0800
Modify: 2018-08-07 21:41:15.530992412 +0800
Change: 2018-08-07 21:41:15.530992412 +0800
 Birth: -

[root@ACA86E6E ~]# stat -t anaconda-ks.cfg
anaconda-ks.cfg 1422 8 8180 0 0 803 67157059 1 0 0 1533649275 1533649275 1533649275 0 4096 system_u:object_r:admin_home_t:s0

[root@ACA86E6E ~]# stat -f anaconda-ks.cfg 
  File: "anaconda-ks.cfg"
    ID: 80300000000 Namelen: 255     Type: xfs
Block size: 4096       Fundamental block size: 4096
Blocks: Total: 12314752   Free: 12058672   Available: 12058672
Inodes: Total: 24641536   Free: 24615302

選項:
        -f,--file-system  display file system status instead of file status,顯示文件系統的狀態信息
        -t,--terse print the information in terse form,以精簡的格式顯示打印的信息
        -L, --dereference follow links,表示查看的是符號鏈接文件的原始文件
        -c  --format=FORMAT 自定義輸出格式,幾位有換行

        文件輸出格式有以下:(以下自定義輸出,在我們寫腳本的時候非常有用)
        %a     access rights in octal,八進制訪問權限,比如600
        %A     access rights in human readable form,十位格式權限位,4段(文件類型,屬主,屬組,其他者)
        %b     number of blocks allocated (see %B),已經分配的塊的數量
        %B     the size in bytes of each block reported by %b , 以字節為單位輸出%b所報告的每個塊的大小
        %C     SELinux security context string,SElinux 安全上下文字符串
        %d     device number in decimal , 10進制設備編號
        %D     device number in hex , 16進制設備編號
        %f     raw mode in hex,16進制原始模式
        %F     file type,文件類型
        %g     group ID of owner ,文件所屬組的組id
        %G     group name of owner,文件所屬組的組名字
        %h     number of hard links,文件硬鏈接的個數
        %i     inode number,文件的索引編號(inode)
        %m     mount point,掛載點(有時候識別不了)
        %n     file name,文件名
        %N     quoted file name with dereference if symbolic link,如果是符號鏈接文件,會以符號鏈接文件指向原始文件,例如:‘test1233’ -> ‘anaconda-ks.cfg’
        %o     optimal I/O transfer size hint,IO塊大小
        %s     total size, in bytes,文件總字節大小
        %t     major device type in hex, for character/block device special files,如果是特殊字符或者塊設備,顯示主設備號,如果不是,顯示為0;
        %T     minor device type in hex, for character/block device special files,如果是特殊字符或者塊設備,顯示輔設備號,如果不是,顯示為0;
        %u     user ID of owner,文件屬主id
        %U     user name of owner,文件屬主名
        %w     time of file birth, human-readable; - if unknown,文件創建時間,若未知則顯示"-",CentOS 7添加的,CentOS 6系列沒有這個屬性
        %W     time of file birth, seconds since Epoch; 0 if unknown,從UNIX 元年起以秒計的文件創建時間,若未知則顯示"0"
        %x     time of last access, human-readable,文件上一次的訪問時間
        %X     time of last access, seconds since Epoch,從UNIX 元年起以秒計的上次訪問時間
        %y     time of last modification, human-readable,文件上一次的修改時間
        %Y     time of last modification, seconds since Epoch,從UNIX 元年起以秒計的上次修改時間
        %z     time of last change, human-readable,文件上一次的改變時間
        %Z     time of last change, seconds since Epoch, 從UNIX 元年起以秒計的上次改變時間

        有效的文件系統輸出格式:(以下自定義輸出,在我們寫腳本的時候非常有用)
         %a     free blocks available to non-superuser,非管理員用戶剩余可用的塊數量;
         %b     total data blocks in file system,文件系統總數據塊數量;
         %c     total file nodes in file system,文件系統總節點數量;
         %d     free file nodes in file system,文件系統空閑節點數量;
         %f     free blocks in file system,文件系統空閑的塊數量;
         %i     file system ID in hex,十六進制文件系統ID;
         %l     maximum length of filenames,允許文件名的最大長度;
         %n     file name,文件名
         %s     block size (for faster transfers),用於傳輸的傳輸的塊大小
         %S     fundamental block size (for block counts),用於塊計數的基本塊大小;
         %t     file system type in hex,以16進制描述文件系統類型;
         %T     file system type in human readable form,以名字(很好理解的方式)描述文件系統類型,例如xfs,ext2/ext3等

正常的文件查看信息說明:
File:表示stat查看的文件名;
Size:表示stat查看的文件的大小;
Blocks:表示已經分配的塊的數量,如果每個塊512字節,那麽一共4096字節;
IO Block:IO塊大小;
regular file:表示查看的文件為常規文件
Device:16進制設備號/10進制設備號
Inode:stat查看的文件的inode編號;
Links:stat查看的文件的硬鏈接數;
Access:八進制權限/字符權限位(10位)
Uid:文件屬主id編號/     文件屬主名
Gid:文件屬組id編號/     文件屬組名
Context:SElinux 安全屬性
Access:文件最近一次的訪問時間(年-月 -日 時:分:秒.毫秒 時區)
Modify:文件最近一次的修改時間(年-月 -日 時:分:秒.毫秒 時區)
Change:文件最近一次的改變時間(年-月 -日 時:分:秒.毫秒 時區)
Birth:文件的創建時間,為"-"表示不識別;

正常的文件系統查看信息說明:
File:stat查看的文件名;
ID:十六進制文件系統ID;
Namelen:文件系統允許最大的文件名長度;
Type:文件系統類型;
Block size:用於傳輸的塊大小;
Fundamental block size:基本塊大小(用於塊計算的)
Blocks:文件系統塊統計信息,下面是說明
        Total:文件系統總數據塊數量;
        Free:文件系統空余的塊數量;
        Available:文件系統非管理員用戶可用的塊數量;
Inodes:文件系統的索引編號信息,下面是說明
        Total:文件系統總索引編號數量;
        Free:文件系統空余索引編號數量;

不是所有的元數據都可以修改,我們舉一個參見的touch,可以用來修該部分元數據信息。

touch:
語法結構:
touch [OPTION]... FILE...

選項:

-a     change only the access time,只改變時間戳的訪問時間;
-c, --no-create ,不創建文件;
-d, --date=STRING:使用STRING指定的時間,而不是當前系統時間;
-m     change only the modification time,只改變時間戳的修改時間;
-t STAMP
    use [[CC]YY]MMDDhhmm[.ss] instead of current time,使用指定格式時間,而不是當前系統時間。
--time=WORD
WORD可以為access或atime表示修改訪問時間屬性,可以為modify或mtime表示修改 修改時間屬性;

示例:
a.>根據系統時間創建一個新的文件
技術分享圖片
b.> 根據指定時間創建一個新的文件
技術分享圖片

c.> 修改文件訪問時間
技術分享圖片

d.> 修改文件 修改時間
技術分享圖片

3.3、bash 模式匹配特性以及應用

練習1:利用展開,來創建目錄

技術分享圖片

練習2:顯示/var目錄下所有以l開頭,以一個小寫字母結尾,且中間至少出現一位數字(可以有其他字符)的文件或目錄

ls /var/l*[0-9]*[[:lower:]]

技術分享圖片

練習3:顯示/etc目錄下,以任意一個數字開頭,且以非數字結尾的文件或目錄

ls -d /etc/[0-9]*[^0-9]

技術分享圖片

練習4:顯示/etc目錄下,以非字母開頭,後面跟一個字母以及其他任意長度任意字符的文件或目錄

ls /etc/[^a-zA-Z][[:alpha:]]* 

技術分享圖片

練習5:在/tmp目錄下創建以tfile開頭,後面跟當前日期和時間的文件,文件名形如:tfile-2016-05-27-09-32-22

touch /tmp/tfile-$(date +%Y-%m-%d-%H-%M-%S)

技術分享圖片

練習6:復制/etc目錄下所有以p開頭,以非數字結尾的文件或目錄到/tmp/mytest1目錄中

cp -r /etc/p*[^0-9] /tmp/mytest1/

技術分享圖片

練習7:復制/etc目錄下所有以l或m或n開頭,以.conf結尾的文件至/tmp/mytest3目錄中

cp -r /etc/[lmn]*.conf /tmp/mytest3/

技術分享圖片

linux下部分文件管理類基本命令匯總以及bash展開特性介紹