mkdir:命令
1、命令詳解
【功能說明】
mkdir命令是“make directories”中每個單詞的粗體字母組合而成,其功能是創建目錄,默認情況下,如果要創建的目錄已經存在,則會提示此文件已經存在;而不會繼續創建目錄
【語法格式】
mkdir [option] [directory] mkdir [選項] [目錄] |
【選項說明】
參數選項 |
解釋說明(帶 Δ 的為重點) |
-p |
- 遞歸創建目錄,遞歸的意思是父目錄及其子目錄的子目錄 Δ
- 即使要創建的目錄實現已存在也不會報錯提示目錄已經存在
|
-m |
設置新創建目錄的默認目錄對應的權限 |
-v |
顯示創建目錄的過程 |
2、使用案例
1、基礎范例
案例1、不使用任何命令參數創建目錄用法示例。
我們先來查看下當前的目錄樹結構,命令如下:
[root@1-230 ~]# cd [root@1-230 ~]# tree -d . #根據結果可以看出當前目錄下沒有任何目錄 0 directories |
開始測試創建目錄,並檢查:
[root@1-230 ~]# mkdir data #在當前目錄下創建data目錄,此處data是相對路徑 [root@1-230 ~]# tree -d . └── data #可以看到data目錄已經創建。 1 directory [root@1-230 ~]# mkdir data #再次執行創建命令會提示目錄已經存在。 mkdir: 無法創建目錄"data": 文件已存在 |
擴展知識:
windows下的目錄路徑樣式為d:\data\test,而linux下的路徑樣式為/data/test,它們的目錄頂點和分隔符均不同。
案例2:使用-p參數遞歸創建目錄
當我們創建多級目錄時,如果第一級目錄(cc)不存在,那么我們創建結果會報錯,導致無法創建成果,操作如下:
[root@1-230 ~]# mkdir cc/test mkdir: cannot create directory 'cc/test': No such file or directory #提示沒有這個文件或目錄 |
此時,可以指定-P參數遞歸創建多級目錄:
[root@1-230 ~]# mkdir -p cc/test [root@1-230 ~]# tree -d . |-- cc | `-- test `-- data 3 directories |
使用mkdir創建多級目錄時,建議直接使用-p參數,可以避免出現“no such file or directory”這樣沒有文件或目錄的報錯了,不會影響已存在的目錄。
案例3:加-v參數顯示創建目錄的過程。
使用-v參數顯示創建目錄的詳細過程,具體操作命令如下:
[root@1-230 ~]# mkdir -pv aa/test mkdir: created directory 'aa' mkdir: created directory 'aa/test' |
提示:
其實這個-v沒有什么實際用途。
案例4:創建目錄時可使用-m參數設置目錄的默認權限。
[root@1-230 ~]# mkdir dir1 [root@1-230 ~]# ls -ld dir1 #ls命令的使用方法見后面的ls命令 drwxr-xr-x 2 root root 6 Oct 22 22:00 dir1 #創建該目錄默認權限為755 [root@1-230 ~]# mkdir -m 755 dir2 #創建目錄時指定755的數字權限 [root@1-230 ~]# ls -ld dir2 drwxr-xr-x 2 root root 6 Oct 22 22:00 dir2 #可以看到權限已經發生變化了 |
提示:
有關權限的知識可參數后面的chmod命令
案例5:技巧性范例,
同時創建多個目錄及多級子目錄。
在生產環境中,常常需要創建目錄用來存放文件,如果同時創建多個目錄並且每個目錄下可能還有很多個子目錄,哪就需要執行多次mkdir命令,這種做法比較不妥,事實上,我們可以使用mkdir命令同時創建多個多級目錄,具體命令操作如下:
[root@1-230 ~]# mkdir -pv aa/{dir1_1,dir1_2}/{dir2_1,dir2_2} #大括號{} 里用逗號分隔 mkdir: created directory 'aa' mkdir: created directory 'aa/dir1_1' mkdir: created directory 'aa/dir1_1/dir2_1' mkdir: created directory 'aa/dir1_1/dir2_2' mkdir: created directory 'aa/dir1_2' mkdir: created directory 'aa/dir1_2/dir2_1' mkdir: created directory 'aa/dir1_2/dir2_2' [root@1-230 ~]# tree -d aa/ #上面創建的目錄命令所對應的目錄結構如下。 aa/ |-- dir1_1 | |-- dir2_1 | `-- dir2_2 `-- dir1_2 |-- dir2_1 `-- dir2_2 6 directories [root@1-230 ~]# mkdir -p cc/dir1_{1..3}/dir2_{1..3}/dir3_{a..c} #{1..3} 以及 {a..c}表示序列 [root@1-230 ~]# tree -d cc/ cc/ |-- dir1_1 | |-- dir2_1 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | |-- dir2_2 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | `-- dir2_3 | |-- dir3_a | |-- dir3_b | `-- dir3_c |-- dir1_2 | |-- dir2_1 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | |-- dir2_2 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | `-- dir2_3 | |-- dir3_a | |-- dir3_b | `-- dir3_c `-- dir1_3 |-- dir2_1 | |-- dir3_a | |-- dir3_b | `-- dir3_c |-- dir2_2 | |-- dir3_a | |-- dir3_b | `-- dir3_c `-- dir2_3 |-- dir3_a |-- dir3_b `-- dir3_c 39 directories [root@1-230 ~]# mkdir -p bb/dir1{1..3}/dir2{1..3}/dir3{a..c} # [root@1-230 ~]# tree -d bb/ bb/ |-- dir11 | |-- dir21 | | |-- dir3a | | |-- dir3b | | `-- dir3c | |-- dir22 | | |-- dir3a | | |-- dir3b | | `-- dir3c | `-- dir23 | |-- dir3a | |-- dir3b | `-- dir3c |-- dir12 | |-- dir21 | | |-- dir3a | | |-- dir3b | | `-- dir3c | |-- dir22 | | |-- dir3a | | |-- dir3b | | `-- dir3c | `-- dir23 | |-- dir3a | |-- dir3b | `-- dir3c `-- dir13 |-- dir21 | |-- dir3a | |-- dir3b | `-- dir3c |-- dir22 | |-- dir3a | |-- dir3b | `-- dir3c `-- dir23 |-- dir3a |-- dir3b `-- dir3c 39 directories |
擴展知識:
大括號( { } )的特殊用法。
在{ } 中使用逗號分隔多個字符或單詞時,使用echo命令可以將這些被分隔的字符或單詞分別輸出到屏幕上,示例如下:
[root@1-230 ~]# echo {a,c} #會輸出a c到屏幕上。 a c |
如果{ }前有字符時,輸出結果如下:
[root@1-230 ~]# echo 1{2,3} 12 13 [root@1-230 ~]# echo 1{,3} #如果逗號前面什么都沒有,可以認為是一個空字符串。 1 13 |
3、生產案例
案例1:克隆目錄結構
[root@1-230 ~]# tree -fid --noreport cc #顯示所有目錄樹,--noreport不顯示最后一行統計信息,也可以用find命令輸出下面的目錄樹。 cc cc/dir1_1 cc/dir1_1/dir2_1 cc/dir1_1/dir2_1/dir3_a cc/dir1_1/dir2_1/dir3_b cc/dir1_1/dir2_1/dir3_c cc/dir1_1/dir2_2 cc/dir1_1/dir2_2/dir3_a cc/dir1_1/dir2_2/dir3_b cc/dir1_1/dir2_2/dir3_c cc/dir1_1/dir2_3 cc/dir1_1/dir2_3/dir3_a cc/dir1_1/dir2_3/dir3_b cc/dir1_1/dir2_3/dir3_c cc/dir1_2 cc/dir1_2/dir2_1 cc/dir1_2/dir2_1/dir3_a cc/dir1_2/dir2_1/dir3_b cc/dir1_2/dir2_1/dir3_c cc/dir1_2/dir2_2 cc/dir1_2/dir2_2/dir3_a cc/dir1_2/dir2_2/dir3_b cc/dir1_2/dir2_2/dir3_c cc/dir1_2/dir2_3 cc/dir1_2/dir2_3/dir3_a cc/dir1_2/dir2_3/dir3_b cc/dir1_2/dir2_3/dir3_c cc/dir1_3 cc/dir1_3/dir2_1 cc/dir1_3/dir2_1/dir3_a cc/dir1_3/dir2_1/dir3_b cc/dir1_3/dir2_1/dir3_c cc/dir1_3/dir2_2 cc/dir1_3/dir2_2/dir3_a cc/dir1_3/dir2_2/dir3_b cc/dir1_3/dir2_2/dir3_c cc/dir1_3/dir2_3 cc/dir1_3/dir2_3/dir3_a cc/dir1_3/dir2_3/dir3_b cc/dir1_3/dir2_3/dir3_c [root@1-230 ~]# tree -fid --noreport cc >> ~/cc.test #將目錄樹內容追加到家目錄下的cc.txt文件里 [root@1-230 ~]# cd /tmp/ [root@1-230 tmp]# mkdir -p `cat ~/cc.test` #mkdir命令后面可以接很多目錄名稱批量創建目錄,但是如果將所有目錄都放在mkdir命令后面勢必會導致命令太長,因此這里采用了一個巧妙的用法,使用了一對反引號(在鍵盤ESC下方),反引內部使用cat命令讀取~(家目錄下的cc.txt文件內容, 這個文件內容就包含了所有的目錄名稱。最后大家要知道的是,一個命令語句中如果反引號包含的命令,那么需要優先執行反引號中的命令語句,就像本例應先執行cat命令,然后執行mkdir命令,cat命令使用方法見cat命令) [root@1-230 tmp]# tree -d /tmp/cc #查看上述命令操作結果 /tmp/cc |-- dir1_1 | |-- dir2_1 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | |-- dir2_2 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | `-- dir2_3 | |-- dir3_a | |-- dir3_b | `-- dir3_c |-- dir1_2 | |-- dir2_1 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | |-- dir2_2 | | |-- dir3_a | | |-- dir3_b | | `-- dir3_c | `-- dir2_3 | |-- dir3_a | |-- dir3_b | `-- dir3_c `-- dir1_3 |-- dir2_1 | |-- dir3_a | |-- dir3_b | `-- dir3_c |-- dir2_2 | |-- dir3_a | |-- dir3_b | `-- dir3_c `-- dir2_3 |-- dir3_a |-- dir3_b `-- dir3_c 39 directories |