美文网首页Linux终极玩家
Linux深入探索14-文件操作

Linux深入探索14-文件操作

作者: 四月不见 | 来源:发表于2022-01-22 23:44 被阅读0次

    ----- 最近更新【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 著 张杰良 译

    相关文章

      网友评论

        本文标题:Linux深入探索14-文件操作

        本文链接:https://www.haomeiwen.com/subject/wiadhrtx.html