快捷搜索:

Unix系统下Find命令的三个高级应用

Find敕令是Unix操作系统中一个很强大年夜的对象。这个敕令除了可以用来定位文件外,还有其他许多很实用的用途。如可以用来备份文件、交互式删除文件、枚举文件清单等等。只要机动利用这些功能的话,那么对付系统工程师的日常事情就能够起到事半功倍的效果。

一、使用Find敕令对文件进行备份。

如在Unix操作系统中有一个用户为oracle。系统会在Home目录下自动为这个用户创建一个子目录Oracle。现在用户盼望能够对自己目录下的文件进行自动备份,以防止文件的以外损掉。如下图所示,现在系统工程师筹备把用户目录下面的文件备份到backup目录下面,并把文件名字重命名为backup。这个功能可以实现呢?谜底当然是肯定的。可以使用find敕令结合cp敕令来实现这个功能。

1、文件的着末改动光阴。

在Unix系统的文件属性中,有异常紧张的三个光阴截,分手为文件着末改动光阴、文件着末造访光阴、inode节点着末改动光阴。一旦用户对某个文件履行了变动操作,则文件inode节点里的着末改动光阴就会被更新了。必要留意的是,在Unix操作系统中目录也被算作文件的一种,为此对目录的改动,如创建一个目录或者变动目录的名字也会被算作文件的改动来对待。别的文件改动后,只会变动文件的改动光阴,而不会影响到目录的着末改动光阴。以是假如一个目录下有一个文件变动了,则在备份的时刻只必要备份这个变动的文件即可,而不必要备份这个目录下其他没有变动的文件。

出于备份效率的斟酌,在备份的时刻只备份当天改动过的文件。为此在备份时首先要做的便是找到这些近来变动过的文件。这个办理的思路便是从这个文件的着末改动光阴入手。在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中,让操作系统在天天正午或者其他余暇的光阴周期性履行这个敕令即可。如斯的话,操作系统就会自动对用户的文件进行备份,以防止文件意外毁坏或者改动所造成的丧掉。

别的必要留意的是,在Unix操作系统中find敕令只可以找到近来一天改动的文件。而在Linux操作系统中,还有mmin参数,这个参数因此分钟为单位,如可以找到那些近来4个小时或者1个小时之内改动过的文件,从而前进备份的频率。为此系统工程师可以根据用户的必要来调剂文件备份的频率。不过笔者觉得,一样平常环境下文件备份一天一次即可。

二、把找到的文件清单保存到文件中。

Find敕令还可以根据文件的权限来查找。如把用户主目录下所有用户都可以读写的文件找出来。这些文件所有的用户都可以改动,为此具有必然的安然隐患。系统工程师可能盼望把这些文件对应的清单保存到一个文件中,然后他们可以根据这份清单一个个的去调剂权限。假如只是显示在屏幕中的话,对付他们后需的事情很未方便。总不能够拿笔抄下来或者每改动一个履行一下查询敕令吧?为此把找到的文件清单保存到一个文本文件中是必需的。要实现这个需求的话,可以采纳如下敕令:

Find /home –perm 666 –type f –ls >detail.txt

在这条敕令中,前提语句中主要用了两个参数,分手为权限参数perm与文件类型参数-type。在Unix操作系统中主要包括三类文件(另外几类不怎么用),分手为通俗文件、目录文件与连接文件。这里只必要探求通俗文件,为此就可以使用-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交互式选项。默认环境下文件删除时是不必要用户确认的。然则无疑这是对照危险的一个动作。为此在涉及到文件删除操作、或者原始文件可能被覆盖的环境下,最好能够应用交互式的要领进行。

您可能还会对下面的文章感兴趣: