Linux深入探索14-文件操作

----- 最近更新【2022-01-23】-----

本文目录结构预览:

  • 一、简介
  • 二、文件操作
    1、创建文件:touch
    2、复制文件:cp
    3、移动或重命名文件:mv
    4、删除文件:rm
  • 三、文件权限
    1、权限说明:读、写、执行
    2、权限说明:属主、用户组、其它用户
    3、特殊权限:setuid
    4、文件模式
    5、权限修改:chmod
    6、用户掩码:umask
  • 四、符号链接
    1、链接的概念
    2、创建新链接:ln
    3、基本文件命令的工作方式
    4、符号链接:ln -s
  • 五、文件查找
    1、查看与特定目录相关的文件:whereis
    2、通过搜索数据库查看文件:locate
    3、通过搜索目录树查看文件:find
  • 六、参考

一、简介

本篇文件主要讨论在 Linux 中,关于普通文件的创建、复制、重命名、权限管理等操作。

二、文件操作

1、创建文件:touch

1)自动创建文件

在很多时候,Linux 会为我们自动创建文件。如:

  • 当需要时,许多程序将自动地创建文件。(如,使用 vim 打开一个不存在的文件。
  • 当将输出重定向到一个不存在的文件时,那么 shell 将创建该文件。
  • 当复制文件,复制程序将创建新文件。

2)创建一个空文件:touch

touch 程序经常用于创建一个新的空文件。如:

[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](时间格式)替换当前时间。默认情况下,touch 同时将修改时间和访问时间设置为当前时间。
  • -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:同时创建多个文件

[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、复制文件: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

默认情况,当使用 cp 程序复制文件时,如果目标文件不存在那么 cp 会创建该文件,如果目录已经存在那么 cp 将替换这个文件。

语法:cp [OPTION]... [-T] SOURCE DEST
或者cp [OPTION]... SOURCE... DIRECTORY
或者cp [OPTION]... -t DIRECTORY SOURCE...

常用选项:

  • -i,(interactive 交互)在替换文件之前进行提示(忽略前面的-n选项)
  • -n,不覆盖已存在的文件(忽略前面的-i选项)
  • -p,(preserve 保持)使用目标文件和源文件拥有相同的修改时间、访问时间以及权限
  • -R/ -r, (recursive 递归)将目录及其所有文件复制到另一个目录中
    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)将文件复制到不同的目录中(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)将目录复制到另一个目录中

例:将目录 ad 及其内容复制到 目录 ccc(目标目录 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 及其内容复制到 目录 ccc(目标目录 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

如果目标目录 ccc 已存在,又不想把原目录也复制过去,可使用cp -r ad/* ccc

3、移动或重命名文件:mv

mv - 重命名(移动)文件。(move (rename) files)

使用 mv 程序可以将文件从一个位置“移动”到另一个位置,如果新位置和原来在同一个目录中,那么实际结果就是对原始文件“重命名”。当 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 交互)在替换已有文件之前进行询问。
  • -f,(force 强制)在不询问的情况下替换文件,所以要小心使用。

例:移动多个文件

[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

注:如果文件已经在目标目录中存在,那么源文件将替换目标文件。

例:重命名

[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 强制)在不询问的情况下直接删除,小心使用!
  • -r,(recursive 递归)删除整个目录树

注:
1)如果试图删除一个没有写权限的文件,那么 rm 将请求许可,在用户许可的情况下系统将忽略文件权限保护机制。
2)-f选项将忽略文件权限和-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

最后一个问题:被删除文件恢复的可能性? \(\bigg({没有可能!}\bigg)\)

注意:
文件一旦删除,就没有办法再找回这个文件。但是,文件所使用的实际磁盘空间还没有被清除。文件系统只是将这部分磁盘空间标识为可重用。最终,这部分磁盘空间将被重用,旧数据将被新数据覆盖。在忙碌的大型 Unix 系统中,这可以只需要几秒钟。但是,无法确定这种情况什么时候发生,有时候旧数据可能会在磁盘的未使用部分隐藏很长一段时间。实际上,有一些特殊的:“恢复删除”工具能够查看有磁盘未使用的部分,并恢复旧数据。
此外,即便数据被覆盖, ,在极端的情况下数据也有可能恢复,只要数据没有被多次覆盖。如果将硬盘拿到拥有非常昂贵的数据恢复设备的实验室去,则有可能通过分析硬盘磁面的磁迹恢复硬盘上被覆盖过的旧数据。

三、文件权限

Unix 为每个谁的维护一组文件权限(file permission),通常称为权限(permission)。

1、权限说明:读、写、执行

权限有三种,包括读权限(read permission)、写权限(write permission)和 执行权限(execute permission)。这三种权限相互之间彼此独立。

文件权限的准确含义依赖于文件的类型。对于一个不可执行的文件来说,拥有执行权限没有任何意义。

权限 说明
普通文件 ——
读(r) 读取文件
写(w) 写入文件
执行(x) 执行文件
目录 ——
读(r) 读取目录
写(w) 创建、移动、复制或删除目录条目
执行(x) 搜索目录

三种权限是相互区别的,但是可以结合使用。例如,为了修改一个文件,就需要同时拥有该文件的读权限和写权限。为了运行一个 shell 脚本,就需要同时拥有读权限和执行权限。

对于目录而言,目录的权限和普通文件有所不同。读权限允许用户标识读取目录中的文件,写权限允许用户标识修改目录(创建、移动、复制、删除),执行权限允许用户搜索目录。

如果只拥有读权限,则只能列举目录中的文件名,仅此而已。除非拥有执行权限,否则不能查看文件的大小、查看子目录或者使用cd改变目录。

注:
一个目录条目仅包含一个文件名,以及一个指向该文件的指针,并不包含实际的文件。所以对目录只有读权限时,是查看不了文件的大小的。

2、权限说明:属主、用户组、其它用户

文件权限控制用户标识对文件的访问。每个文件有 3 组权限:一组针对属主、一组针对组、一组针对其它用户。然后每组权限又分为读、写 和 执行 3 部分。

使用ls -l查看文件时,会看到一条类似于-rwsr-xr-x的字符串,这就是该文件的权限。如:

[nosee@instance-4 ~]$ ls -ld test
drwxr-xr-x 3 nosee nosee 4096 Jan 21 01:52 test

上面例子中,文件的属主就是从左往右看的第一个 nosee,第二个 nosee 是用户组。
该文件的权限就是rwxr-xr-x(第一个字符d表示文件的类型为目录)。其中分为三组:
前面 3 个字符(第一组权限)就表示用户属主对该文件拥有的权限。
中间 3个字符(第二组权限)用来表示该用户组对该文件拥有的权限。
最后 3 个字符(第三组权限)则表示其它用户标识对该文件所拥有的权限。

注:
1)属主是可以改变文件权限的唯一用户标识。(root 例外,root 可以做任何事情)
2)第三组的其它用户,不包含用户属主,和用户组中的成员。
3)使用命令idgroups可以查看你的用户标识所属的用户组,一般都是与用户标识同名的一个用户组。
4)Unix 系统允许一个用户标识同时属于多个组。
5)除非确实需要与组中的其它用户共享文件,否则可以忽略这一思想,因为很少需要用到。

3、特殊权限:setuid

通常,每当运行程序时,该程序将在你的用户标识的授权下运行。这意味着,你的程序拥有和用户标识相同的权限。

有时候,普通的用户标识有可能需要以特殊的权限运行程序。为了使这一点成为可能,人们设计了一个特殊的文件设置权限,以允许其它用户标识访问文件,就好像他们是文件的属主(创建者)一样。这个特殊的权限称为 setuid 或者 suid。

大多数情况中,setuid 用来允许用户标识运行从 root 拥有的程序中挑选的程序。这意味着无论哪个用户标识运行程序,它都以 root 的特权运行。这样就允许程序完成通常由超级用户执行的任务。

例如,为了修改口令,需要使用 passwd 程序。但是修改口令,该程序必须修改 /etc/passwd 文件和 /etc/shadow 文件,而修改这两个文件需要 root 的特殊。基于这一原因,passwd 程序本身存储在一个由 root 拥有的文件中,并且打开了 setuid。

setuid 权限就是将文件权限中的字母“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 位数字的代码来表示一个完整的文件权限集。该代码称为文件模式(file mode),或者简称为模式(mode)。

例如rw-------表示600的模式。
6 = 属主的权限
0 = 组的权限
0 = 其它用户标识的权限

读、写和执行,每个权限都有对应的一个权限数值:
读权限 = 4
写权限 = 2
执行权限 = 1
没有权限 = 0

例如rwxrw-r--对应的权限模式可以这样算:(4+2+1)=7
rwx = 4+2+1= 7
rw- = 4+2+0 = 6
r-- = 4+0+0 = 4
所以文件的权限模式为:764

5、权限修改:chmod

改变文件的权限,需要使用 chmod 命令。(change file mode bits)

语法:chmod [OPTION]... MODE[,MODE]... FILE...
chmod [OPTION]... OCTAL-MODE FILE...
chmod [OPTION]... --reference=RFILE FILE...

只有属主和超级用户才可以改变文件的权限模式。

例:

[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

当 Unix 创建新文件时,将根据文件的类型为文件指定下述几种模式:
666:不可执行的普通文件
777:可执行的普通文件
777:目录

在这一初始模式上,Unix 再减去用户掩码(user mask)值,就是新文件的权限的值。

umask - Display or set file mode mask. 查看 umask 的使用说明:help umask,umask 是一个内置命令。

语法:umask [-p] [-S] [mode]

例:(可以把该命令放到初始文件)

umask 022

如果用户掩码为 022,那么新建普通文件的默认模式就是 644,即 rw-r--r--。新建可执行文件和目录的模式则为 755,即 rwxr-xr-x。

为了文件更安全,可以把用户掩码设置成 077,即:

umask 077

四、符号链接

1、链接的概念

当 Unix 创建文件时,会完成两件事。第一,Unix 在存储节点保留一块空间用来存储数据。第二,Unix 创建一个称为索引节点(index node)或 i 节点(i-node)的结构,用来存放文件的基本信息。

i 节点包含使用文件所需的全部文件系统信息。在 Unix 系统上,可以使用stat命令,方便地查看某个特定文件的 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: -

当处理目录时,就好像目录实际包含文件一样。实际上,目录只包含有文件的名称及文件的 i 节点号。因此,目录的内容相当小:只有一列名称,每个名称对应一个 i 节点号。

文件名和 i 节点之间的连接称为链接。从概念上讲,链接将文件名和文件本身连接起来。

实际上,一个 i 节点可以由不止一个文件名引用。Unix 最出色的特征之一就是允许多重链接。文件的唯一标识符是其 i 节点,而不是它的名称。通过使用ln命令,你可以创建多个拥有相同 i 节点的文件。

2、创建新链接:ln

每当创建新文件时,文件系统都会自动在文件名和文件之间创建一个链接。但是,有时候可能希望为已有文件创建一个新链接,这时可以使用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)为单个文件创建新链接

例:(带-i选项的ls命令可以显示文件的 i 节点号)

[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 节点:405854)。其中文件权限后面的数字2就是文件的链接数。

2)为一个或多个普通文件创建新链接,并将新链接放在指定的目录中。

[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效果一样。这时文件的连接数已经是4个了。

3、基本文件命令的工作方式

1)创建文件/目录
创建新文件或目录时,Unix 会留出相应的存储空间并创建 i 节点。然后 Unix 在适当的目录中通过使用指定的文件名或目录名以及新的 i 节点号置入一个新条目。

2)复制文件:cp
复制已有内容时,Unix 用源文件的内容替换目标文件的内容,但是 i 节点号并不进行修改。
复制不存在的文件时,Unix 首先用新文件自己的 i 节点创建一个全新的文件,然后将旧文件的内容复制到新文件中。复制之后两个文件的内容相同,但是 i 节点不相同。

3)重命名/移动文件:mv
重命名或移动文件时,Unix 改变文件名称,或者移动目录条目,或者两者都进行,但是保存相同的 i 节点号。

4)创建链接:ln
创建已有文件的新链接时,Unix 使用指定的文件名创建一个新的目录条目,并指向原始文件的 i 节点。这样一个文件就拥有两个文件名,但是指向相同的 i 节点号。

5)移除链接:rm、rmdir
移除链接时,Unix 通过移除目录条目,消除文件名和 i 节点之间的连接。如果文件已经没有链接,Unix 才会删除该文件。大多数情况下一个文件只有一个链接,这也是为什么大多时候,rm 和 rmdir 都充当删除命令的原因。

4、符号链接:ln -s

前面讨论的链接类型允许我们为同一个文件指定不止一个名称,但是,这样的链接有两个限制。第一,不能为目录创建链接。第二,不能为不同文件系统中的文件创建链接。

在创建不同文件系统中的目录或文件链接时,需要创建所谓的符号链接(symbol link)。这样做时,需要使用带-s选项的ln命令。

符号链接包含的不是文件的 i 节点号,而是原文件的路径名。(类似于 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

为了区分两种类型的链接,一般将常规的链接称为硬链接(hard link),而将符号链接称为软链接(soft link)。当只使用“链接”本身时,所指的是硬链接。

注:为了显示某一文件硬链接数量,可以使用ls -l命令查看。但是,没有办法显示某一文件软链接的数量,因为文件系统本身也不知道。

五、文件查找

1、查看与特定目录相关的文件:whereis

whereis 程序用来查看与特定 Unix 命令相关的文件:二进制(可执行)文件、源文件和文档文件。whereis 不搜索整个文件系统,而只查看那些此类文件极有可能存在的目录,例如 /bin、/sbin、/etc、/user/share/man 等。

whereis - locate the binary, source, and manual page files for a command.

常用命令:

  • -b,(binary 二进制)只显示可执行文件的路径名
  • -m,只查找联机手册中的文件
  • -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、通过搜索数据库查看文件:locate

如果系统里没有 locate 程序,可以使用sudo apt install mlocate命令去安装。

locate 程序的任务就是搜索一个特殊的数据库(该数据库包含所有可公共访问的文件的路径名),查找所有包含特定模式的路径名。

locate - find files by name.

语法:locate [OPTION]... PATTERN...

常用选项:

  • -r,使用正则列表式。
  • -c,统计匹配文件的总数,而不显示实际的文件名。
  • -i,忽略大小写
  • -S,(大写S)显示系统上 locate 数据库的信息

例:

[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,这个数据库并不是实时更新的,有些新添加的文件可能需要等待下次数据库更新才查找得到。

3、通过搜索目录树查看文件:find

find 是最复杂的 Unix 工具之一。find 的一般思想就是搜索一个或多个目录树,根据测试条件,查找满足特定标准的文件。一旦搜索完成,find 将对查找到的文件执行某种动作。动作可以简单得就如文件名的显示。

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,对于每个文件,应用测试 -name a(这里的意思是查找名为 a 的文件)
动作:-print,对每个通过测试的文件,执行动作 -print(显示路径名)

无论 find 命令多复杂,都可以用这种方式进行分析。

3)find 命令:路径

一般,find 命令的开头由一个或多个路径构成,这些路径说明 find 从何处开始进行搜索。

例:

[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 命令搜索一个或多个目录树,查找满足指定标准的文件,然后对查找到的文件执行特定的动作。为了定义标准,我们可以指定一个或多个测试。常见的测试如下表:

测试 说明
文件名 ——
-name pattern 包含 pattern 的文件名
-iname pattern 包含 pattern 的文件名(不区分大小写)
文件特征 ——
-type [df] 文件类型:d=目录,f=普通文件
-perm mode 设置为 mode 的文件权限
-user userid 属主为 userid
-group groupid 组为 groupid
-size [-+]n[cbkMG] 大小为 n [字符(字节)、块、千字节、兆字节、吉字节]
-empty 空文件(大小=0)
访问时间、修改时间 ——
-amin [-+]n n 分钟之前访问
-anewer file file 文件之后访问
-atime [-+]n n 天之前访问
-cmin [-+]n n 分钟之前状态改变
-cnewer file file 文件之后状态改变
-ctime [-+]n n 天之前状态改变
-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 目录下文件的权限模式为 644 的文件

[nosee@instance-4 ~]$ find test -perm 644
test/A
test/a
test/z
test/Z
test/mydoc/haha.txt

5)find 命令:动作

动作告诉 find 对查找到的文件执行什么操作。常见动作如下:

动作 说明
-print 将路径名写入到标准输出(大部分 find 的默认动作都是-print)
-fprint file 结果同 -print,将输出写入到 file 文件中
-ls 显示文件详细信息的长列表
-fls file 结果同 -ls,将输出写入到 file 文件中
-delete 删除搜索到的结果
-exec command {} \; 执行 command,{}指示匹配的文件名
-ok command {} \; 同 -exec,但是在运行 command 之前进行确认

例:

[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 大学教程》第二十五章 (美)Harley Hahn 著 张杰良 译

posted @ 2022-01-26 08:44  四月不见  阅读(58)  评论(0编辑  收藏  举报