![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=1739391081-TSPu2Y2ckGdudggB0hoV8IwSbTJAUnB3-0-ff93aef4a3b73ff35525c200ad0d226d)
如果命令执行成功的话,会将当前目录切换到Path,如下所示,登录提示符中当前目录由~变成了tmp。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_05.jpg?sign=1739391081-XP85N431H6akgoKfl2Yst7OyVffLcrGT-0-403c5d662894ceb8fbb7eaac49667714)
也可以执行pwd命令,打印当前路径进行验证。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_06.jpg?sign=1739391081-dw6vAhSYHaG0FeexmcIuFXmS2WazqWDQ-0-461f1540afa25dbeb65593f0a4a7c617)
使用cd~,可以切换到当前用户的home目录,如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_01.jpg?sign=1739391081-WGtKumq38w1AWHsDo97H2s0uDCSIW3ap-0-a67d468bf4ec95155fdf4bd43e97c1b8)
如果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=1739391081-f7dEh1nj3IMYSsrZz2QFuHApZYltHQ8y-0-523857cc618006da8e254148dcb43526)
使用cd ..,可以切换到当前目录的父目录,如下所示,当前目录是 /home/user,使用cd ..后,退回到父目录,即 /home。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_03.jpg?sign=1739391081-uSXRPfFrkzH5mtDob9QjgBTCkcDakg83-0-393bc34d4d3dbad3f564422b71ea4545)
(2)列出文件信息——ls (★★★★★)
命令ls是list的缩写,它可以列出指定路径下目录和文件的信息。ls和cd一样,也是Linux下使用最为频繁的命令之一。ls的使用方法如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_04.jpg?sign=1739391081-xDZpOC6LLBwPysX2h0bVsJJYLjIkV0o4-0-a7eb42fa6f606d6d4ff8f41d7650b901)
其中[OPTION]是选项,这是一个可选项,可以加也可以不加,常用的OPTION有-l、-a等,[FILE]是路径,也是可选项,示例如下。
1)示例1:列出/etc/profile的详细文件信息。
示例命令如下,-l表示列出详细信息。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_05.jpg?sign=1739391081-rUDhM5BXjGgH7eksyITfEnyFop03bGnG-0-3922d03f8af07dae6e56d668b8299743)
文件详细信息的说明如图2-24所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_06.jpg?sign=1739391081-JCbxXkAyTZRmACQZ77GcDffdYMJV1qdu-0-c93a4e20bf4ea0ac078af1a503567497)
图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=1739391081-T0H0aKbE2vCk31Y6ixzf6jamXBVN4Tc9-0-e303402f7eaf3922f0c95226dec629e7)
3)示例3:使用通配符列出指定的文件。
示例命令如下,* 可以匹配任意长度的字符串,例如a* 就表示所有以a开头的字符串,使用ls/etc/a*可以列出/etc下所有a开头的文件(包括目录),如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_02.jpg?sign=1739391081-jVrRU2HkPBI73Mnf2xK3gRz4LXDw5wpt-0-fb1747109a3da926496a851a9b0fe566)
?可以匹配一个字符,且该字符不能为空,如下所示,ls /dev/tty?可以列出/dev下所有开头为tty,且后面还有1个字符的文件。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_03.jpg?sign=1739391081-nquQCJ1ogGyoANzK1L3ClPeoA1i6ofmv-0-77b5b2e59adec53c9fab6e3adfacbee8)
4)示例4:文件分类。
使用 -F选项对文件分类,-F选项会在相同类型的文件名后面加上相同的扩展名,例如可执行文件的扩展名是 *,管道文件的扩展名是 |,链接文件的扩展名是 @ 等。
使用 -F选项,列出/bin下所有文件,如下所示,所有可执行文件名后加了 * 扩展名,链接文件后面加了 @ 扩展名。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_04.jpg?sign=1739391081-SjWsTteXkdDpRQa7XCkFyOsj9OxrFHpo-0-d7dbd2af5e2fd6244836a82e38ea244a)
利用管道 |,将ls的输出作为grep命令的输入,过滤所有扩展名为 * 的文件,命令如下,可以得到 /bin/ 下所有的可执行文件。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_05.jpg?sign=1739391081-Hy8UdepqBhuc6mNZzfH9EhF9sl9PwqxX-0-c619f5356f89855ceba60142a4aad8c0)
(3)打印当前目录——pwd (★★★★☆)
命令pwd是Print Work Dierctory的缩写,它可以打印当前目录,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_06.jpg?sign=1739391081-goIvwPXR98x1U04owxxt5NTEypDOPiWJ-0-21b5c902972e091a4f43646b7a2bf737)
(4)复制文件——cp (★★★★★)
使用cp可以复制文件/目录,cp命令的使用方式如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_07.jpg?sign=1739391081-ewbYyqdGO6TGJd400Q62xGBRXKRGsxv9-0-6f5e4b8f86a0faa83cc00bc2b3330e0d)
其中[OPTION]是可选项,用来指定cp的选项,SOURCE用来指定cp的源路径,它可以是一个文件路径,也可以是目录路径,DEST是目的路径,使用示例如下。
1)示例1:复制文件到指定目录。
将/etc/profile文件复制到/tmp,复制后的文件名字不变,命令如下,使用ls可以验证复制操作是否成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_01.jpg?sign=1739391081-YeeSrOcQX4BnDNvl3q05lz8phxx34I7y-0-c3234d5f00669ea18cb1daa266c92f3d)
2)示例2:复制文件并重命名。
复制/etc/profile到/tmp,并重命名为profile1,命令如下,使用ls可以验证复制操作是否成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_02.jpg?sign=1739391081-1UMdwa85Ye6sMxdkmPcwiiTjVyBFcZug-0-9ce0808c6fbaed6a97aec3eeec354765)
3)示例3:复制目录。
复制/home/user目录到/tmp,复制后的目录保留原有名字user,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_03.jpg?sign=1739391081-ifY8w4H2UXnYoZasKCYQY75jLXzI6hoM-0-fc6f9b470345a56d9ee4fdac41ff5b72)
4)示例4:复制目录并重命名。
复制/home/user目录到/tmp,复制后的目录名为user1,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_04.jpg?sign=1739391081-cy9n5pzjdgXfk8iOgx9QcwtRVjvBsnmN-0-132628796b95d438e27cff775a15decf)
(5)删除/移动文件——rm/mv (★★★★☆)
使用rm删除文件/目录,示例如下。
1)示例1:删除文件。
删除/tmp/profile,命令如下,如果命令执行后,没有任何提示,则说明执行成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_05.jpg?sign=1739391081-HVGIbO7HGe3dFFtpVSPqM2fTqSzsr05z-0-bfe9a860200c5e1847bae8025969363f)
2)示例2:删除目录。
删除目录/tmp/user,命令如下,如果命令执行后,没有任何提示,则说明执行成功。-r选项表示删除目录,-f选项不给出提示,直接强制删除。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_06.jpg?sign=1739391081-28kpHp3WSOcgNV6ipv8tjGrAVnRaLSv4-0-a634f3ca237ed6b98c5ca07bba9d6a2c)
使用mv移动文件/目录,或者重命名,使用示例如下。
3)示例3:文件重命名。
将/tmp/profile1重命名为/tmp/profile,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_07.jpg?sign=1739391081-HztG3e21X74vxSnCkzPCeIW276rL0re8-0-1120d39b481d27a4255bad9dd5f51567)
(6)创建文件
创建文件有两种方法:使用touch创建一个空文件;使用echo将内容重定向到文件中,以此来创建一个文件,使用示例如下。
1)示例1:创建空文件。
使用touch创建空文件,并使用ls验证,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_08.jpg?sign=1739391081-ndfmEIDQgaylJ0bEcKBC8zstknjjKMoi-0-6729c1fac036593f268b2dbdecc2a355)
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_01.jpg?sign=1739391081-uml4fVHaHYv84Hs4l1YCiXy76q7Ly5hC-0-6e910b361f5d3c15641b98c588613fde)
2)示例2:创建指定内容文件。
使用echo将内容123输出到文件c中,以此创建新文件c,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_02.jpg?sign=1739391081-xZ4oDbOdhO8oeCfkUNsba15RddUzucVi-0-72b8118ee74f0921009633348c2699e5)
如上所示,echo将字符串123输出到stdout,>是重定向符号,它表示将echo的stdout的内容输出到文件c中,而不是打印在屏幕上。因此,上面的命令会生成新文件c,内容是123。使用cat命令输出c的内容,进行验证,如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_03.jpg?sign=1739391081-Cpuxc00K18r9zHTCZVNKkMUPlBHVy730-0-c0a20dceb607b3e0290b241f51d6d6c7)
(7)创建目录
使用mkdir来创建目录,示例如下。
1)示例1:创建普通目录。
在当前目录下创建名字为mydir的目录,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_04.jpg?sign=1739391081-LCCHpWEIcVGZpy7iu0d2mBW5GYCEasoA-0-098dcd6455fc98acde3f7c166992d671)
使用ls查看当前目录,进行验证,可以看到mydir已经创建。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_05.jpg?sign=1739391081-DDBLPEIk98ypY3ylQRN90pIllAnL1rTa-0-797efb4557fa904e0815a7b3b73e9008)
2)示例2:创建多级目录。
创建多级目录,使用-p选项在当前目录下创建两级目录mydir/newdir。
首先删除mydir,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_06.jpg?sign=1739391081-iR0mbofehKQfqqMX5KY75zkiYkWa8KjL-0-22229f347ad547c1f52319c3752d2044)
使用-p选项创建mydir/newdir,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_07.jpg?sign=1739391081-LqQSCBGuwZqs2nsFNo7tDY0CVkZERtVN-0-115d422995f0f39b090f381393951502)
使用ls查看当前目录,进行验证,可以看到mydir/newdir已经创建。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_08.jpg?sign=1739391081-c3l5JZnXe7dwcPoX9ZjezxWvzJw31DRp-0-0995c07cd7a36b6473166e2302c64933)
(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=1739391081-qCQjSpjhysYo9la4OW19yacNYxoxScan-0-c9cbba4b71206cb7d4ab94e7231c150c)
接下来使用字母法去除Owner的read权限,命令如下,其中u表示user,- 表示去除,r表示read,c是文件路径,因为c就在当前目录下,因此直接用文件名,不用加路径。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_01.jpg?sign=1739391081-cSlGY0I62h9g2CLSgOeZ6rwbqFnN1EpQ-0-3309fe207b02ad115ce26caf554d0be5)
如果增加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=1739391081-Lt0wgEhhFHZhjwGNHXCKU3r2YMD4GUNm-0-ffbaf54000c52a8e461a5164e2c9ba85)
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=1739391081-uBG1EbqgKbI83RvSyDSX2rLfkDSOMAKH-0-932d87e90d87adf1624627beb546c032)
转换成二进制表示,则为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=1739391081-WZzkqBbIjJDAWt2w4sXtFEMXmSg60Wvf-0-104718bb1d8d875adae59fa424937112)
使用ls查看c的权限位进行验证,如下所示,c的Owner的read权限已经恢复。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_05.jpg?sign=1739391081-NfCSr6Kq89YmE1lGeqcgDHutnP0vte8A-0-69ceaca2ca961935dd228c9c89d42d0d)
(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=1739391081-fLbjNxRyxXkU1ma1YbHPNrOYJWnCximI-0-d8e6a0b09e6c8370f33c35ea2a1ec05f)
2)查看profile的Owner和Group信息,命令如下,可以看到profile的Owner和Group都是user。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_07.jpg?sign=1739391081-hftLAjA3J751as1Ifuu87BfNfEakuJ2U-0-b977bc63e0b1406c97f7c528dde11edb)
3)切换到root用户,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_01.jpg?sign=1739391081-xWqxrDHB0XivquLNDNKLdZ1Yeomz0UNA-0-910a855e95af1b53febc6c154317b4e9)
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=1739391081-LSRPXQ6SmHKmi4G1OK86g9TwVmcdjuuy-0-50f2acd2de26fa43997fbc2387bf7a26)
5)使用ls查看profile的Owner和Group进行验证,可以看到profile的Owner和Group都已经修改成了root。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_03.jpg?sign=1739391081-1QNY3GZ4fBqd84Ab6b541GD5lqUbDKVl-0-6f5f4e66fe1c564dd6ca9f5d5b8f2764)
如果修改一个目录下所有文件和子目录的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=1739391081-Q7bICdzH9xBgkXMNKZrophXSCMfUDKDL-0-0b4ef13d97890d1f36d307755fa3158e)
(11)比较文件/目录——diff (★★★★★)
diff命令可以比较两个文件是否相同,例如比较 /etc/profile和当前目录下的profile1文件是否相同,命令如下。
首先,复制 /etc/profile到当前目录,重命名为profile1,并追加内容123。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_05.jpg?sign=1739391081-gvMeoc4xc4iSXceouh8wR1F6yWthbme6-0-b2fa246479611d6b7c9ce8a3566434ca)
使用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=1739391081-c17OTM8ykY24q8CIESziOr2PCTuBl9CI-0-c396048d8587c88c6acbf205d3a1c41e)
如果要比较两个目录下文件是否相同,可以加上-r选项。