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 ad
或mv ?.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)使用命令id
或groups
可以查看你的用户标识所属的用户组,一般都是与用户标识同名的一个用户组。
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 对查找到的文件执行什么操作。常见动作如下:
动作 | 说明 |
---|---|
将路径名写入到标准输出(大部分 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 著 张杰良 译
作者:四月不见
出处:https://www.cnblogs.com/nosee/p/15842551.html
本文版权归作者所有,转载请注明原文链接。