文章目录
Linux 文件常见操作
0. 前言
这不离公司给咱发Linux的日子越来越近了嘛,Sharry我先自己弄了台虚拟机用于基础命令的学习,可是一进系统就尴尬了:我是谁,我在哪,我要用哪些命令操作Linux的文件?
是时候要把这些已经还给老师的命令拿回来了!开干!
学习基础
巧妇难为无米之炊,首先咱需要一台 Linux。个人日常学习就用虚拟机或堡垒机,经济宽裕的同学可以用云服务器。
学习目标
遨游Linux文件系统,再也不怕在Shell中迷路!
参考教程
- 《Linux命令行大全》—— William E.Shotts, Jr.
- Linux命令大全在线手册:https://www.linuxcool.com/
1 文件操作
在类UNIX系统中,通常只有1个文件树。根据设置,存储设备会挂载到文件系统树的不同位置。
由于缺少GUI图形化操作界面的支持,我们需要用命令来查看当前工作目录、移动到目标目录、操作文件等。
1.1 目录导航:pwd,cd,ls
- pwd :查看当前工作目录
- cd :切换目录
- ls : 列出目录内容
掌握pwd、cd、ls这三个命令是我们畅游 Linux 文件 系统的基础,我们可以通过这三个命令随时了解自己现在在哪个目录,随时切换到想去的目录,随时了解当前目录里都有哪些目录和文件。
(1)pwd 查看当前路径
查看当工作目录,显示的是当前目录的绝对路径
例如,当我们登录个人用户后:
[sharry@localhost ~]$ pwd
/home/sharry
(2)cd 切换路径
切换到指定目录,可通过相对路径与绝对路径切换
- 绝对路径:从根目录算起,直到目标文件或文件夹的路径,例如我们pwd命令得到的就是当前目录的绝对路径。
- 相对路径:相对路径指以当前目录为中心,以 单个 “ . ” 代表工作目录, 以 “ … ” 代表工作目录的父目录。
这么说可能会有点抽象,下面直接结合 cd 命令来举例:
绝对路径:
# 登陆后,pwd 获取当前用户的绝对路径
[sharry@localhost ~]$ pwd
/home/sharry
# 通过绝对路径, 切换到 指定目录, 这里 /usr/bin 是绝大多数Linux系统都有的
[sharry@localhost ~]$ cd /usr/bin
[sharry@localhost bin]$ pwd
/usr/bin
[sharry@localhost bin]$
# 再通过绝对路径切换回初始的目录
[sharry@localhost bin]$ cd /home/sharry
[sharry@localhost ~]$ pwd
/home/sharry
相对路径:
[sharry@localhost ~]$ pwd
/home/sharry
# 通过相对路径 返回父级目录/home
[sharry@localhost ~]$ cd ..
[sharry@localhost home]$ pwd
/home
# 通过相对路径 返回根目录/
[sharry@localhost home]$ cd ..
[sharry@localhost /]$ pwd
/
# 通过相对路径 返回用户主目录
[sharry@localhost /]$ cd ./home/sharry
[sharry@localhost ~]$ pwd
/home/sharry
# 以下展示 在当前目录去往当前目录的子目录时,"./" 可省略
[sharry@localhost ~]$ cd ..
[sharry@localhost home]$ cd sharry
[sharry@localhost ~]$ pwd
/home/sharry
(3)ls 列出目录内容
列出目录内容
入门例子:
[sharry@localhost ~]$ ls
Desktop Documents Downloads Music Pictures Public Templates Videos
ls 命令还能带一些选项,以实现特定的列出功能。实际上,许多命令都有如下结构:
# 命令 -选项 参数
command -options arguments
# 或 命令 参数 -选项
command arguments -options
例如:以长格式列出指定目录的子目录及文件
# 列出 用户主目录、 /usr 目录 包含的目录,并以长格式输出
[sharry@localhost ~]$ ls ~ /usr -l
/home/sharry:
total 0
drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Desktop
drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Documents
drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Downloads
# 篇幅有限,其余文件省略
...
/usr:
total 268
dr-xr-xr-x. 2 root root 49152 Apr 17 18:16 bin
drwxr-xr-x. 2 root root 6 Apr 10 2018 etc
drwxr-xr-x. 2 root root 6 Apr 10 2018 games
# 篇幅有限,其余文件省略
...
从上述例子,我们不难发现,ls 命令可带多个参数,一次性列出多个目标目录的子目录或文件," -l " 是个选项,表示以长格式输出。
ls 的常见选项 以及 长选项还有很多,再举个例子:
# 长输出 当前列表,按时间排序,并且列举包含隐藏文件的所有文件
[sharry@localhost ~]$ ls -lta
total 32
drwx------. 15 sharry sharry 4096 Apr 18 19:56 .
-rw-------. 1 sharry sharry 134 Apr 18 19:56 .Xauthority
drwx------. 14 sharry sharry 279 Apr 17 18:36 .cache
drwxr-xr-x. 14 sharry sharry 261 Apr 17 18:33 .config
drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Documents
drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Downloads
drwxr-xr-x. 2 sharry sharry 6 Apr 17 18:33 Music
-rw-------. 1 sharry sharry 16 Apr 17 18:33 .esd_auth
drwxr-xr-x. 3 root root 20 Apr 17 18:26 ..
drwxr-xr-x. 4 sharry sharry 39 Apr 17 18:08 .mozilla
-rw-r--r--. 1 sharry sharry 231 Mar 31 2020 .bashrc
# 篇幅有限,其余文件省略
...
# 列举包含隐藏文件的所有文件,且以修改时间正序排序
[sharry@localhost ~]$ ls -ta --reverse
.bashrc .mozilla .local Videos Pictures Documents .ICEauthority .
# 篇幅有限,其余文件省略
...
其中,以"." 开头的文件是隐藏文件, " – " 后面拼接的选项表示长选项,其效果与单个"-" 拼接的选项缩写一致:
[sharry@localhost ~]$ ls --all
. .bash_logout .cache Desktop .esd_auth .mozilla
[sharry@localhost ~]$ ls -a
. .bash_logout .cache Desktop .esd_auth .mozilla
# 篇幅有限,其余文件省略
...
在实际使用中,更多选项的用法,具体请参考Linux 命令手册
(4)探索与小结
-
探索:通过以上介绍的命令组合使用,探索Linux的文件树结构:
[sharry@localhost ~]$ cd .. [sharry@localhost home]$ cd .. [sharry@localhost /]$ ls bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [sharry@localhost /]$ cd home [sharry@localhost home]$ ls sharry [sharry@localhost home]$ cd sharry [sharry@localhost ~]$ ls Desktop Documents Downloads Music Pictures Public Templates Videos [sharry@localhost ~]$
我们发现,Linux 系统的根目录为 “/”,我们的用户主目录在 根目录的home目录下,以用户名命名。当进入用户主目录后,我们不难发现,在终端提示符左侧,我们的目录会变成“~”,这也是以非 root 用户登录的默认目录
-
小结:
通过上述命令的学习,我们已经可以随时切换工作目录并列出该目录下的子目录及文件。
1.2 查看文件: file, less
(1)file 查看文件基础信息
file 后面加上文件名,可查看文件的基础信息,例如 /etc 目录下存在一个passwd文件,我们切换到/etc 目录,执行file filename 命令 查看该文件的基础信息:
[sharry@localhost etc]$ file passwd
passwd: ASCII text
(2)less 阅读文本
less [filename] 可以阅读该命令的文本,例如,我们可以用该命令阅读上面小节提到的 passwd 文件:
[sharry@localhost etc]$ less passwd
关于 less,可按 h 查看帮助以获得详细的命令,常用的是 按q 退出,/charecters 查找指定字符串。至于详细的命令,请读者大佬自行查阅。
1.3 文件操作: mkdir,cp, mv,rm,ln
(1)mkdir 创建目录
mkdir命令可带多个参数,直接举例,在当前工作目录下分两次创建,总共创建3个目录:
[sharry@localhost ~]$ mkdir playground
[sharry@localhost ~]$ ls
Desktop Documents Downloads Music Pictures playground ...
[sharry@localhost ~]$ mkdir playground1 playground2
[sharry@localhost ~]$ ls
Downloads Pictures playground1 playground playground2
...
(2)cp 复制文件和目录
我们沿用上面小节的例子,将 Picture 目录下的文件复制到 playground2目录 中,然后将 整个 playground2 目录复制到 playground 中:
[sharry@localhost ~]$ cp Pictures/Linux-title.png playground2
[sharry@localhost ~]$ cd playground2
[sharry@localhost playground2]$ ls
Linux-title.png
[sharry@localhost ~]$ cp playground2 playground1 -a
[sharry@localhost ~]$ cd playground1
[sharry@localhost playground1]$ ls
playground2
[sharry@localhost playground1]$
注意,当复制目录时,需要添加-a 或 -r 选项。 具体选项的含义篇幅有限,请参考操作手册。
(3)mv 移动和重命名文件
直接举例:
# 移动文件
[sharry@localhost playground1]$ mv playground2 ../playground
[sharry@localhost playground1]$ ls
[sharry@localhost playground1]$ cd ../playground
[sharry@localhost playground]$ ls
playground2
# 重命名文件
[sharry@localhost playground]$ mv playground2 play
[sharry@localhost playground]$ ls
play
(4)rm 删除文件和目录
我们尝试将上面例子创建部分目录删掉:
[sharry@localhost ~]$ cd playground
[sharry@localhost playground]$ ls
play
[sharry@localhost playground]$ rm -i play
rm: cannot remove ‘play’: Is a directory
[sharry@localhost playground]$ rm -r play
[sharry@localhost playground]$ ls
注意,rm 命令还是需要慎用,因为 大部分 Linux 不提供 文件恢复功能,一般情况下,rm删掉的文件就是真正意义上的删除了。
还在好奇 rm -rf /* 吗?通过选项查询以及上文学习过的知识,这个命令不难理解:就是将 / 根目录下的所有文件递归强制删除!实在好奇,可以自己再建一台虚拟机试试哦。注意,千万不要在公司或单位任何服务器尝试这个命令。否则,要么跑路,要么被同事打。
(5)ln 创建链接
硬链接与软连接
软链接(symbolic link),也称为符号链接,是一个指向另一个文件或目录的文件,类似于 Windows 下的快捷方式。软链接文件包含的是一个指向另一个文件或目录的路径名,而非实际的文件数据。软链接的创建和删除不会影响源文件,因为软链接只是一个指向文件或目录的路径名,相当于源文件的别名。
硬链接(hard link)是一个指向已经存在的文件的链接,这个链接与源文件在磁盘上的 inode 号是相同的,因此,硬链接和源文件是同一个文件。一个文件可以有多个硬链接,每个硬链接都是一个相等的入口,各个硬链接之间没有区别,它们都是源文件的别名。硬链接的创建和删除会影响源文件,因为硬链接和源文件实际上是同一个文件,所以源文件的引用计数会随着硬链接的创建和删除而变化。在创建硬链接时,操作系统将新文件名与文件系统目录条目相对应,并将源文件的 i-node 数增加 1。
因为硬链接是源文件的一个别名,所以硬链接只能在同一个文件系统中使用,而软链接可以跨文件系统使用。此外,如果源文件被删除,硬链接依然可以访问原文件的数据,而软链接则失效。
举例
[sharry@localhost ~]$ cd Pictures/
[sharry@localhost Pictures]$ ls
Linux-title.png
# 创建硬链接
[sharry@localhost Pictures]$ ln Linux-title.png hard
[sharry@localhost Pictures]$ ls -li
total 256
3074328 -rw-rw-r--. 2 sharry sharry 130371 Apr 20 22:53 hard
3074328 -rw-rw-r--. 2 sharry sharry 130371 Apr 20 22:53 Linux-title.png
# 创建软链接
[sharry@localhost Pictures]$ ln -s Linux-title.png sym
[sharry@localhost Pictures]$ ls -li
total 256
3074328 -rw-rw-r--. 2 sharry sharry 130371 Apr 20 22:53 hard
3074328 -rw-rw-r--. 2 sharry sharry 130371 Apr 20 22:53 Linux-title.png
2256600 lrwxrwxrwx. 1 sharry sharry 15 May 4 20:30 sym -> Linux-title.png
# 测试软硬链接的区别
[sharry@localhost Pictures]$ rm Linux-title.png
[sharry@localhost Pictures]$ ls
hard sym
[sharry@localhost Pictures]$ less hard
"hard" may be a binary file. See it anyway?
[sharry@localhost Pictures]$ less sym
sym: No such file or directory
[sharry@localhost Pictures]$
2. 总结与补充
通过本文的学习,相信大家与Sharry一样,重拾了遨游 Linux 文件系统的方法。当然,由于 Linux 命令通常带有多个选项和参数,高级用法还需要自行去命令手册查阅并实践。
通过探索,您已经了解了Linux系统的基础文件树结构了吗?如果还是一知半解,或者逐个文件夹去查询过于麻烦,本文的最后,附一张来自度娘的图供大佬们参考: