比如操作系统中有一个目录文件compierebook,它下面有两个子目录文件,分别是chap01和chap02。现在用户需要删除目录文件compierebook。这时候我该怎么办?如果用户直接使用rmdir compierebook命令,系统会提示“目录不为空,无法删除”的错误信息。是否必须先用命令删除所有子目录,然后再删除compierebook目录文件?其实不是,下面笔者就给大家介绍一个带子目录的目录文件。即同时删除所有子目录文件和当前目录文件。
1.文件创建和删除的控制和管理。
在Unix操作系统中,普通的文件和目录都是文件。因此,在操作系统中,普通文件和目录文件都对应一个文件名和inode号。当用户创建目录时,关于所创建目录的文件名和信息节点信息将被添加到该文件的父目录文件中。同样,在删除一个目录文件时,其父目录文件中关于要删除的目录的信息也会被删除。所以在删除一个目录时,系统会检查目录文件,看是否有下级子目录的信息。如果是,它会拒绝删除,并提醒用户‘目录不能删除,除非是空的’。如果下一级没有子目录信息,系统将删除用户指定的目录。因此,在Unix系统中删除目录时,必须逐级删除。删除当前子目录,然后删除上一个目录。
第二,在rmdir中取多个参数。
在大多数情况下,当我们使用rmdir命令删除一个目录时,我们只需要一个目录文件名参数,比如rmdir compierebook。其实看这个命令的帮助,可以发现这个命令可以带多个文件名参数,也就是同时删除多个目录文件。例如,用户可以使用rmdir目录文件1、目录文件2、目录文件3(中间用空格分隔)等同时删除多个目录文件。如果要注意的话,删除目录的时候,是有顺序的。即先删除目录文件1,再删除目录文件2,最后删除目录文件3。因此,虽然在同一个命令中引入了三个参数,但在删除时并不是一起删除,而是按照参数的顺序依次删除文件。
这能给我们一些启发吗?其实由于文件是一个一个删除的,所以我们可以先放子目录文件的参数,最后放父目录文件的参数。可以一次性删除带子目录的目录文件吗?如上例所示,如果作者使用rmdir chap01 chap02 compierebook会怎么样?执行完这个命令后,大家会惊讶地发现,这个命令居然可以成功执行。然后再看相关目录,你会发现这个目录文件(包括它的两个子目录文件)已经被删除了。因此,当我们删除带有子目录的目录文件时,我们不需要多次执行rmdir命令。而是只需要在这个命令中填入几个目录文件名参数,然后执行一次。执行该命令时,系统首先删除子目录chap01,然后删除其上级目录文件compierebook中chap01目录的文件名和inode信息。完成此步骤后,删除第一个文件chap02。它还执行这两个步骤来删除自己的目录,同时更新上级目录文件的相关信息。然后删除第三个文件。删除第三个文件时,由于目录文件中没有子目录文件的信息,所以可以正常删除第三个文件。
在执行这个命令时,我们应该注意三个细节。首先,这个命令可以接受多个目录文件参数,不同的参数用空格分隔。请注意,不要使用分号或冒号,只需要使用空格。第二,这个命令中的参数文件是有顺序的。如果目录文件的参数位置错误,很可能删除作业不会成功,甚至会出现一些莫名其妙的结果。对于这一点,笔者会在下面的内容中给出具体的例子。第三,删除目录文件时,用户必须位于目录之外。如果此命令采用多个目录文件名参数,则它应该在这些指定的目录之外。否则,系统会提示用户不能删除这些目录。这很好理解,因为windows操作系统中也有类似的控件。
我最好强调一下,在删除一个目录文件的时候,主要会执行两步,分别是删除自己的目录和更新上级目录中的信息。当一个命令有多个目录文件参数时,这两个步骤也同时完成。而不是先删除所有指定的目录文件,然后更新其上级目录文件中的信息。了解这些内容对真正理解rmdir命令删除多个目录文件会有很大帮助。
3.如果目录文件名放置不当会怎么样?
使用这个rmdir命令时,如果目录文件名参数的位置放错了,会发生什么情况?例如,作者现在以这种格式编写该命令:rmdir compierebook chap01 chap02。执行这个命令后,当我们查看系统目录时,会发现目录文件compierebook并没有被删除。但是,以下两个子目录文件chao01和chap02已被删除。最后,系统会提示用户‘目录不为空,不能删除’。这到底是怎么回事?
在解释这个原因之前,笔者再举一个例子。因为作者现在使用命令rmdir chap01 compierebook chap02。将第一个目录文件参数与第二个目录文件参数位置进行切换。然后执行这个命令,会发生什么?实际上,该命令的执行结果与上面的命令相同。Compierebook目录文件仍然存在,但是它和它的两个子文件已经被删除了。但是最后系统还是会提示‘目录不为空,删除失败’的错误信息。Unix操作系统在改变什么模式?
实际上,我们只需要将这个命令分解成三个命令。例如,命令rmdir compierebook chap01 chap02可以分解为rmdir compierebook、rmdir chap01和rmdir chap02。当执行第一个命令时,第一个命令失败,因为此时它下面的子目录文件没有被删除。然后执行第二个命令。因为目录文件chao01下没有子目录文件,所以可以正常删除。同样,第三个命令也正确执行了。从上面的分析至少可以看出三点。但是,一个目录的删除失败不会影响其他目录的删除。第二,这个命令没有循环运行。即删除第一个目录文件时,如果失败,直接跳过。其他目录删除完成后,我们不会回过头来再次尝试删除上次删除失败的目录文件。因为没有循环操作,所以这个目录文件的参数位置的放置直接影响这个命令的执行结果。第三,如果目录删除成功,不会有错误警告信息。但是,如果目录删除失败,将会发出错误消息。如果两个目录文件没有删除成功,那么系统会提示两条错误信息。并会提示目录文件未成功删除。因此,在执行该命令后,如果有任何错误消息,则有必要仔细检查该错误消息。特别是通过比较错误信息的数量和提供的目录文件参数的数量,可以判断成功删除了多少个目录文件。如果是用脚本程序实现这个功能,可以用cat命令统计错误信息的个数,然后自动与参数个数进行比较,得出成功删除了多少个目录文件的结论。
第四,使用mkdir构建目录树。
了解了删除rmdir目录文件的原理后,就更容易理解mkdir命令构建目录树了。构建目录树就是一次构建多个目录,而且是带子目录的目录。也就是说要一次建立三个目录,computerbook,chap01,chap02。最后两个目录是第一个目录的子目录。现在这三个目录都不存在了。一个一个的运行mkdir命令,最终可以达到既定的效果,但是操作起来明显比较麻烦。如果您想创建更多的目录,您必须执行多个命令。其实根据上面rmdir命令的工作原理,你也可以认为通过在mkdir命令中添加多个参数就可以一次性建立目录树。要实现上述要求,可以使用命令mkdir con computer book chap 01 chap 02。注意,参数的顺序非常重要。如果参数的位置颠倒,命令可能无法成功执行。将不会创建目录文件或只创建部分目录。所以在使用这个命令的时候,需要注意参数的顺序。同时,需要明确的是,在多个参数的情况下,建立每个目录的动作是相对独立的。了解了这一点,使用mkdir命令立即创建一个目录树就容易多了。