这是一篇适合于没有任何基础的初学者学习Cent OS常用命令的博客,努力看看能不能写成一个系列博客。有时,我们需要的只是一道小小的缝隙,让我们有个支点去打开一扇厚重的门。

四、装修房子

如果把Linux的文件夹看成是一间房子的话,那么修改这个房子里房间的结构给房间添加家具就是Linux里对文件夹与文件的创建、移动、删除等操作。

1)给房子隔几间房间(创建目录)

Linux创建目录使用的命令是mkdirmake directory的缩写),例如,要在/home/Bob下创建一个名为test的目录,可以使用:

[Bob@firstlinux ~]$ mkdir/home/Bob/test

如果要一次性创建多个目录,则可以在后面给出这些目录的路径加目录名,例如,要在/home/Bob下创建ab两个目录,命令如下:

[Bob@firstlinux ~]$ mkdir/home/Bob/a /home/Bob/b

注意:两个目录之间要用空格隔开。

如果要在/home/Bob下面创建一个pp目录,同时在pp目录下再创建一个subpp目录,可以添加参数-p,命令如下:

[Bob@firstlinux ~]$ mkdir/home/Bob/pp/subpp -p

上面一条命令的意思就是:当要创建的目录subpp的上一级目录pp不存在时,在命令上添加-p参数,可以在创建subpp的同时创建上一级目录pp

2)给房间添加些家具(文件创建)

要在目录中创建文件可以使用touch命令,touch这个很有意思,是轻触的意思,好像与创建文件有点不搭边:)

如果要在/home/Bob目录下创建一个名为doca.txt的文本文件,可以使用命令:

[Bob@firstlinux ~]$ touch/home/Bob/doca.txt

如果想要同时创建多个文件,则在后面罗列多个文件的路径加文件名,用空格隔开。例如:要在/home/Bob/a目录创建一个mydoc的文件,在/home/Bob/pp目录创建创建一个hello.txt文件,可以使用命令,

[Bob@firstlinux ~]$ touch/home/Bob/a/mydoc /home/Bob/pp/hello.txt

3)拆房间(删除目录)

有建设就有拆除,如果要拆房间(删除目录)就要小心了,要区分房间里有没有家具家具,两者的拆法是不一样的。

删除目录可以使用两种命令:rmdirrm

命令rmdir

a)如果不加参数,只能删除空的目录(不包含子目录或文件),例如:

[Bob@firstlinux ~]$ mkdirone/two/three -p

[Bob@firstlinux ~]$ rmdirone/two/three

第一行,在当前工作目录下创建一个one目录,one目录下创建一处two目录,two目录下创建一个three目录;第二行,则删除three目录。

b)如果不加参数,且要删除的目录包含子目录或文件,则不能删除。例如:

[Bob@firstlinux ~]$ mkdirone/two/three -p

[Bob@firstlinux ~]$ touchone/two/three/file1

[Bob@firstlinux ~]$ rmdirone/two/three

rmdir: 删除 "one/two/three/" 失败: 目录非空

c)如果带参数-p,可以删除空目录,顺带删除上一级的空目录,再上一级的空目录......依次删除到不为空的目录。例如:

[Bob@firstlinux ~]$ mkdira/b/c/d/e -p

[Bob@firstlinux ~]$ toucha/b/in.txt

[Bob@firstlinux ~]$ rmdira/b/c/d/e -p

rmdir: 删除目录 "a/b" 失败: 目录非空

e一直删除到其上一级d、上上一级c,到b删除不了,因为b不为空包含了一个文件。

 从上面的分析来看,使用rmdir进行拆房间效率实在是低,而且rmdir命令也就只能针对目录,如果目录中包含文件就无能为力了。

命令rm:

rm命令不但可以拆房间还能拆家具,或者两者一起打包拆。如果要删除文件可以不要参数,如果要删除目录要添加参数-r-R例如:

[Bob@firstlinux ~]$ mkdir d1d2/subd -p

[Bob@firstlinux ~]$ touchd1/f1 d2/subd/f2

[Bob@firstlinux ~]$ rm d1/f1

[Bob@firstlinux ~]$ rm d1 d2-r

第一行在工作目录下创建d1d2目录,且同时在d2目录下再创建subd目录;

第二行在d1目录下创建文件f1,在d2/subd目录下创建文件f2

第三行删除d1f1文件;

第四行删除d1d2目录;

从上面命令可以看出,删除目录比删除文件要多加一个-r-R的参数,同时删除目录时,可以把目录下面的子目录连文件一起删除。

这也是rm命令比rmdir在删除目录上强大的、效率高的地方。

(4)乾坤大挪移(移动)

如果要把目录或文件挪个窝,在Linux中要使用移动命令mv(move的简写)。例如:

[Bob@firstlinux~]$ mkdir m1/subm1 m2/subm2 -p

[Bob@firstlinux~]$ touch mf.txt

[Bob@firstlinux~]$ mv mf.txt m1/subm1

[Bob@firstlinux~]$ mv m1/subm1/mf.txt m2/subm2/newmf.txt

第三条命令将mf.txt移动到m1/subm1目录中;

第四条命令将m1/subm1目录中的mf.txt移动到m2/subm2/目录中并重新命令newmf.txt

再例如:

[Bob@firstlinux ~]$ mkdir temp

[Bob@firstlinux ~]$ mv m2 temp

[Bob@firstlinux ~]$ mv temp/m2newdir

第二条命令将m2目录含目录中的内容移动到temp目录下。

第三条命令将temp下的m2目录含目录中的内容移动到newdir(在这条命令中同时创建newdir目录)

五、复制――1变多

Linux提供的复制命令是cp(copy)的简写。

例如:

[Bob@firstlinux~]$ mkdir dest/one sou/two -p

[Bob@firstlinux~]$ touch dest/one/dest.txt

[Bob@firstlinux~]$ cp dest/one/dest.txt sou/two

[Bob@firstlinux~]$ cp dest/one new -R

[Bob@firstlinux~]$ cp dest othernew/test -R

cp:无法创建目录"othernew/test": 没有那个文件或目录

[Bob@firstlinux~]$ cp dest/one/dest.txt sou/two/sou.txt

[Bob@firstlinux~]$ cp dest newdest -R

第一条命令在工作目录下创建两个目录dest和sou,同时在dest下创建one目录,在sou下创建two目录;

第二条命令在one目录下创建dest.txt文件;

第三条命令将one目录下的文件dest.txt复制two目录中;

第四条命令将dest/one目录下的所有文件复制到当前工作目录下的一个新目录new下面(new目录在这条命令中自动创建),其中参数-R递归处理复制(即将目录下的所有子目录或文件一并复制);

第五条命令要将dest目录下的内容复制到一个不存在的目录下的目录不成功(即不能通过cp自动创建两层没有的目录,只能是像第四条命令那样只能创建一个目录,无法嵌套);

第六条命令将dest/one/目录下的dest.txt复制到sou/two/目录下并更改名称为sou.txt ;

第七条命令将dest目录包括目录下所有内容复制一份在相同位置并改名为newdest;

通过上面命令的学习,可知-R这个参数在rm与cp命令中都可以使用,其作用是递归处理,除了在rm与cp中使用外,还可在ls命令中使用,也是一样的功能。例如:

[Bob@firstlinux~]$ ls dest -R

dest:

one

dest/one:

dest.txt

注意:ls中使用R是大写的(如果小写表示排序时保留顺序),rm与cp中使用可以不区分大小写。

六、神奇的链接

Linux的链接分为硬链接与符号链接。对于文件而言,两种链接都可以创建,而目录只能创建符号链接。创建链接使用的命令是lnlink)的简写。

1)符号链接

符号链接要多加一个参数-s,但是相对来说比较好理解,它和windows里的快捷方式类似。例如:

[Bob@firstlinux ~]$ mkdirsoudir lndir

[Bob@firstlinux ~]$ touchsoufile

[Bob@firstlinux ~]$ ln -s/home/Bob/soudir lndir/lnsoudir

[Bob@firstlinux ~]$ ln -s/home/Bob/soufile lndir/lnsoufile

第一行命令创建两个目录,一个soudir,另一个是lndirlndir用于存放符号链接;

第二行命令创建一个文件soufile

第三行命令为soudir目录创建一个符号链接,并将符号链接存放在lndir目录中命名为lnsoudir

第四行命令为soufile文件创建一个符号链接,并将符号链接存放在lndir目录中命名为lnsoufile

注意:上面的soudirsoufile都给出了绝对路径,如果只给出相对路径,创建出来的符号链接可能会产生一些异常的结果。

如果创建符号链接时,不给符号链接名称,则默认使用目录或文件的名称。例如:

[Bob@firstlinux ~]$ ln -s/home/Bob/soufile lndir

[Bob@firstlinux ~]$ ln -s/home/Bob/soudir lndir

上面两条命令就在lndir目录中创建两个符号链接,符号链接名称与目录和文件名相同。

2)硬链接

硬链接就比较神奇了,它只对文件有效,神奇的地方在于,它类似于复制又不像复制那样前后两个文件无关,而是存在一定的关联,一个文件改变了另一个文件也会跟着改变。但是,要求硬链接的两个文件必须在同一文件系统中。(软链接可以跨文件系统)

例如:

[Bob@firstlinux ~]$ mkdirhl/subhl -p

[Bob@firstlinux ~]$ touch y1y2.txt

[Bob@firstlinux ~]$ ln y1hl/subhl/hly1

[Bob@firstlinux ~]$ ln y2.txthl/subhl/

第一条命令创建目录hl/subhl,第二条命令创建两个文件y1y2.txt

第三条命令为y1创建硬链接并存放在hl/subhl,且命名为hly1

第四条命令为y2.txt创建硬链接并存放在hl/subh1,硬链接的名称就是文件名。

这时如果修改当前工作目录下的y1y2.txt文件,则hl/subhl与之硬链接的文件也一样变化,反之也一样。

如果删除硬链接中的一个文件,与之链接的文件并不会删除。

硬链接与符号链接的差别就一个参数-s

七、文件或目录的查找

人的记忆是容易忘记的,有些不常用的文件到要用时却找不到...

经常会为了在一大堆目录与文件中为了查找一个文件而抓狂...

Linux强大的find查找命令,可以解决上面的问题,就看怎么使用。

1)简单、小白的查找:给出指定目录,指定文件名的查找。例如:

[Bob@firstlinux ~]$ find /bin-name "cat"

查找/bin目录下的文件名为cat的文件。

这种查找在现实应用极少,如果知道目录、知道文件名,都不用查找了。之所以介绍,是因为可以让初学者对find命令有一个初步了解。

find命令要查找先要给出查找的位置,也就路径(可以是绝对的也可以是相对),后面通常再跟上匹配表达式。上面的命令要查找的目录是/bin,匹配表达式是-name “cat”(表示文件名像cat的文件)。

2)区分大写的查找,例如:

[Bob@firstlinux ~]$ mkdirsearch/d1/subd1 search/d2/subd2 -p

[Bob@firstlinux ~]$ touchsearch/d1/subd1/t.txt search/d2/subd2/T.txt

[Bob@firstlinux ~]$ findsearch -name "t*"

search/d1/subd1/t.txt

[Bob@firstlinux ~]$ findsearch -iname "t*"

search/d2/subd2/T.txt

search/d1/subd1/t.txt

比较第三条与第四条命令,之间差了个字母i。即,在查找时,使用表达式-name-iname分别表示区分大小查找文件名与不区分大小查找文件名。

3)只知扩展名的查找,例如:

[Bob@firstlinux ~]$ findsearch -name "*.txt"

search/d2/subd2/T.txt

search/d1/subd1/t.txt

这条命令中的*代表的是任意字符。

4)与或非的运用

或操作,例如:

[Bob@firstlinux ~]$ touchsearch/a.doc search/d2/b.doc

[Bob@firstlinux ~]$ findsearch -name "*.txt" -o -name "*.doc"

search/d2/subd2/T.txt

search/d2/b.doc

search/d1/subd1/t.txt

search/a.doc

两个表达式之间加上-o表示两个表示式是或的关系。

与操作,例如:

[Bob@firstlinux ~]$ findsearch -name "T*" -name "*.txt"

search/d2/subd2/T.txt

上面的命令这样写有点笨,这里只是要介绍与操作。如果两个表达式之间不加参数或加了参数-a,都表示要同时满足这两个表达式。

上面语句可以写成:find search -name “T*” -a -name “*.txt”(这样写还是有点笨)

最简洁的写法:find search -name “T*.txt”

非操作,例如:

[Bob@firstlinux ~]$ findsearch ! -name "*.txt"

search

search/d2

search/d2/subd2

search/d2/b.doc

search/d1

search/d1/subd1

search/a.doc

非操作就是要在否的条件表达式前加上!。上面的命令,查找出所有最后四个字母不是.txt的文件和目录。

5)把目录与文件区分开

上面最后一个例子,查找会把文件和目录都找出来,如果只要文件,则要添加参数-type,其中-type d表示找目录,-type f表示找文件,-type l表示找符号链接,-type c表示找字符设备,-type b表示找块设备,-type s表示找套接字,-type p表示找Fifo。初学者只要记住dfl三个就够用了。

例如:将上面查找的内容改成查找最后四个字母不是.txt的文件,则

[Bob@firstlinux ~]$ findsearch ! -name "*.txt" -type f

search/d2/b.doc

search/a.doc

6)查找多个目录

[Bob@firstlinux ~]$ findsearch/d1 search/d2 -name "*.txt" -type f

search/d1/subd1/t.txt

search/d2/subd2/T.txt

要查找多个目录,只要把多个目录罗列出来就可以了。上面是查找d1d2目录中文件名最后四个字符为.txt的文件。

7)限定查找的纵深

find可以以给定目录为参照,查找目录下几级的子目录的文件,多了不查找,例如:

[Bob@firstlinux ~]$ find /-maxdepth 1 -name "b*"

/bin

/boot

上面命令查找从根开始下1级的子目录(即根下的子目录,不再找子目录下的子目录)、包含根本身,第一个字符包含b的文件或目录。

再例如:

[Bob@firstlinux ~]$ find /usr-mindepth 2 -name "sand*"

find: “/usr/lib64/audit”: 权限不够

/usr/lib64/libreoffice/share/gallery/www-back/sand.jpg

/usr/lib64/libreoffice/share/gallery/www-back/sand-light.jpg

/usr/lib/python2.6/site-packages/setuptools/sandbox.pyo

/usr/lib/python2.6/site-packages/setuptools/sandbox.py

/usr/lib/python2.6/site-packages/setuptools/sandbox.pyc

/usr/share/selinux/targeted/sandbox.pp.bz2

/usr/share/selinux/devel/include/apps/sandbox.if

/usr/share/media-player-info/sandisk-7432_7433_7434_7435_74c0_74c1_74c2_74c3.mpi

/usr/share/media-player-info/sandisk-sansa_c250.mpi

/usr/share/media-player-info/sandisk-7301_7302.mpi

/usr/share/media-player-info/sandisk-sansa_clip_plus.mpi

/usr/share/media-player-info/sandisk-7401_7421_7431.mpi

/usr/share/gimp/2.0/patterns/sandytext.pat

/usr/share/oprofile/i386/sandybridge

上面命令查找/usr这个目录下最少再向下2级的目录中包含以sand开头的文件或目录。

-mindepth-maxdepth也可以合用,把目录限定在一定层上。例如:

[Bob@firstlinux ~]$ find /usr-mindepth 2 -maxdepth 3 -name "sand*"

find: “/usr/lib64/audit”: 权限不够

/usr/share/media-player-info/sandisk-7432_7433_7434_7435_74c0_74c1_74c2_74c3.mpi

/usr/share/media-player-info/sandisk-sansa_c250.mpi

/usr/share/media-player-info/sandisk-7301_7302.mpi

/usr/share/media-player-info/sandisk-sansa_clip_plus.mpi

/usr/share/media-player-info/sandisk-7401_7421_7431.mpi

上面命令,就是查找usr下面的第2层目录和第三层目录下的以sand开头的文件或目录。

8)限定最近一次访问、修改、变化时间的查找

限定最近一次访问时间,例如:

[Bob@firstlinux ~]$ find /home-type f -amin -10

/home/Bob/.recently-used.xbel

/home/Bob/.config/libreoffice/4/user/backup/趣解CentOS6.5常用命令.odt_0.odt

/home/Bob/.config/libreoffice/4/user/registrymodifications.xcu

上面的命令对/home目录下的文件查找最近一次访问时间少于当前时间10分钟的文件。如果要多于10分钟将-10改为+10,如果要等于10分,将-10改为10。如果不要以天计算,将参数-amin改为-atime,同样多于几天用+号,少于几天用-号,等于几天不加。

如果是限定最近一次修改时间,则将参数改为mmin(分钟)或mtime(天数);如果是限定最近一次变化时间,则将参数改为cmin(分钟)或ctime(天数)。

9)限定文件大小

[Bob@firstlinux ~]$ find /home-type f -size +10M

/home/Bob/workspace/.metadata/.plugins/org.eclipse.jdt.core/2730797328.index

上面的命令,查找/home目录下,大小超过10M的文件。如果少于用-10M,等于用10M

10)找到文件并删除

[Bob@firstlinux ~]$ findsearch -type f -name "*.txt" -delete

上面的命令,查找search目录下文件名最后四个字符为.txt的文件并删除。

上面的命令也可以写成find search -type f -name "*.txt"-exec rm {} \;

其中{}后面接空格再接\;(不能少)。

11)找到文件并复制

[Bob@firstlinux ~]$ mkdir txt

[Bob@firstlinux ~]$ findsearch -type f -name "*.txt" -exec cp {} txt \;

上面第二条命令,查找search目录中的所有最后四个字符为.txt的文件并复制到当前目录下的txt目录中。

注意:txt后面加空格再加\;(不能少)。

11)找到文件或目录并将结果写到一个文件中

[Bob@firstlinux ~]$ find /bin-type f -name "s*" > s.txt

上面的命令,查找/bin目录下文件名开头第一个字母为s的所有文件,并将查找的结果写入到当前目录的文件s.txt(不存在自动创建)。

find命令的功能非常强大,应用非常灵活,初学者掌握上面一些用法基本够用了。

 

(第二篇  待续...