Linux深入探索14-文件操作

----- 最近更新【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 admv ?.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ù)的可能性? \bigg({沒有可能!}\bigg)

注意:
文件一旦刪除,就沒有辦法再找回這個文件。但是,文件所使用的實際磁盤空間還沒有被清除。文件系統(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)使用命令idgroups可以查看你的用戶標(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í)行什么操作。常見動作如下:

動作 說明
-print 將路徑名寫入到標(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 著 張杰良 譯

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容