
2.3.3 文件操作
Linux中一切皆文件,涉及文件的操作非常多,一一学习不现实也没有必要。本节将列出实际使用最为频繁的文件操作,帮助读者快速入门文件操作。
1.Linux文件操作高频命令
(1)改变当前目录——cd (★★★★★)
如果要评选Linux下使用最为频繁的命令,那么cd绝对是位列其中的,cd是Change Directory的缩写,它可以将当前目录切换到指定目录。cd正常使用的方式是cd Path,cd和Path之间有空格,Path可以是绝对路径,也可以是相对路径,示例如下。

如果命令执行成功的话,会将当前目录切换到Path,如下所示,登录提示符中当前目录由~变成了tmp。

也可以执行pwd命令,打印当前路径进行验证。

使用cd~,可以切换到当前用户的home目录,如下所示。

如果cd后面什么参数都不加,默认返回当前用户的home目录。
使用cd -,可以退回到cd切换之前的目录,如下所示,cd切换之前的目录是 /tmp,后来使用cd~切换到了当前用户的home目录,再使用cd-,会切换回/tmp。注意,如果再次运行cd-,又会切换回home目录,并不会一路后退。

使用cd ..,可以切换到当前目录的父目录,如下所示,当前目录是 /home/user,使用cd ..后,退回到父目录,即 /home。

(2)列出文件信息——ls (★★★★★)
命令ls是list的缩写,它可以列出指定路径下目录和文件的信息。ls和cd一样,也是Linux下使用最为频繁的命令之一。ls的使用方法如下。

其中[OPTION]是选项,这是一个可选项,可以加也可以不加,常用的OPTION有-l、-a等,[FILE]是路径,也是可选项,示例如下。
1)示例1:列出/etc/profile的详细文件信息。
示例命令如下,-l表示列出详细信息。

文件详细信息的说明如图2-24所示。

图2-24 文件信息图
2)示例2:列出/etc目录下的所有文件。
示例命令如下,其中-a表示列出所有文件,包括隐藏文件,如果不加-a,ls只列出了a和f两个文件,加上-a后,除了a和f外,还有很多以“.”开头的文件,如.bash_history、.bash_profile等,这些都是Linux下的隐藏文件,使用-a选项就可以把它们都显示出来。此外,每个目录下都有两个特殊的目录:第一个是当前目录,用一个点(.)表示;第二个是父目录,用两个点(..)表示。

3)示例3:使用通配符列出指定的文件。
示例命令如下,* 可以匹配任意长度的字符串,例如a* 就表示所有以a开头的字符串,使用ls/etc/a*可以列出/etc下所有a开头的文件(包括目录),如下所示。

?可以匹配一个字符,且该字符不能为空,如下所示,ls /dev/tty?可以列出/dev下所有开头为tty,且后面还有1个字符的文件。

4)示例4:文件分类。
使用 -F选项对文件分类,-F选项会在相同类型的文件名后面加上相同的扩展名,例如可执行文件的扩展名是 *,管道文件的扩展名是 |,链接文件的扩展名是 @ 等。
使用 -F选项,列出/bin下所有文件,如下所示,所有可执行文件名后加了 * 扩展名,链接文件后面加了 @ 扩展名。

利用管道 |,将ls的输出作为grep命令的输入,过滤所有扩展名为 * 的文件,命令如下,可以得到 /bin/ 下所有的可执行文件。

(3)打印当前目录——pwd (★★★★☆)
命令pwd是Print Work Dierctory的缩写,它可以打印当前目录,命令如下。

(4)复制文件——cp (★★★★★)
使用cp可以复制文件/目录,cp命令的使用方式如下。

其中[OPTION]是可选项,用来指定cp的选项,SOURCE用来指定cp的源路径,它可以是一个文件路径,也可以是目录路径,DEST是目的路径,使用示例如下。
1)示例1:复制文件到指定目录。
将/etc/profile文件复制到/tmp,复制后的文件名字不变,命令如下,使用ls可以验证复制操作是否成功。

2)示例2:复制文件并重命名。
复制/etc/profile到/tmp,并重命名为profile1,命令如下,使用ls可以验证复制操作是否成功。

3)示例3:复制目录。
复制/home/user目录到/tmp,复制后的目录保留原有名字user,命令如下。

4)示例4:复制目录并重命名。
复制/home/user目录到/tmp,复制后的目录名为user1,命令如下。

(5)删除/移动文件——rm/mv (★★★★☆)
使用rm删除文件/目录,示例如下。
1)示例1:删除文件。
删除/tmp/profile,命令如下,如果命令执行后,没有任何提示,则说明执行成功。

2)示例2:删除目录。
删除目录/tmp/user,命令如下,如果命令执行后,没有任何提示,则说明执行成功。-r选项表示删除目录,-f选项不给出提示,直接强制删除。

使用mv移动文件/目录,或者重命名,使用示例如下。
3)示例3:文件重命名。
将/tmp/profile1重命名为/tmp/profile,命令如下。

(6)创建文件
创建文件有两种方法:使用touch创建一个空文件;使用echo将内容重定向到文件中,以此来创建一个文件,使用示例如下。
1)示例1:创建空文件。
使用touch创建空文件,并使用ls验证,命令如下。


2)示例2:创建指定内容文件。
使用echo将内容123输出到文件c中,以此创建新文件c,命令如下。

如上所示,echo将字符串123输出到stdout,>是重定向符号,它表示将echo的stdout的内容输出到文件c中,而不是打印在屏幕上。因此,上面的命令会生成新文件c,内容是123。使用cat命令输出c的内容,进行验证,如下所示。

(7)创建目录
使用mkdir来创建目录,示例如下。
1)示例1:创建普通目录。
在当前目录下创建名字为mydir的目录,命令如下。

使用ls查看当前目录,进行验证,可以看到mydir已经创建。

2)示例2:创建多级目录。
创建多级目录,使用-p选项在当前目录下创建两级目录mydir/newdir。
首先删除mydir,命令如下。

使用-p选项创建mydir/newdir,命令如下。

使用ls查看当前目录,进行验证,可以看到mydir/newdir已经创建。

(8)修改文件权限——chmod (★★★★★)
使用chmod来修改文件/目录的权限,修改方法有两种:字母法和数字法,使用示例如下。
1)示例1:使用字母法修改文件权限。
使用字母法去除 /home/user/c文件Owner的read权限,操作如下。
首先查看文件c的权限,命令如下,可以看到Owner的权限位是rw-,Group的权限位是rw-,Other的权限位是r--。

接下来使用字母法去除Owner的read权限,命令如下,其中u表示user,- 表示去除,r表示read,c是文件路径,因为c就在当前目录下,因此直接用文件名,不用加路径。

如果增加Owner的read权限,将-修改成+即可,其余都不需要改变;如果修改Group的权限,将u修改成g即可;如果修改Other的权限,将u修改成o即可。
如果同时修改Owner和Group的权限,将u修改成ug即可,其他依此类推。
如果同时修改3者的权限,将u去掉,不指定用户即可。
如果修改write权限,将r修改成w即可。
如果修改execute权限,将r修改成e即可。
如下所示,文件c的Owner(user)的read权限去掉后,在user用户下用cat命令打印文件c的内容,就会提示Permission denied。

2)示例2:使用数字法修改文件权限。
使用数字法增加 /home/user/c文件Owner的read权限。一个文件有3组权限位,分别对应Owner、Group和Other用户的权限。每组权限又有3个权限位,分别是read、write和execute。数字0和1表示每一个权限位上的状态,如果有这个权限,就用1表示,如果没有这个权限,就用0表示,因此,每组权限用3个二进制的位来表示,这3个二进制的位又可以换算成1个8进制的数,因此,3组权限位最终对应3个8进制的数字。
例如,/home/user/c的权限位信息如下。

转换成二进制表示,则为010 110 100,再转换成8进制数字,则对应264。如果要修改c的权限,则将修改后的权限计算成8进制数字,然后用chmod命令进行修改即可。例如要恢复c的Owner的read权限,那么它的权限位就是:rw-rw-r--,对应二进制表示:110 110 100,8进制数字是664,使用chmod修改权限命令如下。

使用ls查看c的权限位进行验证,如下所示,c的Owner的read权限已经恢复。

(9)修改文件拥有者——chown (★★★★★)
使用chown可以修改文件/目录的Owner和Group信息,示例如下,
1)复制 /etc/profile到 /home/user,命令如下,注意 /etc/profile后面有空格,空格后面有一个点(.),表示当前目录。

2)查看profile的Owner和Group信息,命令如下,可以看到profile的Owner和Group都是user。

3)切换到root用户,命令如下。

4)然后使用chown修改profile的Owner和Group为root,命令如下,root:root中第一个root表示Owner,第二个root为Group,如果要修改成其他的Owner或者Group,修改对应位置的名字即可。

5)使用ls查看profile的Owner和Group进行验证,可以看到profile的Owner和Group都已经修改成了root。

如果修改一个目录下所有文件和子目录的Owner和Group,加上-R选项即可,例如chown -R root:root mydir/。
(10)统计目录总大小——du (★★★★★)
du命令可以统计指定目录下所有文件总的占用空间大小,例如统计 /etc/yum.repos.d目录下所有文件总的占用空间大小,如下所示,总的大小为48K,其中 -s选项用来统计总的占用空间大小,-h表示使用可读的形式显示大小,如2K、5M或8G等。

(11)比较文件/目录——diff (★★★★★)
diff命令可以比较两个文件是否相同,例如比较 /etc/profile和当前目录下的profile1文件是否相同,命令如下。
首先,复制 /etc/profile到当前目录,重命名为profile1,并追加内容123。

使用diff来比较 /etc/profile和当前目录下的profile1,命令如下,如果没有任何输出,则说明两个文件完全相同,如果有输出,则说明两个文件不同,输出的部分就是两者不同的部分,如下所示:86表示profile1的第86行,d85表示/etc/profile的第85行,<后面的内容表示从profile1的第86行起始的内容,也就是和/etc/profile不同的部分。

如果要比较两个目录下文件是否相同,可以加上-r选项。