![Linux快速入门与实战:基础知识、容器与容器编排、大数据系统运维](https://wfqqreader-1252317822.image.myqcloud.com/cover/769/43806769/b_43806769.jpg)
2.3.3 文件操作
Linux中一切皆文件,涉及文件的操作非常多,一一学习不现实也没有必要。本节将列出实际使用最为频繁的文件操作,帮助读者快速入门文件操作。
1.Linux文件操作高频命令
(1)改变当前目录——cd (★★★★★)
如果要评选Linux下使用最为频繁的命令,那么cd绝对是位列其中的,cd是Change Directory的缩写,它可以将当前目录切换到指定目录。cd正常使用的方式是cd Path,cd和Path之间有空格,Path可以是绝对路径,也可以是相对路径,示例如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_04.jpg?sign=1739298920-OMDqhinbRbKFpqx224RhDV6PZ4wJaH1R-0-30b5fb093d7155f8a9ab2a19652a33a9)
如果命令执行成功的话,会将当前目录切换到Path,如下所示,登录提示符中当前目录由~变成了tmp。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_05.jpg?sign=1739298920-hyDZ5RLRQkCCYDkhAblpzU78Un0zfi8A-0-5b695a39e538d5a333f364ae6569a7ad)
也可以执行pwd命令,打印当前路径进行验证。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_06.jpg?sign=1739298920-u50VWAnk3hDQmmDFVE4NEU2mix05tFyX-0-f22c2252d28feafe93d35b7a55129c40)
使用cd~,可以切换到当前用户的home目录,如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_01.jpg?sign=1739298920-llRCW7YjovK59o1RcqNySCXZGtdbgcK4-0-d3aea8816146a74fc03991ac069c4f14)
如果cd后面什么参数都不加,默认返回当前用户的home目录。
使用cd -,可以退回到cd切换之前的目录,如下所示,cd切换之前的目录是 /tmp,后来使用cd~切换到了当前用户的home目录,再使用cd-,会切换回/tmp。注意,如果再次运行cd-,又会切换回home目录,并不会一路后退。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_02.jpg?sign=1739298920-poIX1jX2zy8mjAZJnJnSLrqcuPppTzXe-0-f33f47b40feba83fce31288251ebd45d)
使用cd ..,可以切换到当前目录的父目录,如下所示,当前目录是 /home/user,使用cd ..后,退回到父目录,即 /home。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_03.jpg?sign=1739298920-YHI6BjivlD7v9eLDUI1apBPMlG1AGhOs-0-5a795963e52cbac662f3723670de93ed)
(2)列出文件信息——ls (★★★★★)
命令ls是list的缩写,它可以列出指定路径下目录和文件的信息。ls和cd一样,也是Linux下使用最为频繁的命令之一。ls的使用方法如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_04.jpg?sign=1739298920-E2LwTrU4c6PJf3r0VfqvZ92zc3OODStL-0-72a04e5f14cdc8633a580cb386be48b1)
其中[OPTION]是选项,这是一个可选项,可以加也可以不加,常用的OPTION有-l、-a等,[FILE]是路径,也是可选项,示例如下。
1)示例1:列出/etc/profile的详细文件信息。
示例命令如下,-l表示列出详细信息。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_05.jpg?sign=1739298920-xI8IN9HzjWGI7wJnLTt4lEk8XDWr92DV-0-1ab7b21e24b4939f772eeaaec0f3c7a7)
文件详细信息的说明如图2-24所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_06.jpg?sign=1739298920-dhFFNPqyQjJWl8HKrfkchw8oi7XmYi2w-0-d53fc99d1d3acc5727318c9844798467)
图2-24 文件信息图
2)示例2:列出/etc目录下的所有文件。
示例命令如下,其中-a表示列出所有文件,包括隐藏文件,如果不加-a,ls只列出了a和f两个文件,加上-a后,除了a和f外,还有很多以“.”开头的文件,如.bash_history、.bash_profile等,这些都是Linux下的隐藏文件,使用-a选项就可以把它们都显示出来。此外,每个目录下都有两个特殊的目录:第一个是当前目录,用一个点(.)表示;第二个是父目录,用两个点(..)表示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_01.jpg?sign=1739298920-qMKEYMBaWuZli5IQzKzVS8W9mKHumZUt-0-10577218baeba24b97d03f608b83fe6c)
3)示例3:使用通配符列出指定的文件。
示例命令如下,* 可以匹配任意长度的字符串,例如a* 就表示所有以a开头的字符串,使用ls/etc/a*可以列出/etc下所有a开头的文件(包括目录),如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_02.jpg?sign=1739298920-jkUj1yJJNFrjQWCyu0danJhVBFQfIV5Q-0-cae9c020ca69cb4368394120c90cc187)
?可以匹配一个字符,且该字符不能为空,如下所示,ls /dev/tty?可以列出/dev下所有开头为tty,且后面还有1个字符的文件。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_03.jpg?sign=1739298920-Dntmqe0Ir0VeHhfIYal1Msb60aL43toY-0-87d845600d806b43f25b448599756693)
4)示例4:文件分类。
使用 -F选项对文件分类,-F选项会在相同类型的文件名后面加上相同的扩展名,例如可执行文件的扩展名是 *,管道文件的扩展名是 |,链接文件的扩展名是 @ 等。
使用 -F选项,列出/bin下所有文件,如下所示,所有可执行文件名后加了 * 扩展名,链接文件后面加了 @ 扩展名。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_04.jpg?sign=1739298920-X20pBfQcQIU7oWnK9zFq4Do46Aq7qkFC-0-2860a0a900a5e074ebdcfa047d5c486e)
利用管道 |,将ls的输出作为grep命令的输入,过滤所有扩展名为 * 的文件,命令如下,可以得到 /bin/ 下所有的可执行文件。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_05.jpg?sign=1739298920-oXg2t0fccH978D4JvHu9ejQMP7qytuVP-0-4a45aa3dbfbac55cddba58bf49c37e34)
(3)打印当前目录——pwd (★★★★☆)
命令pwd是Print Work Dierctory的缩写,它可以打印当前目录,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_06.jpg?sign=1739298920-gwA9UgF8YUjBZSLrMLQAyoahXe2nsDQw-0-99e2de4d08d21d73d2d6b6168a4db7c1)
(4)复制文件——cp (★★★★★)
使用cp可以复制文件/目录,cp命令的使用方式如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_07.jpg?sign=1739298920-UtxgONNNKVZoxubE2Itw80LdDsoULfaM-0-053473f30e3721fccd4a3d60dfc2eb40)
其中[OPTION]是可选项,用来指定cp的选项,SOURCE用来指定cp的源路径,它可以是一个文件路径,也可以是目录路径,DEST是目的路径,使用示例如下。
1)示例1:复制文件到指定目录。
将/etc/profile文件复制到/tmp,复制后的文件名字不变,命令如下,使用ls可以验证复制操作是否成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_01.jpg?sign=1739298920-rHAtopOrqeib35LrMwdLyJtsCkz88eEA-0-954126c30c4f586a57833d05e49b3a4a)
2)示例2:复制文件并重命名。
复制/etc/profile到/tmp,并重命名为profile1,命令如下,使用ls可以验证复制操作是否成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_02.jpg?sign=1739298920-X44UttPe3ZiUoKDaQZWqLTHKDYvNbdfD-0-c557080af32310b4ea9bf2d5d86ba6b8)
3)示例3:复制目录。
复制/home/user目录到/tmp,复制后的目录保留原有名字user,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_03.jpg?sign=1739298920-r99bNpA7CyMRsdoc210c1NTn7kSsSWZu-0-a95569b2ef6cd4c3c679df0c7e3be873)
4)示例4:复制目录并重命名。
复制/home/user目录到/tmp,复制后的目录名为user1,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_04.jpg?sign=1739298920-DQARqDGwqdNXPynBoZFmblrWJ62uaf5X-0-75cb75c6f720a89587172401fffa16d0)
(5)删除/移动文件——rm/mv (★★★★☆)
使用rm删除文件/目录,示例如下。
1)示例1:删除文件。
删除/tmp/profile,命令如下,如果命令执行后,没有任何提示,则说明执行成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_05.jpg?sign=1739298920-Qo3KKWIMh6kPoetU9GorRuzV82cPVfSb-0-39ef1183cdb4851d7ce963fa4724a7c5)
2)示例2:删除目录。
删除目录/tmp/user,命令如下,如果命令执行后,没有任何提示,则说明执行成功。-r选项表示删除目录,-f选项不给出提示,直接强制删除。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_06.jpg?sign=1739298920-49AgqQaNBDwtNB0pyf7aTkRkUxrLTPES-0-a4a06b6683df50cf19ac885679e257d8)
使用mv移动文件/目录,或者重命名,使用示例如下。
3)示例3:文件重命名。
将/tmp/profile1重命名为/tmp/profile,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_07.jpg?sign=1739298920-TljfMS5gsrtXecIFRwSa1jG9vy4dswDd-0-45da45caf064a3bf3569989a2bcb4eca)
(6)创建文件
创建文件有两种方法:使用touch创建一个空文件;使用echo将内容重定向到文件中,以此来创建一个文件,使用示例如下。
1)示例1:创建空文件。
使用touch创建空文件,并使用ls验证,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_08.jpg?sign=1739298920-M1ZUxbe4epoa6xdSy9mBpXU9fzkKPvHv-0-e9d70a25ebea411b6285daa02484d713)
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_01.jpg?sign=1739298920-cV8Th9ozelKS7MbZ6UVpqbvx2znyWfgI-0-334a94015d45a2a675cca2447c85c4fe)
2)示例2:创建指定内容文件。
使用echo将内容123输出到文件c中,以此创建新文件c,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_02.jpg?sign=1739298920-nOEBBfmZKzhY8ZrvG9r3xQzdaaUsCJ4K-0-74ed69b780e781bac46b90f65ab514cc)
如上所示,echo将字符串123输出到stdout,>是重定向符号,它表示将echo的stdout的内容输出到文件c中,而不是打印在屏幕上。因此,上面的命令会生成新文件c,内容是123。使用cat命令输出c的内容,进行验证,如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_03.jpg?sign=1739298920-hhXu8vLVF1dMda7dqdZxLFCuAF9jkRyO-0-30e248b9f415dcc899d395c04aaf3ed9)
(7)创建目录
使用mkdir来创建目录,示例如下。
1)示例1:创建普通目录。
在当前目录下创建名字为mydir的目录,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_04.jpg?sign=1739298920-oFffigAodZcqjuELZbwwCnjmJbAt29EL-0-b22023a6ea00a3d29e224f8b5231cb1a)
使用ls查看当前目录,进行验证,可以看到mydir已经创建。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_05.jpg?sign=1739298920-qNfxjfTNe6BOjXPXcIjFjM8icZVVuUuT-0-dea1570d6a6cc52676921d844e06dd14)
2)示例2:创建多级目录。
创建多级目录,使用-p选项在当前目录下创建两级目录mydir/newdir。
首先删除mydir,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_06.jpg?sign=1739298920-Y5s4mxsOIwgApTt5xyzR3FOlxlK04eHm-0-00d4eb01711bd768416a675cac5587ba)
使用-p选项创建mydir/newdir,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_07.jpg?sign=1739298920-D2BtCiqzIAXmc5D11UFM4kkth3OrVXqN-0-5bea10b9200ca42995bc397a24a90b75)
使用ls查看当前目录,进行验证,可以看到mydir/newdir已经创建。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_08.jpg?sign=1739298920-y8gQmT4Vm4gSOtGuzYr13lSUhK9QBrRM-0-534f74248eca9eea4503e953e85fdeca)
(8)修改文件权限——chmod (★★★★★)
使用chmod来修改文件/目录的权限,修改方法有两种:字母法和数字法,使用示例如下。
1)示例1:使用字母法修改文件权限。
使用字母法去除 /home/user/c文件Owner的read权限,操作如下。
首先查看文件c的权限,命令如下,可以看到Owner的权限位是rw-,Group的权限位是rw-,Other的权限位是r--。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_09.jpg?sign=1739298920-ajY22pRj8YIuFq8kZ3PnDx1zZEh9rg0S-0-57f95b18a9385d5b1b6d730cdcf1a9dd)
接下来使用字母法去除Owner的read权限,命令如下,其中u表示user,- 表示去除,r表示read,c是文件路径,因为c就在当前目录下,因此直接用文件名,不用加路径。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_01.jpg?sign=1739298920-7Mp8uP8gKW2jMIc9VN6jImqUN1Q1338v-0-70ddc8612f2383083d4bd574a060bc9d)
如果增加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。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_02.jpg?sign=1739298920-uK1SBncRo5Xee1JQnm6c7l6dGtz7phEL-0-b43a7696b77f250faf4537ffacfdd2ce)
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的权限位信息如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_03.jpg?sign=1739298920-GtlnUkR6MfQNLrDpAmBdld4bVaBuGAZq-0-5c6e6130a4105c95139136785fe31f82)
转换成二进制表示,则为010 110 100,再转换成8进制数字,则对应264。如果要修改c的权限,则将修改后的权限计算成8进制数字,然后用chmod命令进行修改即可。例如要恢复c的Owner的read权限,那么它的权限位就是:rw-rw-r--,对应二进制表示:110 110 100,8进制数字是664,使用chmod修改权限命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_04.jpg?sign=1739298920-BDXioMssu31mzF9UHNDAsAUDjeYlbGdj-0-7ff4c6f75a3f64305b8d02a766f4b69f)
使用ls查看c的权限位进行验证,如下所示,c的Owner的read权限已经恢复。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_05.jpg?sign=1739298920-VgPQSinZTwUpVkl1Yf0T7Fbll1GcRLwB-0-0ee4541d520e09fdf7c75344714682cc)
(9)修改文件拥有者——chown (★★★★★)
使用chown可以修改文件/目录的Owner和Group信息,示例如下,
1)复制 /etc/profile到 /home/user,命令如下,注意 /etc/profile后面有空格,空格后面有一个点(.),表示当前目录。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_06.jpg?sign=1739298920-wE69fHFUvy9aMJwNC1RU1w6KJYpwsBtS-0-73bc947062b4643f36437d2246d6a300)
2)查看profile的Owner和Group信息,命令如下,可以看到profile的Owner和Group都是user。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_07.jpg?sign=1739298920-OBwH6GwRP9JiCYkB1FLaUH8RMDo59F3p-0-22b6f94cd12a83740c8122d1cebe6173)
3)切换到root用户,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_01.jpg?sign=1739298920-LT4FFOESqbuUqJVqNWba6R0E6kDdMKjG-0-618c0529ea78092ede2c5b61ff40d800)
4)然后使用chown修改profile的Owner和Group为root,命令如下,root:root中第一个root表示Owner,第二个root为Group,如果要修改成其他的Owner或者Group,修改对应位置的名字即可。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_02.jpg?sign=1739298920-Pmh6UEUbyirnICxqjhpXLjEVVecAQHJU-0-a70b6ce2f0b38e7edfa370ddaf5b85bb)
5)使用ls查看profile的Owner和Group进行验证,可以看到profile的Owner和Group都已经修改成了root。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_03.jpg?sign=1739298920-TaAKgALY0P4z3p6jRrKhpx3FunWQ1wiu-0-c1a5dcd92c54a73ee9cbdb141aee9d28)
如果修改一个目录下所有文件和子目录的Owner和Group,加上-R选项即可,例如chown -R root:root mydir/。
(10)统计目录总大小——du (★★★★★)
du命令可以统计指定目录下所有文件总的占用空间大小,例如统计 /etc/yum.repos.d目录下所有文件总的占用空间大小,如下所示,总的大小为48K,其中 -s选项用来统计总的占用空间大小,-h表示使用可读的形式显示大小,如2K、5M或8G等。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_04.jpg?sign=1739298920-BJ1uFALZMM7rOWMt0Up4wknbufkhfJQy-0-222a7dfa42403d8436ac9d3c8f17a2de)
(11)比较文件/目录——diff (★★★★★)
diff命令可以比较两个文件是否相同,例如比较 /etc/profile和当前目录下的profile1文件是否相同,命令如下。
首先,复制 /etc/profile到当前目录,重命名为profile1,并追加内容123。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_05.jpg?sign=1739298920-Cb4C5Ns4eYGjrmqBuatUZx2yeUrUDm7i-0-7ec1ed6919f7d4f3da151fcc3c12e9f2)
使用diff来比较 /etc/profile和当前目录下的profile1,命令如下,如果没有任何输出,则说明两个文件完全相同,如果有输出,则说明两个文件不同,输出的部分就是两者不同的部分,如下所示:86表示profile1的第86行,d85表示/etc/profile的第85行,<后面的内容表示从profile1的第86行起始的内容,也就是和/etc/profile不同的部分。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_06.jpg?sign=1739298920-F8fMXYb92wj5iOCkAdkFd0GRVh18vmBE-0-fe5cfdcb710a141e3ae14f13dcbc7b88)
如果要比较两个目录下文件是否相同,可以加上-r选项。