----- 最近更新【2022-01-23】-----
本文目錄結(jié)構(gòu)預(yù)覽:
- 一、簡介
- 二、文件操作
1、創(chuàng)建文件:touch
2、復(fù)制文件:cp
3、移動或重命名文件:mv
4、刪除文件:rm - 三、文件權(quán)限
1、權(quán)限說明:讀、寫、執(zhí)行
2、權(quán)限說明:屬主、用戶組、其它用戶
3、特殊權(quán)限:setuid
4、文件模式
5、權(quán)限修改:chmod
6、用戶掩碼:umask - 四、符號鏈接
1、鏈接的概念
2、創(chuàng)建新鏈接:ln
3、基本文件命令的工作方式
4、符號鏈接:ln -s - 五、文件查找
1、查看與特定目錄相關(guān)的文件:whereis
2、通過搜索數(shù)據(jù)庫查看文件:locate
3、通過搜索目錄樹查看文件:find - 六、參考
一、簡介
本篇文件主要討論在 Linux 中,關(guān)于普通文件的創(chuàng)建、復(fù)制、重命名、權(quán)限管理等操作。
二、文件操作
1、創(chuàng)建文件:touch
1)自動創(chuàng)建文件
在很多時候,Linux 會為我們自動創(chuàng)建文件。如:
- 當(dāng)需要時,許多程序?qū)⒆詣拥貏?chuàng)建文件。(如,使用 vim 打開一個不存在的文件。
- 當(dāng)將輸出重定向到一個不存在的文件時,那么 shell 將創(chuàng)建該文件。
- 當(dāng)復(fù)制文件,復(fù)制程序?qū)?chuàng)建新文件。
2)創(chuàng)建一個空文件:touch
touch 程序經(jīng)常用于創(chuàng)建一個新的空文件。如:
[11:41 @nosee ~/Documents]$ ls -l
total 0
[11:41 @nosee ~/Documents]$ touch a
[11:41 @nosee ~/Documents]$ ls -l
total 0
-rw-rw-r-- 1 nosee nosee 0 Jan 22 11:41 a
touch 的主要目的就是在不改變文件的情況下改變文件的修改時間,就如同你伸出手輕輕地觸摸文件一樣。(change file timestamps)
語法:touch [OPTION]... FILE...
常用選項:
-
-t time,使用[[CC]YY]MMDDhhmm[.ss](時間格式)替換當(dāng)前時間。默認(rèn)情況下,touch 同時將修改時間和訪問時間設(shè)置為當(dāng)前時間。 -
-m,只改變修改時間(modification time)。 -
-a,只改變訪問時間(access time)。
例1:修改時間
[11:43 @nosee ~/Documents]$ ls -l
total 4
-rw-rw-r-- 1 nosee nosee 8 Jan 22 11:43 a
[11:45 @nosee ~/Documents]$ touch -t 01012359 a
[11:46 @nosee ~/Documents]$ ls -l
total 4
-rw-rw-r-- 1 nosee nosee 8 Jan 1 23:59 a
例2:同時創(chuàng)建多個文件
[11:46 @nosee ~/Documents]$ touch b c
[11:47 @nosee ~/Documents]$ ls -l
total 4
-rw-rw-r-- 1 nosee nosee 8 Jan 1 23:59 a
-rw-rw-r-- 1 nosee nosee 0 Jan 22 11:47 b
-rw-rw-r-- 1 nosee nosee 0 Jan 22 11:47 c
2、復(fù)制文件:cp
cp - copy files and directories
1)最簡單的例子:
[12:04 @nosee ~/Documents]$ ls -l
-rw-rw-r-- 1 nosee nosee 0 Jan 22 12:03 a.txt
[12:04 @nosee ~/Documents]$ cp a.txt b.txt
[12:04 @nosee ~/Documents]$ ls -l
-rw-rw-r-- 1 nosee nosee 0 Jan 22 12:03 a.txt
-rw-rw-r-- 1 nosee nosee 0 Jan 22 12:04 b.txt
默認(rèn)情況,當(dāng)使用 cp 程序復(fù)制文件時,如果目標(biāo)文件不存在那么 cp 會創(chuàng)建該文件,如果目錄已經(jīng)存在那么 cp 將替換這個文件。
語法:cp [OPTION]... [-T] SOURCE DEST
或者cp [OPTION]... SOURCE... DIRECTORY
或者cp [OPTION]... -t DIRECTORY SOURCE...
常用選項:
-
-i,(interactive 交互)在替換文件之前進(jìn)行提示(忽略前面的-n選項) -
-n,不覆蓋已存在的文件(忽略前面的-i選項) -
-p,(preserve 保持)使用目標(biāo)文件和源文件擁有相同的修改時間、訪問時間以及權(quán)限 -
-R/-r, (recursive 遞歸)將目錄及其所有文件復(fù)制到另一個目錄中
copy directories recursively
例:
[12:35 @nosee ~/Documents]$ ls -l a*
-rw-rw-r-- 1 nosee nosee 0 Jan 22 12:03 a.txt
[12:36 @nosee ~/Documents]$ cp -p a.txt aaa
[12:36 @nosee ~/Documents]$ ls -l a*
-rw-rw-r-- 1 nosee nosee 0 Jan 22 12:03 aaa
-rw-rw-r-- 1 nosee nosee 0 Jan 22 12:03 a.txt
2)將文件復(fù)制到不同的目錄中(tree 命令的用法在我的上一篇文件中有介紹,主要用于顯示目錄樹)
[12:45 @nosee ~/Documents]$ tree
.
├── ad
├── a.txt
└── b.txt
1 directory, 2 files
[12:46 @nosee ~/Documents]$ cp a.txt b.txt ad
[12:46 @nosee ~/Documents]$ tree
.
├── ad
│ ├── a.txt
│ └── b.txt
├── a.txt
└── b.txt
1 directory, 4 files
3)將目錄復(fù)制到另一個目錄中
例:將目錄 ad 及其內(nèi)容復(fù)制到 目錄 ccc(目標(biāo)目錄 ccc 不存在)
[12:54 @nosee ~/Documents]$ cp -r ad ccc
[12:54 @nosee ~/Documents]$ tree
.
├── ad
│ ├── a.txt
│ └── b.txt
├── a.txt
├── b.txt
└── ccc
├── a.txt
└── b.txt
2 directories, 6 files
例:將目錄 ad 及其內(nèi)容復(fù)制到 目錄 ccc(目標(biāo)目錄 ccc 已存在)
[12:54 @nosee ~/Documents]$ cp -r ad ccc
[12:54 @nosee ~/Documents]$ tree
.
├── ad
│ ├── a.txt
│ └── b.txt
├── a.txt
├── b.txt
└── ccc
└── ad
├── a.txt
└── b.txt
3 directories, 6 files
如果目標(biāo)目錄 ccc 已存在,又不想把原目錄也復(fù)制過去,可使用cp -r ad/* ccc。
3、移動或重命名文件:mv
mv - 重命名(移動)文件。(move (rename) files)
使用 mv 程序可以將文件從一個位置“移動”到另一個位置,如果新位置和原來在同一個目錄中,那么實際結(jié)果就是對原始文件“重命名”。當(dāng) mv 移動目錄時,同時移動目錄中的所有文件和子目錄。
語法:mv [OPTION]... [-T] SOURCE DEST
或 mv [OPTION]... SOURCE... DIRECTORY
或 mv [OPTION]... -t DIRECTORY SOURCE...
簡單例子:
[21:08 @nosee ~/Documents]$ tree
.
├── ad
├── a.txt
└── b.txt
1 directory, 2 files
[21:08 @nosee ~/Documents]$ mv a.txt ad/
[21:09 @nosee ~/Documents]$ tree
.
├── ad
│ └── a.txt
└── b.txt
1 directory, 2 files
常用選項:
-
-i,(interactive 交互)在替換已有文件之前進(jìn)行詢問。 -
-f,(force 強(qiáng)制)在不詢問的情況下替換文件,所以要小心使用。
例:移動多個文件
[21:11 @nosee ~/Documents]$ tree
.
├── ad
├── a.txt
└── b.txt
1 directory, 2 files
[21:11 @nosee ~/Documents]$ mv a.txt b.txt ad/
[21:11 @nosee ~/Documents]$ tree
.
└── ad
├── a.txt
└── b.txt
1 directory, 2 files
上面例子還可以使用mv *.txt ad或mv ?.txt ad。
注:如果文件已經(jīng)在目標(biāo)目錄中存在,那么源文件將替換目標(biāo)文件。
例:重命名
[21:22 @nosee ~/Documents]$ ls
ad
[21:22 @nosee ~/Documents]$ mv ad add
[21:22 @nosee ~/Documents]$ ls
add
4、刪除文件:rm
rm - 刪除文件或目錄。(remove files or directories)
語法:rm [OPTION]... [FILE]...
常用選項:
-
-i,(interactive 交互)刪除每個文件之前先請求許可。 -
-f,(force 強(qiáng)制)在不詢問的情況下直接刪除,小心使用! -
-r,(recursive 遞歸)刪除整個目錄樹
注:
1)如果試圖刪除一個沒有寫權(quán)限的文件,那么 rm 將請求許可,在用戶許可的情況下系統(tǒng)將忽略文件權(quán)限保護(hù)機(jī)制。
2)-f選項將忽略文件權(quán)限和-i選項,直接刪除文件。
3)使用-r選項的時候一定要特別注意,最好與-i選項一起使用,刪除之前最好再使用pwd命令確保自己所處的工作目錄。
例:刪除整個目錄樹
[21:43 @nosee ~/Documents]$ tree
.
├── add
│ ├── a.txt
│ └── b.txt
└── ccc
├── a.txt
└── b.txt
2 directories, 4 files
[21:43 @nosee ~/Documents]$ rm -r ccc/
[21:44 @nosee ~/Documents]$ tree
.
└── add
├── a.txt
└── b.txt
1 directory, 2 files
最后一個問題:被刪除文件恢復(fù)的可能性?
注意:
文件一旦刪除,就沒有辦法再找回這個文件。但是,文件所使用的實際磁盤空間還沒有被清除。文件系統(tǒng)只是將這部分磁盤空間標(biāo)識為可重用。最終,這部分磁盤空間將被重用,舊數(shù)據(jù)將被新數(shù)據(jù)覆蓋。在忙碌的大型 Unix 系統(tǒng)中,這可以只需要幾秒鐘。但是,無法確定這種情況什么時候發(fā)生,有時候舊數(shù)據(jù)可能會在磁盤的未使用部分隱藏很長一段時間。實際上,有一些特殊的:“恢復(fù)刪除”工具能夠查看有磁盤未使用的部分,并恢復(fù)舊數(shù)據(jù)。
此外,即便數(shù)據(jù)被覆蓋, ,在極端的情況下數(shù)據(jù)也有可能恢復(fù),只要數(shù)據(jù)沒有被多次覆蓋。如果將硬盤拿到擁有非常昂貴的數(shù)據(jù)恢復(fù)設(shè)備的實驗室去,則有可能通過分析硬盤磁面的磁跡恢復(fù)硬盤上被覆蓋過的舊數(shù)據(jù)。
三、文件權(quán)限
Unix 為每個誰的維護(hù)一組文件權(quán)限(file permission),通常稱為權(quán)限(permission)。
1、權(quán)限說明:讀、寫、執(zhí)行
權(quán)限有三種,包括讀權(quán)限(read permission)、寫權(quán)限(write permission)和 執(zhí)行權(quán)限(execute permission)。這三種權(quán)限相互之間彼此獨立。
文件權(quán)限的準(zhǔn)確含義依賴于文件的類型。對于一個不可執(zhí)行的文件來說,擁有執(zhí)行權(quán)限沒有任何意義。
| 權(quán)限 | 說明 |
|---|---|
| 普通文件 | —— |
| 讀(r) | 讀取文件 |
| 寫(w) | 寫入文件 |
| 執(zhí)行(x) | 執(zhí)行文件 |
| 目錄 | —— |
| 讀(r) | 讀取目錄 |
| 寫(w) | 創(chuàng)建、移動、復(fù)制或刪除目錄條目 |
| 執(zhí)行(x) | 搜索目錄 |
三種權(quán)限是相互區(qū)別的,但是可以結(jié)合使用。例如,為了修改一個文件,就需要同時擁有該文件的讀權(quán)限和寫權(quán)限。為了運行一個 shell 腳本,就需要同時擁有讀權(quán)限和執(zhí)行權(quán)限。
對于目錄而言,目錄的權(quán)限和普通文件有所不同。讀權(quán)限允許用戶標(biāo)識讀取目錄中的文件,寫權(quán)限允許用戶標(biāo)識修改目錄(創(chuàng)建、移動、復(fù)制、刪除),執(zhí)行權(quán)限允許用戶搜索目錄。
如果只擁有讀權(quán)限,則只能列舉目錄中的文件名,僅此而已。除非擁有執(zhí)行權(quán)限,否則不能查看文件的大小、查看子目錄或者使用cd改變目錄。
注:
一個目錄條目僅包含一個文件名,以及一個指向該文件的指針,并不包含實際的文件。所以對目錄只有讀權(quán)限時,是查看不了文件的大小的。
2、權(quán)限說明:屬主、用戶組、其它用戶
文件權(quán)限控制用戶標(biāo)識對文件的訪問。每個文件有 3 組權(quán)限:一組針對屬主、一組針對組、一組針對其它用戶。然后每組權(quán)限又分為讀、寫 和 執(zhí)行 3 部分。
使用ls -l查看文件時,會看到一條類似于-rwsr-xr-x的字符串,這就是該文件的權(quán)限。如:
[nosee@instance-4 ~]$ ls -ld test
drwxr-xr-x 3 nosee nosee 4096 Jan 21 01:52 test
上面例子中,文件的屬主就是從左往右看的第一個 nosee,第二個 nosee 是用戶組。
該文件的權(quán)限就是rwxr-xr-x(第一個字符d表示文件的類型為目錄)。其中分為三組:
前面 3 個字符(第一組權(quán)限)就表示用戶屬主對該文件擁有的權(quán)限。
中間 3個字符(第二組權(quán)限)用來表示該用戶組對該文件擁有的權(quán)限。
最后 3 個字符(第三組權(quán)限)則表示其它用戶標(biāo)識對該文件所擁有的權(quán)限。
注:
1)屬主是可以改變文件權(quán)限的唯一用戶標(biāo)識。(root 例外,root 可以做任何事情)
2)第三組的其它用戶,不包含用戶屬主,和用戶組中的成員。
3)使用命令id或groups可以查看你的用戶標(biāo)識所屬的用戶組,一般都是與用戶標(biāo)識同名的一個用戶組。
4)Unix 系統(tǒng)允許一個用戶標(biāo)識同時屬于多個組。
5)除非確實需要與組中的其它用戶共享文件,否則可以忽略這一思想,因為很少需要用到。
3、特殊權(quán)限:setuid
通常,每當(dāng)運行程序時,該程序?qū)⒃谀愕挠脩魳?biāo)識的授權(quán)下運行。這意味著,你的程序擁有和用戶標(biāo)識相同的權(quán)限。
有時候,普通的用戶標(biāo)識有可能需要以特殊的權(quán)限運行程序。為了使這一點成為可能,人們設(shè)計了一個特殊的文件設(shè)置權(quán)限,以允許其它用戶標(biāo)識訪問文件,就好像他們是文件的屬主(創(chuàng)建者)一樣。這個特殊的權(quán)限稱為 setuid 或者 suid。
大多數(shù)情況中,setuid 用來允許用戶標(biāo)識運行從 root 擁有的程序中挑選的程序。這意味著無論哪個用戶標(biāo)識運行程序,它都以 root 的特權(quán)運行。這樣就允許程序完成通常由超級用戶執(zhí)行的任務(wù)。
例如,為了修改口令,需要使用 passwd 程序。但是修改口令,該程序必須修改 /etc/passwd 文件和 /etc/shadow 文件,而修改這兩個文件需要 root 的特殊。基于這一原因,passwd 程序本身存儲在一個由 root 擁有的文件中,并且打開了 setuid。
setuid 權(quán)限就是將文件權(quán)限中的字母“x”用字母“s”取代。如:
[nosee@instance-4 ~]$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 63736 Jul 27 2018 /usr/bin/passwd
4、文件模式
Unix 使用一個緊湊的 3 位數(shù)字的代碼來表示一個完整的文件權(quán)限集。該代碼稱為文件模式(file mode),或者簡稱為模式(mode)。
例如rw-------表示600的模式。
6 = 屬主的權(quán)限
0 = 組的權(quán)限
0 = 其它用戶標(biāo)識的權(quán)限
讀、寫和執(zhí)行,每個權(quán)限都有對應(yīng)的一個權(quán)限數(shù)值:
讀權(quán)限 = 4
寫權(quán)限 = 2
執(zhí)行權(quán)限 = 1
沒有權(quán)限 = 0
例如rwxrw-r--對應(yīng)的權(quán)限模式可以這樣算:(4+2+1)=7
rwx = 4+2+1= 7
rw- = 4+2+0 = 6
r-- = 4+0+0 = 4
所以文件的權(quán)限模式為:764
5、權(quán)限修改:chmod
改變文件的權(quán)限,需要使用 chmod 命令。(change file mode bits)
語法:chmod [OPTION]... MODE[,MODE]... FILE...
或 chmod [OPTION]... OCTAL-MODE FILE...
或 chmod [OPTION]... --reference=RFILE FILE...
只有屬主和超級用戶才可以改變文件的權(quán)限模式。
例:
[nosee@instance-4 ~]$ ls -l letter.txt
-rw-r--r-- 1 nosee nosee 611 Jan 15 18:19 letter.txt
[nosee@instance-4 ~]$ chmod 666 letter.txt
[nosee@instance-4 ~]$ ls -l letter.txt
-rw-rw-rw- 1 nosee nosee 611 Jan 15 18:19 letter.txt
6、用戶掩碼:umask
當(dāng) Unix 創(chuàng)建新文件時,將根據(jù)文件的類型為文件指定下述幾種模式:
666:不可執(zhí)行的普通文件
777:可執(zhí)行的普通文件
777:目錄
在這一初始模式上,Unix 再減去用戶掩碼(user mask)值,就是新文件的權(quán)限的值。
umask - Display or set file mode mask. 查看 umask 的使用說明:help umask,umask 是一個內(nèi)置命令。
語法:umask [-p] [-S] [mode]
例:(可以把該命令放到初始文件)
umask 022
如果用戶掩碼為 022,那么新建普通文件的默認(rèn)模式就是 644,即 rw-r--r--。新建可執(zhí)行文件和目錄的模式則為 755,即 rwxr-xr-x。
為了文件更安全,可以把用戶掩碼設(shè)置成 077,即:
umask 077
四、符號鏈接
1、鏈接的概念
當(dāng) Unix 創(chuàng)建文件時,會完成兩件事。第一,Unix 在存儲節(jié)點保留一塊空間用來存儲數(shù)據(jù)。第二,Unix 創(chuàng)建一個稱為索引節(jié)點(index node)或 i 節(jié)點(i-node)的結(jié)構(gòu),用來存放文件的基本信息。
i 節(jié)點包含使用文件所需的全部文件系統(tǒng)信息。在 Unix 系統(tǒng)上,可以使用stat命令,方便地查看某個特定文件的 i 節(jié)點的內(nèi)容。
語法:stat [OPTION]... FILE...,display file or file system status.
如:
[nosee@instance-4 ~]$ ls -lshi letter.txt
405854 4.0K -rw-rw-rw- 1 nosee nosee 611 Jan 15 18:19 letter.txt
[nosee@instance-4 ~]$ stat letter.txt
File: letter.txt
Size: 611 Blocks: 8 IO Block: 4096 regular file
Device: 801h/2049d Inode: 405854 Links: 1
Access: (0666/-rw-rw-rw-) Uid: ( 1001/ nosee) Gid: ( 1002/ nosee)
Access: 2022-01-21 03:53:20.464013524 +0000
Modify: 2022-01-15 18:19:35.982654205 +0000
Change: 2022-01-22 18:11:03.352578229 +0000
Birth: -
當(dāng)處理目錄時,就好像目錄實際包含文件一樣。實際上,目錄只包含有文件的名稱及文件的 i 節(jié)點號。因此,目錄的內(nèi)容相當(dāng)小:只有一列名稱,每個名稱對應(yīng)一個 i 節(jié)點號。
文件名和 i 節(jié)點之間的連接稱為鏈接。從概念上講,鏈接將文件名和文件本身連接起來。
實際上,一個 i 節(jié)點可以由不止一個文件名引用。Unix 最出色的特征之一就是允許多重鏈接。文件的唯一標(biāo)識符是其 i 節(jié)點,而不是它的名稱。通過使用ln命令,你可以創(chuàng)建多個擁有相同 i 節(jié)點的文件。
2、創(chuàng)建新鏈接:ln
每當(dāng)創(chuàng)建新文件時,文件系統(tǒng)都會自動在文件名和文件之間創(chuàng)建一個鏈接。但是,有時候可能希望為已有文件創(chuàng)建一個新鏈接,這時可以使用ln(link 鏈接)命令。(make links between files)
語法:ln [OPTION]... [-T] TARGET LINK_NAME
或 ln [OPTION]... TARGET
或 ln [OPTION]... TARGET... DIRECTORY
或 ln [OPTION]... -t DIRECTORY TARGET...
1)為單個文件創(chuàng)建新鏈接
例:(帶-i選項的ls命令可以顯示文件的 i 節(jié)點號)
[nosee@instance-4 ~]$ ls -li l*
405854 -rw-rw-rw- 1 nosee nosee 611 Jan 15 18:19 letter.txt
[nosee@instance-4 ~]$ ln letter.txt letter
[nosee@instance-4 ~]$ ls -li l*
405854 -rw-rw-rw- 2 nosee nosee 611 Jan 15 18:19 letter
405854 -rw-rw-rw- 2 nosee nosee 611 Jan 15 18:19 letter.txt
此時兩個文件名(letter 和 letter.txt)都是指向同一個文件(即同一個 i 節(jié)點:405854)。其中文件權(quán)限后面的數(shù)字2就是文件的鏈接數(shù)。
2)為一個或多個普通文件創(chuàng)建新鏈接,并將新鏈接放在指定的目錄中。
[nosee@instance-4 ~]$ ls -li l*
405854 -rw-rw-rw- 2 nosee nosee 611 Jan 15 18:19 letter
405854 -rw-rw-rw- 2 nosee nosee 611 Jan 15 18:19 letter.txt
[nosee@instance-4 ~]$ mkdir ld
[nosee@instance-4 ~]$ ln letter* ld
[nosee@instance-4 ~]$ ls -liR l*
405854 -rw-rw-rw- 4 nosee nosee 611 Jan 15 18:19 letter
405854 -rw-rw-rw- 4 nosee nosee 611 Jan 15 18:19 letter.txt
ld:
total 8
405854 -rw-rw-rw- 4 nosee nosee 611 Jan 15 18:19 letter
405854 -rw-rw-rw- 4 nosee nosee 611 Jan 15 18:19 letter.txt
命令ln letter letter.txt ld與上面的命令ln letter* ld效果一樣。這時文件的連接數(shù)已經(jīng)是4個了。
3、基本文件命令的工作方式
1)創(chuàng)建文件/目錄
創(chuàng)建新文件或目錄時,Unix 會留出相應(yīng)的存儲空間并創(chuàng)建 i 節(jié)點。然后 Unix 在適當(dāng)?shù)哪夸浿型ㄟ^使用指定的文件名或目錄名以及新的 i 節(jié)點號置入一個新條目。
2)復(fù)制文件:cp
復(fù)制已有內(nèi)容時,Unix 用源文件的內(nèi)容替換目標(biāo)文件的內(nèi)容,但是 i 節(jié)點號并不進(jìn)行修改。
復(fù)制不存在的文件時,Unix 首先用新文件自己的 i 節(jié)點創(chuàng)建一個全新的文件,然后將舊文件的內(nèi)容復(fù)制到新文件中。復(fù)制之后兩個文件的內(nèi)容相同,但是 i 節(jié)點不相同。
3)重命名/移動文件:mv
重命名或移動文件時,Unix 改變文件名稱,或者移動目錄條目,或者兩者都進(jìn)行,但是保存相同的 i 節(jié)點號。
4)創(chuàng)建鏈接:ln
創(chuàng)建已有文件的新鏈接時,Unix 使用指定的文件名創(chuàng)建一個新的目錄條目,并指向原始文件的 i 節(jié)點。這樣一個文件就擁有兩個文件名,但是指向相同的 i 節(jié)點號。
5)移除鏈接:rm、rmdir
移除鏈接時,Unix 通過移除目錄條目,消除文件名和 i 節(jié)點之間的連接。如果文件已經(jīng)沒有鏈接,Unix 才會刪除該文件。大多數(shù)情況下一個文件只有一個鏈接,這也是為什么大多時候,rm 和 rmdir 都充當(dāng)刪除命令的原因。
4、符號鏈接:ln -s
前面討論的鏈接類型允許我們?yōu)橥粋€文件指定不止一個名稱,但是,這樣的鏈接有兩個限制。第一,不能為目錄創(chuàng)建鏈接。第二,不能為不同文件系統(tǒng)中的文件創(chuàng)建鏈接。
在創(chuàng)建不同文件系統(tǒng)中的目錄或文件鏈接時,需要創(chuàng)建所謂的符號鏈接(symbol link)。這樣做時,需要使用帶-s選項的ln命令。
符號鏈接包含的不是文件的 i 節(jié)點號,而是原文件的路徑名。(類似于 Windows 的快捷鍵)
例:
[nosee@instance-4 ~]$ ls -li l*
405854 -rw-rw-rw- 1 nosee nosee 611 Jan 15 18:19 letter.txt
[nosee@instance-4 ~]$ ln -s letter.txt lt
[nosee@instance-4 ~]$ ls -li l*
405854 -rw-rw-rw- 1 nosee nosee 611 Jan 15 18:19 letter.txt
406425 lrwxrwxrwx 1 nosee nosee 10 Jan 22 20:47 lt -> letter.txt
為了區(qū)分兩種類型的鏈接,一般將常規(guī)的鏈接稱為硬鏈接(hard link),而將符號鏈接稱為軟鏈接(soft link)。當(dāng)只使用“鏈接”本身時,所指的是硬鏈接。
注:為了顯示某一文件硬鏈接數(shù)量,可以使用ls -l命令查看。但是,沒有辦法顯示某一文件軟鏈接的數(shù)量,因為文件系統(tǒng)本身也不知道。
五、文件查找
1、查看與特定目錄相關(guān)的文件:whereis
whereis 程序用來查看與特定 Unix 命令相關(guān)的文件:二進(jìn)制(可執(zhí)行)文件、源文件和文檔文件。whereis 不搜索整個文件系統(tǒng),而只查看那些此類文件極有可能存在的目錄,例如 /bin、/sbin、/etc、/user/share/man 等。
whereis - locate the binary, source, and manual page files for a command.
常用命令:
-
-b,(binary 二進(jìn)制)只顯示可執(zhí)行文件的路徑名 -
-m,只查找聯(lián)機(jī)手冊中的文件 -
-s,只查找源文件的路徑名
例:
[nosee@instance-4 ~]$ whereis mysql
mysql: /usr/bin/mysql /usr/lib/mysql /etc/mysql /usr/share/man/man1/mysql.1.gz
[nosee@instance-4 ~]$ whereis -m mysql
mysql: /usr/share/man/man1/mysql.1.gz
2、通過搜索數(shù)據(jù)庫查看文件:locate
如果系統(tǒng)里沒有 locate 程序,可以使用sudo apt install mlocate命令去安裝。
locate 程序的任務(wù)就是搜索一個特殊的數(shù)據(jù)庫(該數(shù)據(jù)庫包含所有可公共訪問的文件的路徑名),查找所有包含特定模式的路徑名。
locate - find files by name.
語法:locate [OPTION]... PATTERN...
常用選項:
-
-r,使用正則列表式。 -
-c,統(tǒng)計匹配文件的總數(shù),而不顯示實際的文件名。 -
-i,忽略大小寫 -
-S,(大寫S)顯示系統(tǒng)上 locate 數(shù)據(jù)庫的信息
例:
[05:48 @nosee ~/Documents]$ locate a.txt
/home/nosee/Documents/add/a.txt
/snap/snap-store/558/usr/share/gnupg/help.ca.txt
/snap/snap-store/558/usr/share/gnupg/help.da.txt
/snap/snap-store/558/usr/share/gnupg/help.ja.txt
/usr/lib/firmware/brcm/brcmfmac43340-sdio.pov-tab-p1006w-data.txt
/usr/share/doc/xorg/howto/build-mesa.txt.gz
/usr/share/gnupg/help.ca.txt
/usr/share/gnupg/help.da.txt
/usr/share/gnupg/help.ja.txt
[06:08 @nosee ~/Documents]$ locate -S
Database /var/lib/mlocate/mlocate.db:
47,432 directories
496,075 files
34,387,530 bytes in file names
12,503,803 bytes used to store database
缺點:mlocate.db,這個數(shù)據(jù)庫并不是實時更新的,有些新添加的文件可能需要等待下次數(shù)據(jù)庫更新才查找得到。
3、通過搜索目錄樹查看文件:find
find 是最復(fù)雜的 Unix 工具之一。find 的一般思想就是搜索一個或多個目錄樹,根據(jù)測試條件,查找滿足特定標(biāo)準(zhǔn)的文件。一旦搜索完成,find 將對查找到的文件執(zhí)行某種動作。動作可以簡單得就如文件名的顯示。
find - search for files in a directory hierarchy
語法:find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]
1)常用選項
2)常見的模式
find 程序一般的語法為:find [path]... [test]... [action]...
為了運行 find 需要指定 3 件事(按下述順序):目錄路徑、測試、動作。
例:
[nosee@instance-4 ~]$ find test -name a -print
test/a
test/mydoc/text/a
如上,可以將這條命令分成三部分:
路徑:test,從 ./test 開始,搜索所有的文件和子目錄
測試:-name a,對于每個文件,應(yīng)用測試 -name a(這里的意思是查找名為 a 的文件)
動作:-print,對每個通過測試的文件,執(zhí)行動作 -print(顯示路徑名)
無論 find 命令多復(fù)雜,都可以用這種方式進(jìn)行分析。
3)find 命令:路徑
一般,find 命令的開頭由一個或多個路徑構(gòu)成,這些路徑說明 find 從何處開始進(jìn)行搜索。
例:
[nosee@instance-4 ~]$ find ./test/
./test/
./test/A
./test/a
./test/z
./test/Z
./test/mydoc
./test/mydoc/haha.txt
./test/mydoc/text
./test/mydoc/text/a
./test/mydoc/text/a/b
4)find 命令:測試
使用 find 命令搜索一個或多個目錄樹,查找滿足指定標(biāo)準(zhǔn)的文件,然后對查找到的文件執(zhí)行特定的動作。為了定義標(biāo)準(zhǔn),我們可以指定一個或多個測試。常見的測試如下表:
| 測試 | 說明 |
|---|---|
| 文件名 | —— |
| -name pattern | 包含 pattern 的文件名 |
| -iname pattern | 包含 pattern 的文件名(不區(qū)分大小寫) |
| 文件特征 | —— |
| -type [df] | 文件類型:d=目錄,f=普通文件 |
| -perm mode | 設(shè)置為 mode 的文件權(quán)限 |
| -user userid | 屬主為 userid |
| -group groupid | 組為 groupid |
| -size [-+]n[cbkMG] | 大小為 n [字符(字節(jié))、塊、千字節(jié)、兆字節(jié)、吉字節(jié)] |
| -empty | 空文件(大小=0) |
| 訪問時間、修改時間 | —— |
| -amin [-+]n | n 分鐘之前訪問 |
| -anewer file | file 文件之后訪問 |
| -atime [-+]n | n 天之前訪問 |
| -cmin [-+]n | n 分鐘之前狀態(tài)改變 |
| -cnewer file | file 文件之后狀態(tài)改變 |
| -ctime [-+]n | n 天之前狀態(tài)改變 |
| -mmin [-+]n | n 分鐘之前修改 |
| -mtime [-+]n | n 天之前修改 |
| -newer file | file 文件之后修改 |
例:查找 test 目錄下的所有目錄
[nosee@instance-4 ~]$ find test -type d
test/
test/mydoc
test/mydoc/text
test/mydoc/text/a
test/mydoc/text/a/b
例:查找 test 目錄下文件的權(quán)限模式為 644 的文件
[nosee@instance-4 ~]$ find test -perm 644
test/A
test/a
test/z
test/Z
test/mydoc/haha.txt
5)find 命令:動作
動作告訴 find 對查找到的文件執(zhí)行什么操作。常見動作如下:
| 動作 | 說明 |
|---|---|
| 將路徑名寫入到標(biāo)準(zhǔn)輸出(大部分 find 的默認(rèn)動作都是-print) | |
| -fprint file | 結(jié)果同 -print,將輸出寫入到 file 文件中 |
| -ls | 顯示文件詳細(xì)信息的長列表 |
| -fls file | 結(jié)果同 -ls,將輸出寫入到 file 文件中 |
| -delete | 刪除搜索到的結(jié)果 |
| -exec command {} \; | 執(zhí)行 command,{}指示匹配的文件名 |
| -ok command {} \; | 同 -exec,但是在運行 command 之前進(jìn)行確認(rèn) |
例:
[nosee@instance-4 ~]$ find test -perm 644 -ls
406488 0 -rw-r--r-- 1 nosee nosee 0 Jan 21 01:52 test/A
406243 0 -rw-r--r-- 1 nosee nosee 0 Jan 21 01:52 test/a
406504 0 -rw-r--r-- 1 nosee nosee 0 Jan 21 01:52 test/z
406509 0 -rw-r--r-- 1 nosee nosee 0 Jan 21 01:52 test/Z
393708 4 -rw-r--r-- 1 nosee nosee 7 Jan 20 19:54 test/mydoc/haha.txt
例:刪除文件z
[nosee@instance-4 ~]$ tree test/
test/
├── A
├── Z
├── a
├── mydoc
│ ├── haha.txt
│ └── text
│ └── a
│ └── b
└── z
4 directories, 5 files
[nosee@instance-4 ~]$ find test/ -iname z -delete
[nosee@instance-4 ~]$ tree test/
test/
├── A
├── a
└── mydoc
├── haha.txt
└── text
└── a
└── b
4 directories, 3 files
六、參考
書箱:《Unix & Linux 大學(xué)教程》第二十五章 (美)Harley Hahn 著 張杰良 譯