Find命令是Linux操作系统中一个很强大的工具。这个命令除了可以用来定位文件外,还有其他许多很实用的用途。如可以用来备份文件、交互式删除文件、列举文件清单等等。只要灵活应用这些功能的话,那么对于系统工程师的日常工作就能够起到事半功倍的效果。
一、利用Find命令对文件进行备份
如在Linux操作系统中有一个用户为oracle。系统会在Home目录下自动为这个用户创建一个子目录Oracle。现在用户希望能够对自己目录下的文件进行自动备份,以防止文件的以外丢失。如下图所示,现在系统工程师准备把用户目录下面的文件备份到backup目录下面,并把文件名字重命名为backup。这个功能可以实现呢?答案当然是肯定的。可以利用find命令结合cp命令来实现这个功能。
1、文件的最后修改时间。
在Linux系统的文件属性中,有非常重要的三个时间截,分别为文件最后修改时间、文件最后访问时间、inode节点最后修改时间。一旦用户对某个文件执行了更改操作,则文件inode节点里的最后修改时间就会被更新了。需要注意的是,在Linux操作系统中目录也被当作文件的一种,为此对目录的修改,如创建一个目录或者更改目录的名字也会被当作文件的修改来对待。另外文件修改后,只会更改文件的修改时间,而不会影响到目录的最后修改时间。所以如果一个目录下有一个文件更改了,则在备份的时候只需要备份这个更改的文件即可,而不需要备份这个目录下其他没有更改的文件。
出于备份效率的考虑,在备份的时候只备份当天修改过的文件。为此在备份时首先要做的就是找到这些最近更改过的文件。这个解决的思路就是从这个文件的最后修改时间入手。在find命令中有一个参数为mtime,它表示修改时间少于x天。如果我们把这个参数设置为1,那么find命令就可以找出在最近一天内修改过的文件。为此只需要对这些找到的文件进行备份即可。
2、重命名文件。
需要备份的文件找到之后,接下去要做的就是利用cp命令把这些文件复制到其他目录中去。但是这里还需要做的一件事情是在复制过去后需要把文件进行重命名,即在原来文件的后面加上.backup,以提醒用户这些是备份文件,不能够删除或者修改。要实现这个功能的话,就需要用到文件名的占位符号。如果利用cp命令复制文件后同时批量更改文件的名字,只需要使用 cp {} {}.backup即可。这里的{}符号就是文件名的占位符号。cp {} {}.backup这个命令的功能就是先把文件复制到一个特定的目录中,然后在对复制过去的每个文件进行重命名,后面都依次加上.backup内容。
为此要实现上面文件备份的需要,只需要使用命令
find /home/oracle –mtime 1 –exec cp {} /backup/{}.backup /;即可。
执行这个命令后,系统会在用户主目录下寻找所有修改时间少于1天的文件,并把找到的文件复制到/backup目录下。并在每一个原始文件后面增加一个扩展名.backup。最后的/;是一个固定格式必须要有。然后系统工程师只需要把这个命令加入到cron中,让操作系统在每天中午或者其他空闲的时间周期性执行这个命令即可。如此的话,操作系统就会自动对用户的文件进行备份,以防止文件意外损坏或者修改所造成的损失。
另外需要注意的是,在Linux操作系统中find命令只可以找到最近一天修改的文件。而在Linux操作系统中,还有mmin参数,这个参数是以分钟为单位,如可以找到那些最近4个小时或者1个小时之内修改过的文件,从而提高备份的频率。为此系统工程师可以根据用户的需要来调整文件备份的频率。不过笔者认为,一般情况下文件备份一天一次即可。
二、把找到的文件清单保存到文件中
Find命令还可以根据文件的权限来查找。如把用户主目录下所有用户都可以读写的文件找出来。这些文件所有的用户都可以修改,为此具有一定的安全隐患。系统工程师可能希望把这些文件对应的清单保存到一个文件中,然后他们可以根据这份清单一个个的去调整权限。如果只是显示在屏幕中的话,对于他们后需的工作很不方便。总不能够拿笔抄下来或者每修改一个执行一下查询命令吧?为此把找到的文件清单保存到一个文本文件中是必需的。要实现这个需求的话,可以采用如下命令:
Find /home –perm 666 –type f –ls >detail.txt
在这条命令中,条件语句中主要用了两个参数,分别为权限参数perm与文件类型参数-type。在Linux操作系统中主要包括三类文件(其余几类不怎么用),分别为普通文件、目录文件与连接文件。这里只需要寻找普通文件,为此就可以利用-type参数来指定需要查找的文件类型。另外值得注意的是,如果在条件语句中有多个参数话,则其默认会采取的是与运算,即必须同时满足以上两个条件的文件才会被查找出来。如果系统工程师需要采用或预算的话,则需要在参数之间加入-o可选项,它表示条件之间的关系是或的关系,只需要满足其中任何一个条件即可。在查询条件中还有一个很重要的操作符,即!操作符,它表示相反的条件。如现在系统工程师想查找所有的目录文件与普通文件(不考虑其他种类的特殊文件),则有两种表示方法。一是 –type f –o –type –d;二是! –type l。很明显采用了!操作符的第二种处理方式要简单的多。为此系统工程师可以根据自己的需要来选择合适的操作符。
其次在第三部分的动作参数中大家可以看到,在上面的例子中采用了exec关键字,但是在这个例子中却没有用到。这是为什么呢?原来在find命令的定义中,由于ls命令与print命令比较常用,为此用到这两个命令的时候,直接利用横杆加上命令即可。如果使用其他命令则需要加入exec关键字。
三、交互式复制找到的文件
如现在用户需要把某个文件夹下自己所创建的文件复制到另外一个目录中。但是并不是所有的文件,用户希望能够自己来选择是否需要进行复制。要实现这个目的的话,就需要用到find命令中的ok参数。在命令参数种加入-ok选项,主要是告诉操作系统这个命令需要以交互式的方式来执行。当用户输入y的话,操作系统就会执行这些动作;而输入n的话,则会忽略。
如要实现上面这个需求,可以执行这个命令来实现。Find /home –user oracle –ok cp {} /backup /;此时这个OK选项的意思就是当把每个查找到的文件移动到指定的目录时,不管目标文件是否存在,都需要用户进行确认。只有用户输入y后,ok 后面的命令才会被执行,否则的话就会被忽略不计。除了OK选项外,有些命令本身就包含了一个交互性的选项。如rm文件删除命令。若没有带-i交互性选项的话,则操作系统会直接删除文件,而不会等待用户确认。但是若在这个命令后面加入-i选项的话,则每删除一个文件的话,系统就会提示用户确认。只要命令本身就支持这个-i交互式选项,那么在find命令中就可以直接使用这个参数,而不需要利用ok选项。在大部分命令中,这两个选项的效果是相同的。但是有些则不同。如CP命令。Cp –i命令表示把文件从一个地方复制到另外一个地方,如果目标文件已经存在的话,则会提醒用户是否需要覆盖;如果不存在的话则会直接复制过去。但是采用ok 选项的话则表示无论目标文件是否存在,都需要系统管理员一一进行确认。也就是说-i选项只有在目标文件存在的时候,可能需要覆盖才会让用户进行确认。而 ok选项的话则根本不管目标文件存在与否,都要进行确认。到底需要采用哪个参数,则就要根据用户的需要了。
另外也可以利用这个find命令来交互式的删除文件。如Find /home –user oracle –exec rm –I {} /;。在这个命令中就是用到了rm删除命令自带的-i交互式选项。默认情况下文件删除时是不需要用户确认的。但是无疑这是比较危险的一个动作。为此在涉及到文件删除操作、或者原始文件可能被覆盖的情况下,最好能够使用交互式的方式进行。