從本篇文章開始,我將總結(jié)一些Java工程師日常研發(fā)工作中會(huì)使用到的Linux命令,在介紹這些命令的過程中,也會(huì)對(duì)Linux系統(tǒng)的一些基礎(chǔ)知識(shí)進(jìn)行普及。希望對(duì)大家工作和學(xué)習(xí)有所幫助吧。
本篇將從文件與目錄管理開始,畢竟Linux中一切皆文件嘛。
注:本系列文章所有操作都是基于RedHat系列的Centos 7。所以開始學(xué)習(xí)前,請(qǐng)大家先安裝Centos 7。
1. 基本概念
那么,先來看看幾個(gè)基本概念吧
1.1 Linux的目錄結(jié)構(gòu)
Linux的目錄結(jié)構(gòu)可以看作一顆樹,起點(diǎn)是根,也稱為根目錄,每一個(gè)目錄可以看作是枝,每一個(gè)文件節(jié)點(diǎn)可以看作是葉。如下圖:

舉幾個(gè)小例子:
根: /
枝:/usr
葉:/usr/local/data.db
1.2 家目錄
在Linux中,系統(tǒng)在創(chuàng)建每一個(gè)用戶時(shí),都會(huì)為這個(gè)用戶創(chuàng)建一個(gè)家目錄,類似于Windows中的“我的文檔”。這些用戶分兩類,一類是超級(jí)管理員,一個(gè)系統(tǒng)只能有一個(gè)超級(jí)管理員,它的用戶名是root,它的家目錄是/root。另一類是普通用戶,它的家目錄是/home/$用戶名,比如一個(gè)用戶名為jacky的用戶,它的家目錄是/home/jacky。
當(dāng)用戶登錄系統(tǒng)時(shí),默認(rèn)進(jìn)入的目錄就是該用戶的家目錄。
1.3 絕對(duì)路徑和相對(duì)路徑
(1)絕對(duì)路徑
從根目錄開始查找的路徑。比如說有一個(gè)文件data.db,它位于根目錄的子目錄usr下,那么它的絕對(duì)路徑就是/usr/data.db。
注意:根目錄一定是以/開頭的,即從根開始一級(jí)一級(jí)向下找,一直找到這個(gè)目錄為止。
(2)相對(duì)路徑
從當(dāng)前所在目錄開始查找的路徑。比如當(dāng)前目錄是usr目錄,查找usr下的local子目錄下的work文件,這個(gè)文件的相對(duì)路徑就是local/work。
1.4 Linux系統(tǒng)自帶目錄及作用
Centos 6系列根目錄下默認(rèn)一級(jí)目錄有:
- /bin 命令保存目錄,普通用戶可使用的命令
- /boot 啟動(dòng)目錄,存放啟動(dòng)相關(guān)文件
- /dev 設(shè)備文件
- /etc 配置文件
- /home 普通用戶的家目錄
- /lib 第三方庫文件保存目錄,系統(tǒng)或軟件運(yùn)行所需依賴的第三方庫文件
- /mnt 系統(tǒng)掛載目錄
- /media 媒體外設(shè)掛載目錄
- /misc 音頻設(shè)備掛載目錄
- /root 超級(jí)用戶的家目錄
- /tmp 臨時(shí)目錄 存放臨時(shí)文件
- /sbin 超級(jí)用戶才能使用的命令存放的目錄
- /proc 內(nèi)存運(yùn)行目錄,存放一些運(yùn)行于內(nèi)存中的信息
- /sys 系統(tǒng)配置內(nèi)存目錄
- /usr 用戶共享資源目錄,一般存放安裝的第三方軟件
- /var 可變文檔目錄,可用于存放訪問日志等可變文檔
注意:proc和sys的數(shù)據(jù)是直接寫到內(nèi)存中的,所以不能直接往這兩個(gè)目錄寫數(shù)據(jù),因?yàn)闀?huì)寫到內(nèi)存,內(nèi)存占滿,系統(tǒng)就會(huì)崩潰。
Centos7 根目錄下的一級(jí)目錄出現(xiàn)了以下變動(dòng):
/bin, /sbin, /lib, /lib64都變成了鏈接文件,實(shí)際內(nèi)存分別存放在/usr/bin, /usr/sbin, /usr/lib, /usr/lib64。
新增了/run目錄存放系統(tǒng)服務(wù)進(jìn)程生成的比如pid等臨時(shí)文件,比如systemd生成的臨時(shí)文件
1.5 文件類型
Linux不依靠后綴名來區(qū)分文件類型,總共有7種類型:普通文件、目錄文件、軟鏈接文件、塊設(shè)備文件、字符設(shè)備文件、套接字文件和管道文件。常用的是前三種。
1.6 文件存儲(chǔ)方式
Linux中一切皆文件,那么文件在磁盤上是如何進(jìn)行存儲(chǔ)的呢?文件的存儲(chǔ)是由文件系統(tǒng)管理的,現(xiàn)主流的文件系統(tǒng)有EXT2/3/4,F(xiàn)AT16/32等。以EXT系列文件系統(tǒng)為例:
文件由兩部分?jǐn)?shù)據(jù)組成,一部分是文件的內(nèi)容,稱為數(shù)據(jù)塊。一部分是文件的元信息,包括文件的權(quán)限、所有者、群組、時(shí)間參數(shù)等。
數(shù)據(jù)塊是分塊存儲(chǔ)的,每一塊都是物理上等大的數(shù)據(jù),默認(rèn)每個(gè)數(shù)據(jù)塊4KB,是存儲(chǔ)文件的最小空間,稱為block。每一個(gè)block都有唯一的編號(hào),當(dāng)一個(gè)文件大到一個(gè)block無法存儲(chǔ)時(shí),就會(huì)將文件內(nèi)容切分存儲(chǔ)到不同的塊中;
元信息則存儲(chǔ)在inode中,每一個(gè)inode也有唯一的編號(hào)的,但與數(shù)據(jù)塊不同,一個(gè)文件只會(huì)有一個(gè)inode。因此inode也經(jīng)常用來作為文件的標(biāo)識(shí)。
文件系統(tǒng)維護(hù)一個(gè)目錄表,稱為super block,它記錄了一個(gè)文件的inode及它分配的block的編號(hào)。用于檢索和管理文件存儲(chǔ)。
2. 目錄管理
2.1 查看當(dāng)前路徑
pwd
前面我們說過了用戶登錄系統(tǒng)后,默認(rèn)進(jìn)入的是家目錄,那么我們以root用戶登錄后,輸入以上命令,查看一下root用戶的家目錄:

pwd是三個(gè)英文單詞的縮寫:print working directory,打?。ó?dāng)前)工作目錄。
2.2 查看目錄子節(jié)點(diǎn)列表
2.2.1 當(dāng)前目錄下的子節(jié)點(diǎn)列表
使用以下命令:
ls [選項(xiàng)] [目錄路徑]
ls后不加選項(xiàng),表示查看當(dāng)前所在目錄。
在根目錄下執(zhí)行l(wèi)s命令,如下圖:

2.2.2 指定目錄下的子節(jié)點(diǎn)列表
在ls命令后加上要查看的目錄路徑
ls 目錄路徑

2.2.3 顯示所有文件,包括隱藏文件
加上-a 選項(xiàng),表示顯示所有文件
ls -a 目錄路徑

2.2.4 顯示文件詳細(xì)信息
加上-l 選項(xiàng),表示顯示文件詳細(xì)信息
ls -l 目錄路徑

這里顯示的有文件的權(quán)限、所有者、所屬組、文件大小、時(shí)間參數(shù)、文件名等。
2.2.5 人性化顯示文件大小
加上-h 選項(xiàng),表示人性化顯示文件大小,可以結(jié)合-l選項(xiàng)。
ls -lh 目錄路徑

注意到,文件大小顯示的是1.3K,而不再是之前例子中顯示的1230了。
2.2.6 顯示inode
加上-i選項(xiàng),可以顯示文件的inode。這是文件的唯一標(biāo)識(shí)。

這里的8409154就是文件的inode。
2.2.7 顯示目錄屬性
如果想要查看的是目錄的屬性,而不是目錄下的子節(jié)點(diǎn)。則可以使用-d選項(xiàng)。
ls -d 目錄路徑

2.3 切換目錄/進(jìn)入目錄
想要進(jìn)入某個(gè)目錄,執(zhí)行以下命令
cd 目錄路徑
進(jìn)入/usr/local目錄,如下圖所示:

此外,cd命令進(jìn)行一些特定的目錄,還有以下簡化的命令
cd ~ 表示進(jìn)入當(dāng)前用戶的家目錄
cd - 進(jìn)入上次目錄
cd .. 進(jìn)入上一級(jí)目錄
cd . 進(jìn)入當(dāng)前目錄
2.4 創(chuàng)建目錄
2.4.1 創(chuàng)建單級(jí)目錄
可以使用mkdir命令來創(chuàng)建目錄
mkdir 目錄名
比如,在/usr/local目錄下創(chuàng)建一個(gè)新目錄test。
創(chuàng)建完后,可以使用ls命令查看。

2.4.2 遞歸創(chuàng)建多級(jí)目錄
mkdir加上-p選項(xiàng),即可以遞歸創(chuàng)建多級(jí)目錄。
mkdir -p test/today/job

2.5 刪除目錄
rmdir命令,用于刪除空目錄。如果目錄里有子目錄或者文件,則無法使用此命令。
rmdir job
3. 文件管理
3.1 創(chuàng)建文件
3.1.1 touch命令創(chuàng)建文件
touch命令可以在當(dāng)前目錄下創(chuàng)建一個(gè)空文件。
touch 文件名

3.1.2 輸出重定向創(chuàng)建文件
輸出重定向,我們?cè)诤竺娴南到y(tǒng)管理部分文章再細(xì)講。這里只講以下命令格式
echo “文本內(nèi)容” > 文件名
將文本內(nèi)容輸出重定向到文件,如果這個(gè)文件不存在,則會(huì)先創(chuàng)建這個(gè)文件。

3.1.3 vi工具創(chuàng)建文件
vi是linux自帶的文本編輯工具,后面的文章我們會(huì)介紹它的用法。這里只涉及用它來創(chuàng)建文件的基本操作。
vi 文件名
以上命令會(huì)進(jìn)行vi會(huì)話,如果這個(gè)文件不存在,則會(huì)先創(chuàng)建這個(gè)文件。用戶可以輸入:ESC鍵 + :wq退出。
3.2 查看文件內(nèi)容
3.2.1 cat命令
cat命令用于將文件內(nèi)容輸出到標(biāo)準(zhǔn)輸入設(shè)備(也就是屏幕)上。當(dāng)文件內(nèi)容很多時(shí),會(huì)一閃而過,體驗(yàn)不是很好。
cat [選項(xiàng)] 文件名
常用選項(xiàng)有:
-n或--number:有1開始對(duì)所有輸出的行數(shù)編號(hào);
-b或--number-nonblank:和-n相似,只不過對(duì)于空白行不編號(hào);
-s或--squeeze-blank:當(dāng)遇到有連續(xù)兩行以上的空白行,就代換為一行的空白行;
3.2.2 less和more命令
more會(huì)以一頁一頁的顯示方便使用者逐頁閱讀,而最基本的指令就是按空白鍵(space)就往下一頁顯示,按 b 鍵就會(huì)往回(back)一頁顯示,而且還有搜尋字串的功能 。more命令從前向后讀取文件,因此在啟動(dòng)時(shí)就加載整個(gè)文件。
more +3 test.log #從第三行開始顯示日志內(nèi)容
在 more 的時(shí)候,我們并沒有辦法向前面翻, 只能往后面看,但若使用了 less 時(shí),就可以使用 [pageup] [pagedown] 等按鍵的功能來往前往后翻看文件,更容易用來查看一個(gè)文件的內(nèi)容!除此之外,在 less 里頭可以擁有更多的搜索功能,不止可以向下搜,也可以向上搜。而且** less 在查看之前不會(huì)加載整個(gè)文件, 它有緩沖區(qū)的概念**。
當(dāng)查看文件內(nèi)容較多時(shí),建議使用less命令。
less file1
3.2.3 head和tail命令
head、tail #查看文本中開頭或結(jié)尾部分的內(nèi)容
head -n 5 a.log #查看a.log文件的前5行
tail -F b.log #循環(huán)讀?。╢ollow)
除了上述命令之外,vi也可以用來查看文件內(nèi)容,等我們后面介紹vi時(shí)再細(xì)講。
3.3 刪除文件/目錄
命令格式:
rm -rf [文件或目錄]
選項(xiàng)
-r 刪除目錄
-f 強(qiáng)制
刪除目錄時(shí),建議使用相對(duì)路徑,避免誤操作刪除根目錄下的所有內(nèi)容(rm -rf /)
3.4 復(fù)制文件/目錄
命令格式:
cp [選項(xiàng)] [原文件或目錄] [文件或目錄]
選項(xiàng)有:
-r 復(fù)制目錄
-p 連帶復(fù)制文件屬性(比如時(shí)間參數(shù))
-d 若源文件是鏈接文件,則復(fù)制鏈接屬性
-a 相當(dāng)于 -pdr

注意:如果不加 -p 選項(xiàng),則復(fù)制出來的文件是新生成的,它擁有自己的文件屬性,比如創(chuàng)建時(shí)間會(huì)是重新生成的。加上 -p選項(xiàng)之后,則連文件屬性也一并復(fù)制過來了,就連創(chuàng)建時(shí)間也會(huì)和源文件相同。
3.5 移動(dòng)(重命令)文件/目錄
命令格式:
mv [原文件或目錄] [目標(biāo)目錄]
例如
mv a.txt local/ 將文件b.txt移動(dòng)到local目錄下
mv /oracle/ test/ 將/oracle/目錄移動(dòng)到test目錄下
注意:
- 如果原文件就在目標(biāo)目錄下,那就是改名命令。
- 與cp不同,mv命令移動(dòng)目錄時(shí),不用加-r選項(xiàng)。
4. 管理鏈接
4.1 硬鏈接與軟鏈接
鏈接分為硬鏈接和軟鏈接。
前面我們已經(jīng)提過,一個(gè)文件可以看作由兩部分組成,一部分是元信息和索引信息,稱為inode,一部分是實(shí)際文件內(nèi)容,存儲(chǔ)在一個(gè)或多個(gè)block塊中。
硬鏈接可以看作對(duì)文件的一個(gè)引用,具有以下特點(diǎn):
- 它與原文件擁有相同inode和block,可以看做是同一個(gè)文件
- 可通過inode進(jìn)行標(biāo)識(shí)
- 不能跨磁盤分區(qū)
- 不能針對(duì)目錄進(jìn)行使用
最重要的一點(diǎn)是:硬鏈接與原文件擁有相同的inode,所以它們的block塊也是相同的,修改兩者中任一個(gè),文件的內(nèi)容都會(huì)改變。無論刪除硬鏈接和原文件任一個(gè),只要另一個(gè)文件存在,都不影響對(duì)文件的訪問(相當(dāng)于只刪除了對(duì)文件的一個(gè)引用而已,文件并沒有被實(shí)際刪除)。
創(chuàng)建了硬鏈接,文件的引用計(jì)數(shù)會(huì)加1。
軟鏈接特征:
- 它擁有自己的inode和block塊,但是block塊中只保存原文件的文件名和inode編號(hào),并沒有實(shí)際的文件數(shù)據(jù)。
- 修改原文件或軟鏈接二者任一,另一個(gè)都會(huì)改變。
- 刪除原文件,軟鏈接則不能使用。
注意:創(chuàng)建軟鏈接,一定要寫絕對(duì)路徑,否則它會(huì)在目標(biāo)目錄下尋找原文件(不一定能找到)
4.2 創(chuàng)建鏈接
命令格式:
ln [選項(xiàng)] [原文件] [目標(biāo)文件]
選項(xiàng):
-s 創(chuàng)建軟鏈接
不加選項(xiàng),則創(chuàng)建的是硬鏈接。
5. 總結(jié)
本文講述了Linux(具體是Centos 7)中常用到的文件和目錄管理相關(guān)命令,這些命令在實(shí)際開發(fā)和運(yùn)維過程中都是最基本的,必須熟記和多加練習(xí)。