文件和目錄管理涉及的命令比較多,在現存的各個版本的Linux系統中,各命令功能大體相同。
6.11.1 文件和目錄操作常用通配符
在Linux文件系統中,可以使用通配符來匹配多個選擇。常用的通配符及其說明如表6.14所示。
表6.14 常用通配符及其說明
通 配 符 | 說 明 |
* | 用來代表文件中任意長度的任意字符 |
? | 用來代表文件中的任一個字符 |
[…] | 匹配任意一個在中括號中的字符, 中括號里可以是一個用破折號 格式表示的字母或數字范圍 |
前導字符串 {…} 后 繼字符串 | 大括號中的字符串逐一匹 配前導字符串和后繼字符串 |
例如當前目錄下存在cars 、cat、can、cannon、truck、bus和bike等幾個文件,要列出所有以字母"c"開頭的文件,可使用命令:
#touch car cats can cannon truck bus bike
#ls c*
cars can cannon
列出所有以字母"b"開頭的文件名,命令行為:
#ls b*
bike bus
列出所有第一個字母為"c",最后一個字母為"n"的文件,命令行為:
#ls c*n
can cannon
列出包含字母"a"的所有文件,命令行為:
#ls *a*
cars cat can cannon
列出當前目錄下的所有文件,命令行為:
#ls *
bike bus cars cat can cannon truck
通配符"?"只能匹配任意一個字符。例如列出上例中所有第三個字母是"n"的文件,命令行為:
#ls ??n*
can cannon
列出第一個字母是"b",第三個字母是"s"的所有文件,命令行為:
#ls b?s*
bus
中括號表示一個匹配的字符集,例如[123456]與[1-6]都表示數字1、2、3、4、5和6。大寫字母A到D之間的任意一個字符可用[A-D]表示。多個集合之間可以用逗號分隔,例如[1-10,a-z,A-Z]表示數字1到10,小寫字母a到小寫字母z及大寫字母A到大寫字母Z。一個集合中若有前綴"!",則表示除了集合中包含的字符以外的所有字符組成的集合。如表示所有的輔音組成的字符集可寫成[!aeiou]。例如要顯示上例中所有以字母b 或c開頭的文件名,命令行為:
#ls [b,c]*
bike bus car cat can cannon
又如列出所有以字母b或c開頭,以字母s或k 結尾的文件,命令行為:
#ls [b,c]*[s,k]
bus cars
大括號是用來查找文件的一個常用方法,例如以長格式列出cars、cans和cats文件的信息,可以使用命令:
#ls -l c{ar,an,at}s
6.11.2 ls或dir命令:列出當前目錄的內容
ls(list的縮寫)命令可以列出當前目錄的內容。dir命令是ls命令的一個別名,也是directory的縮寫。通常列出的文件會以不同的顏色進行顯示,不同的顏色代表不同的文件類型,表6.15列出了文件類型與顏色的對應關系。
表6.15 文件類型與顏色的對應關系
文件類型 | 顏 色 |
目錄 | 深藍色 |
一般文件 | 淺灰色 |
執行文件 | 綠色 |
圖形文件 | 紫色 |
鏈接文件 | 淺藍色 |
壓縮文件 | 紅色 |
FIFO 文件(命名管道) | 棕色 |
設備文件 | 黃色 |
ls還會對特定類型的文件用符號進行標識,表6.16列出了常用的標識符號及其說明。
表6.16 特定文件類型標識符及其說明
符 號 | 說 明 |
. | 表示隱藏文件 |
/ | 表示一個目錄名 |
* | 表示一個可執行文件 |
@ | 表示一個符號鏈接文件 |
| | 表示管道文件 |
= | 表示 socket 文件 |
ls命令的格式如下:
ls [選項] 目錄或文件名
其中各選項意義如下。
-a:列出指定目錄下所有文件和子目錄的信息(包括隱含文件)。
-A:同-a,但不列出. 和..。
-b:當文件名中有不可顯示的字符時,將顯示該字符的八進制數字。
-c:按文件的最后修改時間排序。
-C:分成多列顯示。
-d:顯示目錄名而不是顯示目錄下的內容,一般與-l連用。
-f:在列出的文件名后加上符號來區別不同類型。
-R:遞歸地顯示指定目錄的各級子目錄中的文件。
-s:給出每個目錄項所用的塊數,包括間接塊。
-t:按最后修改時間排序(新的在前,舊的在后)。
-l:以長格式顯示文件的詳細信息,包括文件的類型與權限、鏈接數、文件所有者、文件所有者所屬的組、文件大小、最近修改時間及文件名,詳情見圖6.4。
下面以不同的格式顯示目錄的內容:
# ls //以縮略格式顯示目錄內容
cal_txt finger_txt id_txt newgrp_txt
suple_txt who.txtfinger2_txt groups_txt last_txt suple3_txt
suple_txt~ w.txtfinger3_txt groups_txt2 ln suple3_txt~ w
# ls -l //以長格式顯示目錄內容,包括權限、
用戶名、修改時間等總計 224
-rw-r--r-- 1 root root 2163 07-24 13:00 cal_txt
-rw-r--r-- 1 root root 212 07-23 06:37 finger2_txt
-rw-r--r-- 1 root root 0 07-23 06:39 finger3_txt
-rw-r--r-- 1 root root 248 07-23 06:31 finger_txt
-rw-r--r-- 1 root root 35 07-23 04:22 groups_txt
-rw-r--r-- 1 root bin 140 07-23 04:32 groups_txt2
-rw-r--r-- 1 root root 144 07-23 04:11 id_txt
-rw-r--r-- 1 root root 1655 07-22 19:19 last_txt
drwxr-xr-x 5 root root 4096 07-26 09:42 ln
-rw-r--r-- 1 root bin 143 07-23 04:24 newgrp_txt
-rw-r--r-- 1 root root 25098 07-26 19:15 suple3_txt
-rw-r--r-- 1 root root 24031 07-26 16:00 suple3_txt~
-rw-r--r-- 1 root root 25198 07-24 20:16 suple_txt
-rw-r--r-- 1 root root 24827 07-24 20:06 suple_txt~
-rw-r--r-- 2 root root 196 07-23 06:48 w
-rw-r--r-- 1 root root 46 07-23 06:48 who.txt
-rw-r--r-- 2 root root 196 07-23 06:48 w.txt
# ls -s //顯示所用的塊數
總計 224
8 cal_txt 8 groups_txt 8 ln
32 suple_txt 8 w.txt8 finger2_txt 8 groups_txt2 8 newgrp_txt
32 suple_txt~4 finger3_txt 8 id_txt 32 suple3_txt 8 w
8 finger_txt 8 last_txt 28 suple3_txt~ 8 who.txt
選項可以組合使用。例如,如果需要列出當前目錄的所有內容(包括那些以"."開頭的隱含文件),并以"冗余格式"在屏幕上輸出文件的詳細信息,可以使用選項"-al"。以冗余格式顯示/root目錄下的所有文件,可以使用命令:
# ls -al /root
drwxr-x--- 18 root root 4096 07-26 16:00 .
//當前目錄drwxr-xr-x 24 root root 4096 07-25 05:43 ..
//父目錄-rw------- 1 root root 997 07-15 20:58
anaconda-ks.cfg //普通文件-rw------- 1 root root 2827 07-24 21:32
.bash_history //隱藏文件-rw-r--r-- 1 root root 24 2006-07-13
.bash_logout //隱藏文件… …
其中文件名為"."表示當前目錄,對應行列出了當前目錄的詳細信息。文件名為".."表示當前目錄的上一級目錄,即父目錄,對應行列出了父目錄的詳細信息。文件名前有"."符號的文件是隱藏文件,只有使用了"-a"參數才會顯示出來。
6.11.3 cd命令:更改當前目錄
cd(Chage Directory)命令用于更改當前目錄,表6.17列出了常用的cd命令與運行說明。
表6.17 cd命令與運行說明
命 令 | 說 明 |
cd | 切換到當前用戶的主目錄 |
cd .. | 切換到當前目錄的上一層目錄,例 如當前目錄為 /home/student ,使用該 命令可以將當前目錄移到 /home |
cd ../.. | 切換到當前目錄的上二層目錄,例如 當前目錄為 /home/student/student1 ,使 用該命令可以將當前目錄移動到 /home |
cd ~ | 切換當前目錄為當前用戶的主目錄, 適用于任何用戶 |
cd / | 切換當前目錄到根目錄,即返回到 / |
注意:在Linux中,引用目錄名、計算機名或域名時使用正斜杠"/",而在Windows中需使用反斜杠"\"。
例如當前系統中存在目錄結構如圖6.9所示,其中用戶當前目錄為/home/student。
![]() |
圖6.9 目錄結構圖 |
若改變當前目錄為/home/director,可以使用相對路徑,命令如下:
#pwd
/home/student
#cd ../director
#pwd
/home/director
也可以使用絕對路徑切換到/home/director,命令如下:
#pwd
/home/student
#cd /home/director
#pwd
/home/director
將當前目錄由/home/student切換為/home/student/student1,由于student1目錄位于student目錄下,可以采用相對路徑:
#pwd
/home/student
#cd student1
#pwd
/home/student/student1
也可以采用絕對路徑,命令如下:
#pwd
/home/student
#cd /home/student/student1
#pwd
/home/student/student1
從student1目錄返回根目錄,可以使用命令:
#pwd
/home/student/student1
#cd /
#pwd
/
也可以使用相對路徑,命令行為:
#pwd
/home/student/student1
#cd ../../..
#pwd
/
6.11.4 cp 命令:復制目錄或文件
cp命令用于實現文件或目錄的復制,與DOS下的copy命令相似。cp命令格式如下:
cp [選項] 源文件或目錄 目標文件或目錄
其中各可用選項意義如下。
-a:常在復制目錄時使用。該選項保留鏈接、文件屬性,并遞歸地復制目錄。
-f:如果目標文件或目錄已存在,就覆蓋它,并且不做提示。
-i:與-f選項正好相反,在覆蓋已有文件時,會讓用戶輸入"Y"來確認。
-r:若給出的源是一個目錄,那么cp 將遞歸復制該目錄下所有的子目錄和文件,不過這要求目標也是一個目錄名。
常用的cp命令行組合與運行結果見表6.18。
表6.18 cp命令格式與運行結果
命令格式 | 運行結果 |
cp 文件 1 文件 2 | 復制源文件 1 的內容到目標 文件 2 上,目標文件有一個新 的創建日期和節點索引號 |
cp 多個文件 (文件名之間用 空格分隔)目錄 1 | 復制多個文件到目錄 1 中 |
cp -f 文件 1 文件 2 | 如果已有一個文件 2 存在, 該命令不顯示任何提示就用 文件 1 覆蓋文件 2 |
cp -i 文件 1 文件 2 | 如果已有一個文件 2 存在,該 命令在覆蓋文件 2 之前會給出提示 |
cp -p 目錄 1 目錄 2 | 復制目錄 1 的內容到目錄 2 ,如 果目錄 1 下還有子目錄,則一并進行復制 |
cp -u 文件 1 文件 2 | 如 果文件 2 已存在,但文件 1 比 文件 2 新,則不顯示任何提示就覆蓋文件 2 |
例如把a.txt 和b.txt文件復制到/home/teacher目錄中,命令行如下:
#cp a.txt b.txt /home/teacher
cp命令可以在同一目錄下,換名復制一個文件,源文件保持不變。例如將當前目錄下的a.txt文件復制一份且取名為b.txt,放在當前目錄下,命令行為:
#cp a.txt b.txt
若源文件是普通文件,則直接復制到目標文件;若是目錄,需要使用"-r"選項才能將整個目錄復制到目標位置。例如將/home/teacher目錄下的所有內容復制到/home/student目錄下,命令行為:
#cp -r /home/teacher /home/student
6.11.5 rm 命令:刪除目錄或文件
rm命令用于刪除文件或目錄,可刪除一個目錄中的一個或多個文件或目錄,也可刪除某個目錄及其下面的所有文件和子目錄。對于鏈接文件則只刪除鏈接,原文件保持不變。rm命令格式如下:
rm [選項] 文件…
其中各可用選項意義如下。
-f:在刪除過程中不給任何指示,直接刪除。
-r:將參數中列出的全部目錄和子目錄都遞歸地刪除。
-i:與-f選項相反,交互式刪除,在刪除每個文件時都給出提示。
刪除文件可以直接使用rm命令,若刪除目錄則必須配合選項"-r",例如:
# rm pp.c
rm:是否刪除 一般文件 "pp.c"? y
# rm homework
rm: 無法刪除目錄"homework": 是一個目錄
# rm -r homework
rm:是否刪除 目錄 "homework"? y
例如,刪除當前目錄下的所有文件及目錄,命令行為:
# rm -r *
文件一旦通過rm命令刪除,則無法恢復,所以必須格外小心地使用該命令。
6.11.6 mkdir命令:創建目錄
mkdir命令用于創建目錄。mkdir命令格式為:
mkdir [選項] 目錄名
各可用選項意義如下。
-m數字:設置新建目錄的權限,權限用數字表示。
-p:如果目錄名的路徑中包含著不存在的子目錄,那么就逐一地建立,直到最后的子目錄為止。
創建目錄時,如果目錄名前沒有指定目錄的路徑,那么就表示在當前目錄下創建;如果有路徑名,則在指定的路徑下建立。新建的子目錄必須不與已經存在的文件名或目錄名重名。例如:
# pwd //在當前目錄下創建子目錄zhang
/home/teacher1
# ls
# mkdir zhang
# ls
zhang
# mkdir /home/teacher1/yang //使用絕對路徑創建子目錄yang
# ls
yang zhang
# mkdir zhang //不能重名創建
mkdir: 無法創建目錄 "zhang": 文件已存在
在創建子目錄的時候,如果子目錄的父目錄不存在,則無法創建。使用選項"-p",則可以逐級創建目錄。例如在當前目錄下創建li/document目錄:
# pwd
/home/teacher1
#mkdir li/document //由于不存在li子目
錄,li/document子目錄無法創建mkdir: 無法創建目錄 "li/document": 沒有那個文件或目錄
# mkdir -p li/document //參數"-p"允許逐級創建目錄
# ls
li yang zhang
# cd li
# ls
document
再如創建新目錄/usr/Bob/example,且指定權限為700,命令行為:
$ mkdir -m 700 /usr/Bob/example
6.11.7 rmdir命令:刪除空目錄
rmdir命令用于刪除一個空目錄。被刪除的目錄必須是一個空目錄否則無法刪除。rmdir只用于刪除目錄,無法刪除文件。rmdir命令格式為:
rmdir [選項] 目錄名
可用選項意義如下。
-p:刪除目錄下所有空目錄,如果有非空的子目錄,則保留下來;如果所有的子目錄都刪除了,則刪除該目錄。
例如刪除document子目錄,命令行為:
# ls
document
# cd document
# ls
# rmdir document //在document子
目錄內無法刪除document子目錄rmdir: document: 沒有那個文件或目錄
# cd ..
# rmdir document
# ls
若沒有document的寫權限或目錄非空則無法刪除,例如:
# ls
li yang zhang
# rmdir li
rmdir: li: 目錄非空
6.11.8 mv 命令:移動文件或目錄
mv 命令用于實現文件或目錄的移動。mv命令格式如下:
mv [選項] 源文件或目錄 目標文件或目錄
可用選項意義如下。
-f:如果操作要覆蓋某個已有的目標文件時不給任何指示。
-i:交互式的操作,如果操作要覆蓋某個已有的目標文件時會詢問用戶是否覆蓋。
mv與cp命令的明顯不同之處在于:mv命令移動文件,文件個數沒有增加;cp命令復制文件,文件個數增加。mv命令還可以進行文件或目錄的改名,其參數設置與運行結果對應關系如表6.19所示。
表6.19 mv參數設置與運行結果
命令格式 | 運行結果 |
mv 文件名 文件名 | 將源文件名改為目標文件名 |
mv 文件名 目錄名 | 將文件移動到目標目錄 |
mv 目錄名 目錄名 | 目標目錄已存在,將源目錄 移動到目標目錄;目標 目錄不存在則改名 |
mv 目錄名 文件名 | 出錯 |
例如將m1.c文件改名為m2.c,命令行為:
$ mv m1.c m2.c
再如將/usr/student下的所有文件和目錄移到當前目錄下,命令行為:
$ mv /usr/student/* .
6.11.9 find 命令:查找文件
find命令用于查找文件,其命令格式為:
find [起始目錄] [搜索條件] [操作]
其中[起始目錄]是指命令將從該目錄起,遍歷其下的所有子目錄,查找滿足條件的文件。該目錄默認是當前目錄。[搜索條件]是一個邏輯表達式,當表達式為"真"時,搜索條件成立,為"假"時不成立。搜索條件的一般表達式及其說明見表6.20。
表6.20 find命令搜索條件的一般表達式及其說明
搜索條件 | 說 明 |
-name ‘ 字符串 ’ | 查找文件名中包含所給字符串的所有文件 |
-user ‘ 用戶名 ’ | 查找屬于指定用戶的文件 |
-group ‘ 用戶組名 ’ | 查找屬于指定用戶組的文件 |
-type x | 查找類型為 x 的文件,類型包括 b (塊設備文件), c (字符設備文件), d (目錄文件), p (命名管道文件), f (普通文件), l (符號鏈接文件), s ( socket 文件) |
續表
搜索條件 | 說 明 |
-atime n | 查找 n 天以前被訪問過的文件 |
-size n | 指定文件大小為 n |
-perm | 查找符合指定權限值的文件或目錄 |
-mount | 要查找文件時不跨越文件系統 mount 點 |
-follow | 如果 find 命令遇到符號鏈接文件, 就跟蹤到鏈接所指向的文件 |
-cpio | 對匹配的文件使用 cpio 命令,將文 件備份到磁帶設備中 |
-newer file1 ! file2 | 查找更改時間比文件 file1 晚但比 文件 file2 早的文件 |
-prume | 不在指定的目錄中查找,如果同時 指定 -depth 選項,那么 -prune 將被 find 命令忽略 |
-ok | 和 exec 作用相同,但在執行每一個 命令之前,都會給出提示,由用戶 來確定是否執行 |
-depth | 在查找文件時,首先查找當前目錄, 然后再在其他子目錄中查找 |
可執行的操作及其說明見表6.21。
表6.21 find命令常用可執行操作及其說明
可執行操作 | 說 明 |
-exec 命令名 {} \ ; | 不需確認執行命令。注意 : “ {} ”代 表找到的文件名,“ } ”與“ \ ”之間有空格 |
送往標準輸出 |
例如從當前目錄查找所有以.txt結尾的文件并在屏幕上顯示出來,命令行為:
$ find . -name '*.txt' -print
再如從根目錄查找類型為符號連接的文件,并將其刪除,命令行為:
$ find / -type l -exec rm { } \;
又如從當前目錄查找用戶tom的所有文件并在屏幕上顯示,命令行為:
$ find . -user 'tom' -print
又如顯示當前目錄中大于20字節的.c文件名,命令行為:
$ find . -name "*.c" -size +20c -print
顯示當前目錄中恰好10天前訪問過的文件名,命令行為:
$ find . -atime 10 -print
顯示當前目錄中不到10天前訪問過的文件名,命令行為:
$ find . -atime -10 -print
查找/home目錄下權限為640的文件或目錄,命令行為:
#find /home -perm 640
搜索根目錄下大于100KB的文件,并顯示,命令行為:
#find / -size +100K -print
搜索根目錄下小于500KB的文件,命令行為:
#find / -size -500K -print
在當前目錄中查找所有文件名以.doc結尾,且更改時間在5天以上的文件,找到后進行刪除,且刪除前給出提示,命令行為:
#find . -name '*.doc' -mtime +5 -ok rm { } \;
在當前目錄下查找所有鏈接文件,并以長格式顯示文件的基本信息,命令行為:
# find . -type l -exec ls -l {} \;
lrw-rw-r-- 1 root root 36 07-27 14:34 ./example2
lrw-rw-r-- 1 root root 72 07-27 14:36 ./example3
lrw-rw-r-- 1 root root 36 07-27 14:36 ./example1
在當前目錄中查找文件名由一個小寫字母、一個大寫字母和兩個數字組成,且擴展名為.doc的文件,并顯示,命令行為:
#find . -name ' [a-z][A-Z][0-9][0-9].doc' -print
6.11.10 grep 命令:在文件中搜索指定的字符串
grep命令是"global regular expression print"的縮寫,用于在文件中搜索指定的字符串模式,列出含有匹配模式字符串的文件名,并輸出含有該字符串的文本行,命令格式為:
grep [選項] [查找模式][文件名……]
其中各可用選項意義如下。
-F:將查找模式看成是單純的字符串。
-i:要查找的字符串不區分字母的大小寫。
-r:以遞歸方式查詢目錄下的所有子目錄的文件。
-n:標出包含指定字符串的行編號。
例如在文件example中查找包含"aa"字符串的行,命令如下:
# cat example
aa bb cc dd
aa bb ff
ee
# grep aa example
aa bb cc dd
aa bb ff
如果待查找的字符串模式的字數大于1,則必須在字符串模式兩邊使用單引號,否則系統會只把第一個字作為搜索目錄,如:
# cat example
aa bb cc dd
aa bb ff
ee
# grep bb cc example
grep: cc: 沒有那個文件或目錄
example:aa bb cc dd
example:aa bb ff
# grep 'bb cc' example
aa bb cc dd
例如在/passwd文件中查找包含"teacher"字符串的行,命令為:
#grep -F teacher /etc/passwd
teacher:*:500:500: teacher:/home/ teacher:/bin/bash
再如在file1中查找包含"print" 字符串的所有行,不管字符的大小寫,命令行如下:
# grep -i 'print' file1
又如查找包含字符串"bb cc"的行,輸出該行,并輸出該行所在的行號,命令為:
# cat example
aa bb cc dd
aa bb ff
ee
# grep -n 'bb cc' example
1:aa bb cc dd
通常grep命令配合管道符(|)還可用來作為其他命令的輸入,例如統計指定文件中包含某字符串的行數、字數和字節數:
# cat example
aa bb cc dd
aa bb ff
ee
# grep 'bb' example | wc
2 7 21
grep命令除了作為其他命令的輸入,也可以作為一些命令(例如ls,ps)的輸出。例如在當前運行的進程中查找vi程序的進程信息,命令行如下:
# ps aux | grep vi
root 5716 0.0 0.2 4956 736 pts/1
T Jul25 0:00 viroot 20681 0.3 0.4 4960 1012 pts/1
T 14:21 0:00 viroot 20689 5.0 0.2 4132 668 pts/1
R+ 14:22 0:00 grep vi
注意:還有兩個命令與grep非常相似。一個是"egrep",表示Extend grep,執行效率比grep高,但需占用較大的內存空間;另一個是"fgrep",占用空間比egrep小,且速度也比grep快。由于三個命令的結構、功能類似,因此大部分參數可以共享。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
