- Linux快速入门与实战:基础知识、容器与容器编排、大数据系统运维
- 艾叔编著
- 3455字
- 2022-05-10 17:43:27
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=1739375001-iDPwkLwLzgKGJcvwE0aiBTJms04hVyjB-0-b297a1e687a1b66346b7747c500e8c26)
如果命令执行成功的话,会将当前目录切换到Path,如下所示,登录提示符中当前目录由~变成了tmp。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_05.jpg?sign=1739375001-UWuwu5sLpl94hNzE5o9fLT7LSki0bBQq-0-d5990526c4649fa68ce30573b8143a3e)
也可以执行pwd命令,打印当前路径进行验证。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/57_06.jpg?sign=1739375001-tM6uLuLsuJSAiuuhVSYtvRW51I0U97C0-0-5c4299cfe46ca3ceae8abea7b83deb3e)
使用cd~,可以切换到当前用户的home目录,如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_01.jpg?sign=1739375001-JL4jNRSKvVkuvMlEVdS57vipPf6ZhqtB-0-bc026d75c24c772d22c56e044d43ade5)
如果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=1739375001-3FkZFhigmslwopXAbYJRlVqp1BmI4tll-0-054bc4275cba694f5f0368bcc0324af9)
使用cd ..,可以切换到当前目录的父目录,如下所示,当前目录是 /home/user,使用cd ..后,退回到父目录,即 /home。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_03.jpg?sign=1739375001-f9yPW9guTCUNdT4IFwJf111jX9oDyctR-0-540cd0359dc564aa8dd6cfb47d995fe6)
(2)列出文件信息——ls (★★★★★)
命令ls是list的缩写,它可以列出指定路径下目录和文件的信息。ls和cd一样,也是Linux下使用最为频繁的命令之一。ls的使用方法如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_04.jpg?sign=1739375001-p2OdySgvvTxQt7RG9HdUyiXWxjz0W8Of-0-919321f521991a1c0e4701373f737dec)
其中[OPTION]是选项,这是一个可选项,可以加也可以不加,常用的OPTION有-l、-a等,[FILE]是路径,也是可选项,示例如下。
1)示例1:列出/etc/profile的详细文件信息。
示例命令如下,-l表示列出详细信息。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_05.jpg?sign=1739375001-8zJH217B0JdMbxxZIipDMpklECBuc8Dg-0-9a31504e12d1ecc14f9a3090af937077)
文件详细信息的说明如图2-24所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/58_06.jpg?sign=1739375001-O3i6wxs8eF5k2eGFvP0ynhdL6uiVYXdh-0-d3e734a06b63cbfe76ffc24dfefff8b7)
图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=1739375001-Dpz8FRgarLbvIZc4kykkjhWnk2zbkmVi-0-55acca6916c5b8a16e8048b1f6e8be15)
3)示例3:使用通配符列出指定的文件。
示例命令如下,* 可以匹配任意长度的字符串,例如a* 就表示所有以a开头的字符串,使用ls/etc/a*可以列出/etc下所有a开头的文件(包括目录),如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_02.jpg?sign=1739375001-00K7Ege1sfwuHv3hoKIyHdgG70DCAZPO-0-370847bd01faa5b49fb8a9e5e3f3b2de)
?可以匹配一个字符,且该字符不能为空,如下所示,ls /dev/tty?可以列出/dev下所有开头为tty,且后面还有1个字符的文件。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_03.jpg?sign=1739375001-piwiARRJ2n5oYDXQgksKp5itVC12ZTEu-0-1a7192a90ffbdf7e871080c82ad4f4f1)
4)示例4:文件分类。
使用 -F选项对文件分类,-F选项会在相同类型的文件名后面加上相同的扩展名,例如可执行文件的扩展名是 *,管道文件的扩展名是 |,链接文件的扩展名是 @ 等。
使用 -F选项,列出/bin下所有文件,如下所示,所有可执行文件名后加了 * 扩展名,链接文件后面加了 @ 扩展名。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_04.jpg?sign=1739375001-FswVXgu0p5kmd21njAwvjyc19h5jfpkr-0-21c8acf96a66084dbba90ff6046c19b3)
利用管道 |,将ls的输出作为grep命令的输入,过滤所有扩展名为 * 的文件,命令如下,可以得到 /bin/ 下所有的可执行文件。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_05.jpg?sign=1739375001-CcFnr7A43kqdIXqrkCJvxl1cy0IrxlJ7-0-44aa504281c65b49893098fd7a48879c)
(3)打印当前目录——pwd (★★★★☆)
命令pwd是Print Work Dierctory的缩写,它可以打印当前目录,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_06.jpg?sign=1739375001-lfcl1UZFVvlmMpseVTBhFpTGRXQVDTbA-0-da9419132566ca48cc538fbcf6a37fc1)
(4)复制文件——cp (★★★★★)
使用cp可以复制文件/目录,cp命令的使用方式如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/59_07.jpg?sign=1739375001-PxtOenXnI1UmzEpwkSgqhri8W3qPOn4s-0-5c6032cea94ab7ff119f0d5452d4cd67)
其中[OPTION]是可选项,用来指定cp的选项,SOURCE用来指定cp的源路径,它可以是一个文件路径,也可以是目录路径,DEST是目的路径,使用示例如下。
1)示例1:复制文件到指定目录。
将/etc/profile文件复制到/tmp,复制后的文件名字不变,命令如下,使用ls可以验证复制操作是否成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_01.jpg?sign=1739375001-vMqCyshxnjCvTz91rNO21R46koNA4uIG-0-f9d77bfb9708b3242664fc84acfe0d39)
2)示例2:复制文件并重命名。
复制/etc/profile到/tmp,并重命名为profile1,命令如下,使用ls可以验证复制操作是否成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_02.jpg?sign=1739375001-gAYXVjnG5I47GufL7BhwhqB5oMpuUZ7C-0-8edde0e72f7e5606371966bf21095ce8)
3)示例3:复制目录。
复制/home/user目录到/tmp,复制后的目录保留原有名字user,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_03.jpg?sign=1739375001-MDyeSxQwxKLercK7EceQUUT360oyaSCH-0-69dd898d02e895768fceecd6d404f8a1)
4)示例4:复制目录并重命名。
复制/home/user目录到/tmp,复制后的目录名为user1,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_04.jpg?sign=1739375001-PYipf5PnHOBpVNpQkyoMVDo1bFgjBBUD-0-c35151815273b3696216f2d62889826e)
(5)删除/移动文件——rm/mv (★★★★☆)
使用rm删除文件/目录,示例如下。
1)示例1:删除文件。
删除/tmp/profile,命令如下,如果命令执行后,没有任何提示,则说明执行成功。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_05.jpg?sign=1739375001-UGTJZOCUzNzLQWYCmT73PTIvdimmxBKH-0-ecfebaf5786c1691c755f89473cd0c3b)
2)示例2:删除目录。
删除目录/tmp/user,命令如下,如果命令执行后,没有任何提示,则说明执行成功。-r选项表示删除目录,-f选项不给出提示,直接强制删除。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_06.jpg?sign=1739375001-MVvrAfJtikYacKznuwDUZS3CTAibwOGt-0-f0472677d23674de40eabeeed74a1133)
使用mv移动文件/目录,或者重命名,使用示例如下。
3)示例3:文件重命名。
将/tmp/profile1重命名为/tmp/profile,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_07.jpg?sign=1739375001-8YrUx5atlKioQ0aGd4ZSdoqyD2jVLbXq-0-6d990879aa5e8b87969d06a321b2d56b)
(6)创建文件
创建文件有两种方法:使用touch创建一个空文件;使用echo将内容重定向到文件中,以此来创建一个文件,使用示例如下。
1)示例1:创建空文件。
使用touch创建空文件,并使用ls验证,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/60_08.jpg?sign=1739375001-snpQKTfYbnubhKEA6gdBGCq0yQmYO27K-0-379c08e9d5d24e27ee6006156e43a707)
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_01.jpg?sign=1739375001-BTfTsSVGUhiBHhOfD0myFcxtGRWCQLqO-0-bc0e69e2eef012d1921a65216eda0841)
2)示例2:创建指定内容文件。
使用echo将内容123输出到文件c中,以此创建新文件c,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_02.jpg?sign=1739375001-Eekp3HY2lsyHfWVl9obwbw33a3KWFIB6-0-48b0daca6c937cfc5e060f21039db1c4)
如上所示,echo将字符串123输出到stdout,>是重定向符号,它表示将echo的stdout的内容输出到文件c中,而不是打印在屏幕上。因此,上面的命令会生成新文件c,内容是123。使用cat命令输出c的内容,进行验证,如下所示。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_03.jpg?sign=1739375001-7Mrj1JKdGVmglbqILgHGH4c1cMCyEkik-0-9399740a5f4447e5dce7b612f1ab81e9)
(7)创建目录
使用mkdir来创建目录,示例如下。
1)示例1:创建普通目录。
在当前目录下创建名字为mydir的目录,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_04.jpg?sign=1739375001-xHCsfmU2lxb7K7vYgQWTdt4koozYmQpK-0-4cb0bd9404e162ebfaf6508f0b8c50c7)
使用ls查看当前目录,进行验证,可以看到mydir已经创建。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_05.jpg?sign=1739375001-4suwNeWb97AyXgleroHbv6eTF8eVWKRq-0-7b13b4359406397415e8e188de558ea7)
2)示例2:创建多级目录。
创建多级目录,使用-p选项在当前目录下创建两级目录mydir/newdir。
首先删除mydir,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_06.jpg?sign=1739375001-d3XcL06KV62RelHGgz8rMewKKtRgXjlz-0-4a0e42d3fdbd5b8927941d7b745cc0bb)
使用-p选项创建mydir/newdir,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_07.jpg?sign=1739375001-SUjfBsbZ6GzcW0FPesUP8f8qRmc9RNsO-0-ad094188dbf5007cafa10fcf38b136c4)
使用ls查看当前目录,进行验证,可以看到mydir/newdir已经创建。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/61_08.jpg?sign=1739375001-zbU4znJdBYvF3XWobMU2K4KcRpL84KSg-0-bb78da73f99f76e441676002a9348566)
(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=1739375001-2bsqbqZTmecbdBXLACf49RUj2Tgvj9c3-0-c95a57604d03a07b448f4c43d8e57d88)
接下来使用字母法去除Owner的read权限,命令如下,其中u表示user,- 表示去除,r表示read,c是文件路径,因为c就在当前目录下,因此直接用文件名,不用加路径。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_01.jpg?sign=1739375001-YI4tK9P66VZnB1agpEIvxP6KxdLSubhC-0-60cb84eda06ff8ff0312f771cc7a0503)
如果增加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=1739375001-4lr0maNv4m1PQtM8qED0kWCeBITyOI5f-0-51809d190ffb5aab14e2327389707066)
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=1739375001-MsHFQpS3WGIDHB1c1UjFMqIPQcGvYR4q-0-1cce02d2d17f3cd78079a582b442c896)
转换成二进制表示,则为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=1739375001-JhBwA2F2cXfj6PzqQ18PFntfgaI7qkDR-0-17eb4dc9ce4c37d3f3bd3cff085c2dba)
使用ls查看c的权限位进行验证,如下所示,c的Owner的read权限已经恢复。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_05.jpg?sign=1739375001-7jQHhcB9p7RejrT9PQvKPCd1PXH95vsb-0-58f1f3946c3b2a742f3bb4938cd23c93)
(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=1739375001-x49fKa0CyUvQDFjR6UryKV8w2JKWhogt-0-f64917f767da7078c5bbba725b14de28)
2)查看profile的Owner和Group信息,命令如下,可以看到profile的Owner和Group都是user。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/62_07.jpg?sign=1739375001-XAy3MWPjyzEVso0wrHZjkVbQ88bewJqX-0-7c85e8650f1ad182ef2001b948eb1d9e)
3)切换到root用户,命令如下。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_01.jpg?sign=1739375001-dqzkomkYgGj0fTy4rrhzUxC1CCsm3S2U-0-5f1bc19544cd26bae8a063465d80025c)
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=1739375001-e64s2MTdbqlrClhjcSoDlrsOGH0IagTD-0-bd86c8c347f57059679aea0c600d8a2b)
5)使用ls查看profile的Owner和Group进行验证,可以看到profile的Owner和Group都已经修改成了root。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_03.jpg?sign=1739375001-ppMDtkMjHfETGF0MsQDipIIF9AY3HlWV-0-5c00e8f896a3fac70f69601215e548ce)
如果修改一个目录下所有文件和子目录的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=1739375001-vgLDCXe4ehQrQBC9O3DsCPz4lx1WDp5T-0-ede3ad99090a92bcc0a1ab056f0c9fab)
(11)比较文件/目录——diff (★★★★★)
diff命令可以比较两个文件是否相同,例如比较 /etc/profile和当前目录下的profile1文件是否相同,命令如下。
首先,复制 /etc/profile到当前目录,重命名为profile1,并追加内容123。
![](https://epubservercos.yuewen.com/7143D2/23083819001905006/epubprivate/OEBPS/Images/63_05.jpg?sign=1739375001-Gg1YDzMDc3aWOM7bdlkGYGpCP64pHbLB-0-cab00cbf5757743e0cfd3d4d20f5fa9a)
使用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=1739375001-YWHtn40J05dYWYC0zJ5H7xAsbWz3ZtWj-0-72aa5095f70ac716cf75504beae95886)
如果要比较两个目录下文件是否相同,可以加上-r选项。