「Linux 奏章 4」目录管理 etc

258 阅读6分钟

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

taccat 命令刚好相反,文件内容从最后一行开始显示,可以看出 taccat 的倒着写

语法:

$ 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

希望本文对你有所帮助🧠
欢迎在评论区留下你的看法🌊,我们一起讨论与分享🔥