一、细讲目录管理类命令的   1. mkdir  2.rmdir  3. rm   4.PATH   5.mv

1.命令mkdir

通过 mkdir 命令可以实现在指定位置创建以 DirName(指定的文件名)命名的文件夹或目录。要创建文件夹或目录的用户必须对所创建的文件夹的父文件夹具有写权限。并且,所创建的文件夹(目录)不能与其父目录(即父文件夹)中的文件名重名,即同一个目录下不能有同名的(区分大小写)。

-m, --mode=模式,设定权限<模式> (类似 chmod),而不是 rwxrwxrwx 减 umask

-p, --parents 可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录;

-v, --verbose 每次创建新目录都显示信息

mkdir用来创建目录的,‘mkdir’ 其实就是make directory的缩写。其语法为 mkdir [-mp] [目录名称] ,其中-m, -p为其选项, ‘-m’ 这个选项用来指定要创建目录的权限。 ‘-p’ 这个选项很管用,先来做个试验,你会一目了然的:

[root@localhost ~]# mkdir /tmp/test/123

mkdir: 无法创建目录 '/tmp/test/123': 没有那个文件或目录

[root@localhost ~]# mkdir -p /tmp/test/123

[root@localhost ~]# ls /tmp/test

123

当我们想创建 /tmp/test/123 目录,可是提示不能创建,原因是 /tmp/test 目录不存在,不过可以通过 ‘-p’ 选项,这个选项可以帮我们创建一大串级联目录,这个选项还有一个好处,那就是当你创建一个已经存在的目录时,不会报错:

[root@localhost ~]# ls -ld /tmp/test/123

drwxr-xr-x. 2 root root 4096 8月   9 19:10 /tmp/test/123

[root@localhost ~]# mkdir /tmp/test/123

mkdir: 无法创建目录 '/tmp/test/123': 文件已存在

[root@localhost ~]# mkdir -p /tmp/test/123

[root@localhost ~]# ls -ld /tmp/test/123

drwxr-xr-x. 2 root root 4096 8月   9 19:10 /tmp/test/1

  ls命令:‘-d’ 选项,这个选项是针对目录的,通常都是和 ‘-l’ 同时使用写成 ‘-ld’. 它可以查看指定目录的属性,比如在本例中,它可以查看 ‘/tmp/test/123’ 目录的创建时间。 mkdir -p 后面跟一个已经存在的目录名时,它不会做任何事情,只是不报错而已。


2.rmdir命令

用来删除空目录,后面可以是一个也可以是多少,多个的话用空格分隔。该命令阿铭很少使用,因为它只能删除目录,不能删除文件,还有一个命令 rm 既可以删除目录又可以删除文件,阿铭用的比较多。rmdir 有一个和mkdir一样的选项 ‘-p’, 同样可以级联删除一大串目录,但是级联的目录中其中一个目录里还有目录或者文件时就不好用了。

[root@localhost ~]# ls /tmp/test

123

[root@localhost ~]# rmdir /tmp/test/

rmdir: 删除 '/tmp/test/' 失败: 目录非空

[root@localhost ~]# rmdir /tmp/test/123

[root@localhost ~]# ls /tmp/test

[root@localhost ~]#

所以,得出的结论是,‘rmdir’只能删除空目录,即使加上‘-p’ 选项也只能删除一串的空目录,可见这个命令有很大的局限性,偶尔用下还可以。


3.命令:rm

这个命令是最常用的, ‘rm’ 同样也有很多选项。你可以通过 man rm 来获得详细帮助信息。

‘-r’ : 删除目录用的选项,等同于rmdir.

[root@localhost ~]# mkdir -p /tmp/test/123

[root@localhost ~]# rm -r /tmp/test/123

rm:是否删除目录 '/tmp/test/123'? y

但是和rmdir不同的是,使用 rm -r 删除目录时,会问一下是否删除,如果输入 ‘y’ 则会删除,输入 ‘n’ 则不删除。当然 rm -r 也不会向rmdir不能删除非空目录,它是可以删除非空目录的。

‘-f’ : 表示强制删除,不再提示是否要删除,而是直接就删除了,而后面跟一个不存在的文件或者目录时,也不会报错,如果不加 ‘-f’ 选项会报错。

[root@localhost ~]# rm /tmp/test/123/123

rm: 无法删除 '/tmp/test/123/123': 没有那个文件或目录

[root@localhost ~]# rm -f /tmp/test/123/123

要删除一个目录时,即使加上 ‘-f’ 选项也会报错,所以删除目录一定要加 ‘-r’ 选项。


[root@localhost ~]# rm -f /tmp/test/123

rm: 无法删除 '/tmp/test/123': 是一个目录

[root@localhost ~]# rm -rf /tmp/test/123

关于rm,使用最多便是 ‘-rf’ 两个选项合用了。不管删除文件还是目录都可以。但是方便的同时也要多注意,万一你的手太快后边跟了/那样就会把你的系统文件全部删除的,切记切记。


4.环境变量PATH

在讲环境变量之前阿铭先介绍一个命令 which, 它用来查找某个命令的绝对路径。

[root@localhost ~]# which rmdir

/bin/rmdir

[root@localhost ~]# which rm

alias rm='rm -i'

        /bin/rm

[root@localhost ~]# which ls

alias ls='ls --color=auto'

        /bin/ls

‘rm’ 和 ‘ls’ 是两个特殊的命令,使用 alias 命令做了别名。我们用的 ‘rm’ 实际上是 ‘rm -i’ 加上 ‘-i’ 选项后,删除文件或者命令时都会问一下是否确定要删除,这样做比较安全。 ‘alias’ 可以设置命令的别名也可以设置文件的别名。 ‘which’ 这个命令平时只用来查询某个命令的绝对路径,不常使用。

上边提到了alias,也提到了绝对路径的/bin/rm ,然后你意识到没有,为什么我们输入很多命令时是直接打出了命令,而没有去使用这些命令的绝对路径?这是因为环境变量PATH在起作用了。请输入 echo $PATH,这里的echo其实就是打印的意思,而PATH前面的$表示后面接的是变量

[root@localhost ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin

因为/bin 在PATH的设定中,所以自然就可以找到ls了。如果你将 ls 移动到 /root 底下的话,然后你自己本身也在 /root 底下,但是当你执行 ls 的时候,他就是不理你?怎么办?这是因为 PATH 没有 /root 这个目录,而你又将 ls 移动到 /root 底下了,自然系统就找不到可执行文件了,因此就会告诉你 ‘command not found!’

[root@localhost ~]# mv /bin/ls /root/

[root@localhost ~]# ls

-bash: /bin/ls: 没有那个文件或目录

‘mv’ 用来移动目录或者文件,还可以重命名.

那么该怎么克服这种问题呢?有两个方法,一种方法是直接将 /root 的路径加入 $PATH 当中!如何增加?可以使用命令 PATH=$PATH:/root:

[root@localhost ~]# PATH=$PATH:/root

[root@localhost ~]# echo $PATH

/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/root

[root@localhost ~]# ls

anaconda-ks.cfg  install.log  install.log.syslog  ls

另一种方法就是使用绝对路径:

[root@localhost ~]# /root/ls

anaconda-ks.cfg  install.log  install.log.syslog  ls


5.命令: cp

copy的简写,即拷贝。格式为 cp  [选项]  [ 来源文件 ] [目的文件] ,例如我想把test1 拷贝成test2 ,这样即可 cp test1 test2,以下介绍几个常用的选项:

-r : 如果你要拷贝一个目录,必须要加-r选项,否则你是拷贝不了目录的, 和 ‘rm’ 类似。

[root@localhost ~]# mkdir 123

[root@localhost ~]# cp 123 456

cp: 略过目录'123'

[root@localhost ~]# cp -r 123 456

[root@localhost ~]# ls -l

总用量 44

drwxr-xr-x. 2 root root  4096 8月  10 04:05 123

drwxr-xr-x. 2 root root  4096 8月  10 04:05 456

-i : 安全选项,和 ‘rm’ 类似,如果遇到一个存在的文件,会问是否覆盖。在Redhat/CentOS系统中,我们使用的cp其实是cp -i


[root@localhost ~]# which cp

alias cp='cp -i'

        /bin/cp

下面简单做一个小试验,很快你就会明白-i 选项的作用了。

[root@localhost ~]# cd 123

[root@localhost 123]# ls

[root@localhost 123]# touch 111

[root@localhost 123]# touch 222

[root@localhost 123]# cp -i 111 222

cp:是否覆盖 '222'? n

[root@localhost 123]# echo 'abc' > 111

[root@localhost 123]# echo 'def' > 222

[root@localhost 123]# cat 111 222

abc

def

[root@localhost 123]# /bin/cp 111 222

[root@localhost 123]# cat 111

abc

[root@localhost 123]# cat 222

abc

例子中的 ‘touch’ 看字面意思就是 ‘摸一下’,如果有这个文件,则会改变文件的访问时间,如果没有这个文件就会创建这个文件。前面说过 ‘echo’ 用来打印,在这里所echo的内容 ‘abc’ 和 ‘def’ 并没有显示在屏幕上,而是分别写进了文件 111和222, 其写入作用的就是这个大于号 ‘>’ 在linux中这叫做重定向,即把前面产生的输出写入到后面的文件中。而 ‘cat’ 命令则是读一个文件,并把读出的内容打印到当前屏幕上。


6.命令: mv

‘mv’ 是move的简写。格式为 mv  [ 选项 ] [源文件] [目标文件] 下面介绍几个常用的选项。

-i : 和cp的-i 一样,当目标文件存在时会问用户是否要覆盖。在Redhat/CentOS系统中,我们使用的mv其实是mv -i

该命令有几种情况:

1) 目标文件是目录,而且目标文件不存在;

2) 目标文件是目录,而且目标文件存在;

3) 目标文件不是目录不存在;

4) 目标文件不是目录存在;

目标文件是目录,存在和不存在,移动的结果是不一样的,如果存在,则会把源文件移动到目标文件目录中。否则,就直接移动了,相当于重命名。这样说也许你会觉得有点不好理解,看例子吧。

[root@localhost ~]# mkdir dira dirb

[root@localhost ~]# ls

anaconda-ks.cfg  dira  dirb  install.log  install.log.syslog

[root@localhost ~]# mv dira dirc

[root@localhost ~]# ls

anaconda-ks.cfg  dirb  dirc  install.log  install.log.syslog

目标文件为目录,并且目标目录不存在,相当于把 ‘dira’ 重命名为 ‘dirc’.

[root@localhost ~]# mv dirc dirb

[root@localhost ~]# ls

anaconda-ks.cfg  dirb  install.log  install.log.syslog

[root@localhost ~]# ls dirb

dirc

目标文件为目录,且目标目录存在,则会把 ‘dirc’ 移动到 ‘dirb’ 目录里。

[root@localhost ~]# touch filed

[root@localhost ~]# ls

anaconda-ks.cfg  dirb  filed  install.log  install.log.syslog

[root@localhost ~]# mv filed filee

[root@localhost ~]# ls

anaconda-ks.cfg  dirb  filee  install.log  install.log.syslog

[root@localhost ~]# mv filee dirb

[root@localhost ~]# ls

anaconda-ks.cfg  dirb  install.log  install.log.syslog

[root@localhost ~]# ls dirb

dirc  filee

目标文件不是目录,且不存在,则会重命名文件。






二、命令展开: 1.  创建/tmp/x/y1, /tmp/x/y2, /tmp/x/y1/b, /tmp/x/y2/a, /tmp/x/y2/b


解析图:

         a

         |

        y1--b                /tmp/x/{y1/{a,b},y2/{a,b}} 

       /                                              

tmp---x                                           

       \y2--a

         |

         b



2.创建/tmp/bin,/tmp/sbin, /tmp/usr, /tmp/usr/bin, /tmp/usr/sbin   


解析图:

           bin

          /

tmp----usr

     |   \

     |   sbin         tmp/{usr/{bin,sbin},bin,sbin}

     | 

    bin 

     |

    sbin