About directory, but more than directory..
1. Linux 系统目录结构
Linux 秉承的原则:一切皆文件!
- /bin: bin 是 Binary 的缩写, 这个目录存放着最经常使用的命令。
- /boot:这里存放的是启动Linux时使用的一些核心文件,包括一些连接文件以及镜像文件。
- /dev:dev 是 Device 的缩写, 存放的是Linux的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。
- /etc:这个目录用来存放所有的系统管理所需要的配置文件和子目录。
- /home:用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的。
- /lib: 这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。
- /lost+found:这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。
- /media:Linux 系统会自动识别一些设备,例如 U盘、光驱 等等,当识别后,Linux 会把识别的设备挂载到这个目录下。
- /mnt:系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。
- /opt:这是给主机额外安装软件所摆放的目录。比如你安装一个 Oracle 数据库则就可以放到这个目录下(默认是空的)
- /proc:这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
- /root:该目录为系统管理员,也称作超级权限者的用户主目录。
- /sbin:s 就是 Super User 的意思,这里存放的是系统管理员使用的系统管理程序。
- /srv:该目录存放一些服务启动之后需要提取的数据。
- /sys:这是 linux2.6 内核的一个很大的变化,该目录下安装了2.6内核中新出现的一个文件系统 sysfs 。
- /tmp:这个目录是用来存放一些临时文件的。
- /usr:这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 Windows 下的program files目录。( unix system resources )
- /usr/bin:系统用户使用的应用程序。
- /usr/sbin:超级用户使用的比较高级的管理程序和系统守护程序。
- /usr/src:内核源代码默认的放置目录。
- /var: 这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。
- /run:是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。
2. Linux 目录管理指令
2.0 预览
接下来我们就来看几个常见的处理目录的命令吧:
- ls(英文全拼:list files): 列出目录及文件名
- cd(英文全拼:change directory):切换目录
- pwd(英文全拼:print work directory):显示目前的目录
- mkdir(英文全拼:make directory):创建一个新的目录
- rmdir(英文全拼:remove directory):删除一个空的目录
- cp(英文全拼:copy file): 复制文件或目录
- rm(英文全拼:remove): 删除文件或目录
- mv(英文全拼:move file): 移动文件与目录,或修改文件与目录的名称
2.1 ls
语法:
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称
[root@www ~]# ls [--color={never,auto,always}] 目录名称
[root@www ~]# ls [--full-time] 目录名称
参数说明:
- -a:显示所有文件及目录(包括 . 和 ..)
- -l:除文件名称外,亦将文件型态、权限、拥有者、文件大小等资讯详细列出
- -r: 将文件以相反次序显示(原定依英文字母次序)
- -t: 将文件依建立时间之先后次序列出
- -A: 同 -a ,但不列出 "." (目前目录) 及 ".." (父目录)
- -F: 在列出的文件名称后加一符号;例如可执行档则加 "*", 目录则加 "/"
- -R: 若目录下有文件,则以下之文件亦皆依序列出
将 home 目录下的所有文件列出来(含属性与隐藏档)
[root@www ~]# ls -al ~
2.2 cd
语法:
$ cd [相对路径或绝对路径]
实例:
# 跳到自己的 home 目录
cd ~
# 返回进入此目录之前所在目录
cd -
# 跳转到根目录
cd /
#使用绝对路径切换到 w 目录
[root@www ~]# cd /root/w/
#使用相对路径切换到 w 目录
[root@www ~]# cd ./w/
# 表示回到自己的家目录,亦即是 /root 这个目录
[root@www w]# cd ~
# 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思;
[root@www ~]# cd ..
2.3 pwd
语法:
$ pwd [-P]
参数说明:
- -P:显示出确实的路径,而非使用连结 (link) 路径。
[root@www ~]# pwd
/root <== 显示出目录啦~
实例显示出实际的工作目录,而非连结档本身的目录名而已。
[root@www ~]# cd /var/mail <==注意,/var/mail是一个连结档
[root@www mail]# pwd
/var/mail <==列出目前的工作目录
[root@www mail]# pwd -P
/var/spool/mail <==怎么回事?有没有加 -P 差很多~
[root@www mail]# ls -ld /var/mail
lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail
# 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail
# 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!
2.4 mkdir
语法:
$ mkdir [-mp] dirName
参数说明:
- -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
- -p:确保目录名称存在,不存在的就创建一个
实例:
# 在工作目录下,建立一个名为 w 的子目录
mkdir w
# 在工作目录下的 w 目录中,建立一个名为 test 的子目录。
# 若 w 目录原本不存在,则建立一个。(注:本例若不加 -p 参数,且原本 w 目录不存在,则产生错误。)
mkdir -p w/test
实例:请到 /tmp 底下尝试创建数个新目录看看:
[root@www ~]# cd /tmp
[root@www tmp]# mkdir test <==创建一名为 test 的新目录
[root@www tmp]# mkdir test1/test2/test3/test4
mkdir: cannot create directory `test1/test2/test3/test4':
No such file or directory <== 没办法直接创建此目录啊!
[root@www tmp]# mkdir -p test1/test2/test3/test4
加了这个 -p 的选项,可以自行帮你创建多层目录!
实例:创建权限为 rwx--x--x 的目录。
[root@www tmp]# mkdir -m 711 test2
[root@www tmp]# ls -l
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。
如果我们使用 -m ,如上例我们给予 -m 711 来给予新的目录 drwx--x--x 的权限。
2.5 rmdir
语法:
$ rmdir [-p] dirName
参数说明:
- -p: 当子目录被删除后使它也成为空目录的话,则顺便一并删除。
# 在工作目录下的 BBB 目录中,删除名为 Test 的子目录。若 Test 删除后,BBB 目录成为空目录,则 BBB 亦予删除。
rmdir -p BBB/Test
将 mkdir 实例中创建的目录(/tmp 底下)删除掉!
[root@www tmp]# ls -l <==看看有多少目录存在?
drwxr-xr-x 3 root root 4096 Jul 18 12:50 test
drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
[root@www tmp]# rmdir test <==可直接删除掉,没问题
[root@www tmp]# rmdir test1 <==因为尚有内容,所以无法删除!
rmdir: `test1': Directory not empty
[root@www tmp]# rmdir -p test1/test2/test3/test4
[root@www tmp]# ls -l <==您看看,底下的输出中test与test1不见了!
drwx--x--x 2 root root 4096 Jul 18 12:54 test2
利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。
不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录。
2.6 cp
语法:
$ cp [options] source dest
# 或
$ cp [options] source... directory
参数说明:
- -a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。
- -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
- -f:覆盖已经存在的目标文件而不给出提示。
- -i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答"y"时目标文件将被覆盖。
- -p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
- -r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
- -l:不复制文件,只是生成链接文件。
注意:用户使用该指令复制目录时,必须使用参数 -r 或者 -R.
2.7 rm
语法:
$ rm [-fir] 文件或目录
$ rm -rf directory # 强制删除文件夹、不询问
$ rm ./* # 删除当前文件夹下的所有目录项(询问)
参数说明:
- -i:删除前逐一询问确认。
- -f:即使原档案属性设为唯读,亦直接删除,无需逐一确认。
- -r:将目录及以下之档案亦逐一删除。
实例:
# rm test.txt
$ rm:是否删除 一般文件 "test.txt"? y
# rm homework
$ rm: 无法删除目录"homework": 是一个目录
# rm -r homework
$ rm:是否删除 目录 "homework"? y
删除当前目录下的所有文件及目录,命令行为:
$ rm -r *
删库跑路( Danger!):
$ rm -rf /
文件一旦通过rm命令删除,则无法恢复,所以必须格外小心地使用该命令。
2.8 mv
语法:
[root@www ~]# mv [-fiu] source destination
[root@www ~]# mv [options] source1 source2 source3 .... directory
参数说明:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- -u :若目标文件已经存在,且 source 比较新,才会升级 (update)
mv 参数设置与运行结果:
| 命令格式 | 运行结果 |
|---|---|
mv source_file(文件) dest_file(文件) | 将源文件名 source_file 改为目标文件名 dest_file |
mv source_file(文件) dest_directory(目录) | 将文件 source_file 移动到目标目录 dest_directory 中 |
mv source_directory(目录) dest_directory(目录) | 目录名 dest_directory 已存在,将 source_directory 移动到目录名 dest_directory 中;目录名 dest_directory 不存在则 source_directory 改名为目录名 dest_directory |
mv source_directory(目录) dest_file(文件) | 出错 |
3. 查看文件内容
3.0 预览
Linux 系统中使用以下命令来查看文件的内容:
- cat 由第一行开始显示文件内容
- tac 从最后一行开始显示,可以看出 tac 是 cat 的倒着写!
- nl 显示的时候,顺道输出行号!
- more 一页一页的显示文件内容
- less 与 more 类似,但是比 more 更好的是,他可以往前翻页!
- head 只看头几行
- tail 只看尾巴几行
3.1 cat
命令用于连接文件并打印到标准输出设备上
语法规则:
$ cat [-AbeEnstTuv] [--help] [--version] fileName
参数说明:
-
-n 或 --number:由 1 开始对所有输出的行数编号。
-
-b 或 --number-nonblank:和 -n 相似,只不过对于空白行不编号。
-
-s 或 --squeeze-blank:当遇到有连续两行以上的空白行,就代换为一行的空白行。
-
-v 或 --show-nonprinting:使用 ^ 和 M- 符号,除了 LFD 和 TAB 之外。
-
-E 或 --show-ends : 在每行结束处显示 $。
-
-T 或 --show-tabs: 将 TAB 字符显示为 ^I。
-
-A, --show-all:等价于 -vET。
-
-e:等价于"-vE"选项;
-
-t:等价于"-vT"选项;
实例:
把 textfile1 的文档内容加上行号后输入 textfile2 这个文档里:
$ cat -n textfile1 > textfile2
把 textfile1 和 textfile2 的文档内容加上行号(空白行不加)之后将内容附加到 textfile3 文档里:
$ cat -b textfile1 textfile2 >> textfile3
清空 /etc/test.txt 文档内容:
$ cat /dev/null > /etc/test.txt
cat 也可以用来制作镜像文件。例如要制作软盘的镜像文件,将软盘放好后输入:
$ cat /dev/fd0 > OUTFILE
相反的,如果想把 image file 写到软盘,输入:
$ cat IMG_FILE > /dev/fd0
注:
- OUTFILE 指输出的镜像文件名。
- IMG_FILE 指镜像文件。
- 若从镜像文件写回 device 时,device 容量需与相当。
- 通常用制作开机磁片。
3.2 tac
tac与cat命令刚好相反,文件内容从最后一行开始显示,可以看出tac是cat的倒着写
语法:
$ tac filename
3.3 nl
显示行号
语法:
$ nl [-bnw] filename
参数说明:
- -b :指定行号指定的方式,主要有两种:
- -b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
- -b t :如果有空行,空的那一行不要列出行号(默认值)
- -n :列出行号表示的方法,主要有三种:
- -n ln :行号在荧幕的最左方显示
- -n rn :行号在自己栏位的最右方显示,且不加 0
- -n rz :行号在自己栏位的最右方显示,且加 0
- -w :行号栏位的占用的位数
实例一:用 nl 列出 /etc/issue 的内容
[root@www ~]# nl /etc/issue
1 CentOS release 6.4 (Final)
2 Kernel \r on an \m
3.4 more
一页一页地翻动,只能向后翻页..
[root@www ~]# more /etc/man_db.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中间省略)....
--More--(28%) <== 重点在这一行喔!你的光标也会在这里等待你的命令
在 more 这个程序的运行过程中,你有几个按键可以按:
- 空白键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
- :f :立刻显示出档名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
3.5 less
一页一页地翻动,相比于 more,less 可以向前翻页..
[root@www ~]# less /etc/man.config
#
# Generated automatically from man.conf.in by the
# configure script.
#
# man.conf from man-1.6d
....(中间省略)....
: <== 这里可以等待你输入命令!
less 运行时可以输入的命令有:
- 空白键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字串 :向下搜寻『字串』的功能;
- ?字串 :向上搜寻『字串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- q :离开 less 这个程序;
3.6 head
取出文件前面几行
语法:
# 选项与参数:-n 后面接数字,代表显示几行的意思!
$ head [-n number] 文件
参数说明:
- -n :后面接数字,代表显示几行的意思
[root@www ~] # head /etc/man.config
默认的情况中,显示前面 10 行!若要显示前 20 行,就得要这样:
[root@www ~] # head -n 20 /etc/man.config
3.7 tail
取出文件后面几行
语法:
# -n :后面接数字,代表显示几行的意思
$ tail [-n number] 文件
参数说明:
- -n :后面接数字,代表显示几行的意思
- -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测
[root@www ~]# tail /etc/man.config
# 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样:
[root@www ~]# tail -n 20 /etc/man.config
4. Linux 链接
Linux 链接分为两种,一种被称为硬链接(Hard Link),另一种被称为软链接(Symbolic Link)
4.1 硬链接
硬链接指通过索引节点来进行连接。在 Linux 的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在 Linux 中,多个文件名指向同一索引节点是存在的。比如:A 是 B 的硬链接(A 和 B 都是文件名),则 A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号相同,即一个 inode 节点对应两个不同的文件名,两个文件名指向同一个文件,A 和 B 对文件系统来说是完全平等的。删除其中任何一个都不会影响另外一个的访问。
硬链接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止“误删”的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。
4.2 软链接
另外一种连接称之为符号链接(Symbolic Link),也叫软链接。软链接文件有类似于 Windows 的快捷方式。它实际上是一个特殊的文件。在符号连接中,文件实际上是一个文本文件,其中包含的有另一文件的位置信息。比如:A 是 B 的软链接(A 和 B 都是文件名),A 的目录项中的 inode 节点号与 B 的目录项中的 inode 节点号不相同,A 和 B 指向的是两个不同的 inode,继而指向两块不同的数据块。但是 A 的数据块中存放的只是 B 的路径名(可以根据这个找到 B 的目录项)。A 和 B 之间是“主从”关系,如果 B 被删除了,A 仍然存在(因为两个是不同的文件),但指向的是一个无效的链接。
# 硬链接
$ ln f1 f2 # 创建f1的一个硬链接文件f2
# 软链接
$ ln -s f1 f3 # 创建f1的一个软链接文件f3
5. 日期指令
date "+%Y-%m-%d %H:%M:%S"date -s "2021-10-30 20:00:00": 设置系统当前时间
cal: 日历
6. 关机 & 重启
init 0: 通过修改当前运行级别来关机shutdown -h now: 立即关机shutdown -h 1: 1分钟后关机shutdown -r now: 重启计算机halt: 关机reboot: 重启sync: 把内存中的数据同步到磁盘(不管是重启系统还是关闭系统,首先要运行sync) —— 现如今关机/重启命令都会自带sync!
希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥