系统性学习Linux-第一讲-Linux基础指令

系统性学习Linux-第一讲-Linux基础指令

  • 1.发展史
  • [2. 开源](#2. 开源)
  • [3. 官网](#3. 官网)
  • 4.企业引用现状
    • [4.1 Linux 在服务器领域的发展](#4.1 Linux 在服务器领域的发展)
    • [4.2 Linux 在桌面领域的发展](#4.2 Linux 在桌面领域的发展)
    • [4.3 Linux 在移动嵌入式领域的发展](#4.3 Linux 在移动嵌入式领域的发展)
    • [4.4 Linux 在云计算 / 大数据领域的发展](#4.4 Linux 在云计算 / 大数据领域的发展)
  • [5. 发行版本](#5. 发行版本)
    • [5.1 Debian](#5.1 Debian)
    • [5.2 Ubuntu](#5.2 Ubuntu)
    • [5.3 红帽企业级 Linux(RHEL)](#5.3 红帽企业级 Linux(RHEL))
    • [5.3 CentOS](#5.3 CentOS)
    • [5.3 Fedora](#5.3 Fedora)
    • [5.3 Kali Linux](#5.3 Kali Linux)
  • [6. os 概念,定位](#6. os 概念,定位)
  • [7. 使用 XShell 远程登录 Linux](#7. 使用 XShell 远程登录 Linux)
    • [7.1 关于 Linux 桌面的说明](#7.1 关于 Linux 桌面的说明)
    • [7.2 下载安装 XShell](#7.2 下载安装 XShell)
    • [7.3 查看 Linux 主机 IP 地址](#7.3 查看 Linux 主机 IP 地址)
    • [7.4 使用 XShell 登录 Linux 主机](#7.4 使用 XShell 登录 Linux 主机)
    • [7.5 XShell下的复制粘贴操作](#7.5 XShell下的复制粘贴操作)
  • [8. Linux 下基本指令](#8. Linux 下基本指令)
    • [8.1 ` ls ` 指令](#8.1 ls 指令)
    • [8.2 ` pwd ` 指令](#8.2 pwd 指令)
    • [8.3 ` cd ` 指令](#8.3 cd 指令)
    • [8.4 ` touch ` 指令](#8.4 touch 指令)
    • [8.5 ` mkdir ` 指令](#8.5 mkdir 指令)
    • [8.6 ` rmdir ` 指令](#8.6 rmdir 指令)
    • [8.7 ` rm ` 指令](#8.7 rm 指令)
    • [8.8 ` man ` 指令](#8.8 man 指令)
    • [8.9 ` cp ` 指令](#8.9 cp 指令)
    • [8.10 ` mv ` 指令](#8.10 mv 指令)
    • [8.11 ` cat ` 指令](#8.11 cat 指令)
    • [8.12 ` more ` 指令](#8.12 more 指令)
    • [8.13 ` less ` 指令](#8.13 less 指令)
    • [8.14 ` head ` 指令](#8.14 head 指令)
    • [8.15 ` tail ` 指令](#8.15 tail 指令)
    • [8.16 ` date ` 指令](#8.16 date 指令)
    • [8.17 ` cal ` 指令](#8.17 cal 指令)
    • [8.18 ` find ` 指令](#8.18 find 指令)
    • [8.19 ` which ` 指令](#8.19 which 指令)
    • [8.20 ` whereis ` 指令](#8.20 whereis 指令)
    • [8.21 ` alias ` 指令](#8.21 alias 指令)
    • [8.22 ` grep ` 指令](#8.22 grep 指令)
    • [8.23 ` top ` 指令](#8.23 top 指令)
    • [8.24 ` zip/unzip ` 指令](#8.24 zip/unzip 指令)
    • [8.25 ` tar ` 指令(重点)](#8.25 tar 指令(重点))
    • [8.26 ` bc ` 指令(了解)](#8.26 bc 指令(了解))
    • [8.27 ` uname ‒r ` 指令](#8.27 uname ‒r 指令)
    • [8.28 重要的几个热键 ` [Tab], [ctrl]-c, [ctrl]-d `](#8.28 重要的几个热键 [Tab], [ctrl]-c, [ctrl]-d)
    • [8.29 ` shutdown ` 指令(了解)](#8.29 shutdown 指令(了解))
    • [8.30 拓展指令](#8.30 拓展指令)
  • [9. shell 命令以及运行原理](#9. shell 命令以及运行原理)
  • [10. Linux权限的概念](#10. Linux权限的概念)
  • [11. Linux 权限管理](#11. Linux 权限管理)
  • [12. 文件访问权限的相关设置方法](#12. 文件访问权限的相关设置方法)
    • [12.1 ` chmod ` 指令](#12.1 chmod 指令)
    • [12.2 ` chown ` 指令](#12.2 chown 指令)
    • [12.3 ` chgrp ` 指令](#12.3 chgrp 指令)
    • [12.4 ` umask ` 指令](#12.4 umask 指令)
    • [12.5 ` file ` 指令](#12.5 file 指令)
    • [12.6 目录的权限](#12.6 目录的权限)
    • [12.7 关于权限的总结](#12.7 关于权限的总结)
    • [12.8 粘滞位(重要)](#12.8 粘滞位(重要))

本讲目的:

  • 初始 Linux 操作系统

  • 初识 shell 命令 ,了解若干背景知识。

  • 初步使用 40+ 个常用 Linux 命令

  • 掌握 Linux 权限概念与思想,能深度理解 "权限"

  • 初步了解 Linux 目录结构含义

  • 了解 Linux 相关知识:目录结构 / 路径 / 重定向 / 管道操作等

Linux 背景:

1.发展史

本系列文章学习 Linux 系统编程,你可能要问 Linux 从哪里来?它是怎么发展的?在这里简要介绍 Linux 的发展史。

要说 Linux ,还得从 UNIX 说起。

UNIX 发展的历史:

  • 1968年,⼀些来自通用电器公司、贝尔实验室和麻省理工学院的研究人员开发了⼀个名叫 Multics 的特殊操作系统。Multics在多任务文件管理和用户连接中综合了许多新概念。

  • 1969−1970年,AT&T 的贝尔实验室研究人员 Ken Tompson 和 Dennis Ritchie,在采用很多 Multics 特点的基础上开发了 UINX 系统。它运行在小型机上,满足了系统对科研环境的要求。从产生开始,UNIX 就是一个有价值的、高效的、多用户和多任务的操作系统。

  • UNIX 从满足个人的设计需求开始,逐步成长为由许多不同开发商所支持的标准软件产品。

  • 第一个 UNIX 版本是免费给许多知名大学的计算机系使用的。

  • 1972 年,贝尔实验室开始发放商业版本,并且给不同的用户授权使用这个系统,使用者之一是加州大学伯克莱分校的计算机系。伯克莱给系统增加了许多新的特点,后来成为了标准。

  • 1975 年伯克莱由下属部门 BSD 发行了自己的 UNIX 版本。UNIX 的 BSD 版本成为 AT&T 贝尔实验室版本的主要竞争者,而其它的独立开发出的 UNIX 版本也开始萌生。

  • 1980 年微软公司开发了叫做 Xenix 的 UNIX PC 版本。AT&T 发行了第一个商业版本。名叫 System Ⅲ,后来被成为对商用软件产品良好支持的 System Ⅴ 所替代。

  • 同时 UNIX 的 BSD 版本不断发展,在 70 年代末期,BSD UNIX 成为了国防部的高科技研究机构科研项目的基础。其结果,伯克莱发行了一个叫做 BSD Release 4.2 的有效版本。

  • 它包括了高级的文件管理器和基于 TCP / IP 网络协议的网络特点。现在 TCP / IP 被 Internet 所使用。BSD Release 4.2 被许多厂商所采⽤,例如 SUN Microsystem。

  • UNIX 不同版本的出现导致了 UNIX 标准的需要,软件开发商不知道他们的程序运行在哪些版本上比较合适。

  • 到 80 年代中期,两个竞争的标准出现了,⼀个是基于 AT&T 的 UNIX 版本,另⼀个是 BSD 版本。在今天的书店里你能发现分别适用于这两个版本的不同的 UNIX 的书,⼀些是 System V ,另⼀些集中在 BSD UNIX。

  • AT&T 建立了⼀个叫 UNIX 系统实验室的新组织,它的作用就是综合 UNIX 的不同版本,集中开发⼀个标准系统。

  • 1991 年,UNIX 综合实验室综合了 System V Release3,SUN OS 和 Xenix 的所有特点,发行了 System V Release 4。为了与System V Release 4 竞争,一些其它公司,如 IBM 和惠普 Open Software Foundation(OSF)去产生自己的 UNIX 标准版本,继而出现了两个标准商业版本 OSF 版本和 System Release 4。

  • 1993 年,AT&T 把它的 UNIX 转卖给 Novell 公司。UNIX 系统实验室成为了 Novell 的 UNIX 系统小组的一部分。Novell 发行了基于System V Release 4的自己的 UNIX 版本 UNIXWare ,它可以和 Novell 公司的 Netware 系统相联。SUN 公司已经把

    System V Release 4 融进了它的SUN OS,发行了 Solaris 。两个相互竞争的 UNIX 适用的图形用户界面(⼀个叫 Motif ,另⼀个叫Openlook),已经合并为一个新的工作平台标准,叫做通用平台环境(CDE)。

Linux 发展历史:

  • 1991 年 10 月 5 日,赫尔辛基大学的一名研究生 Linus Benedict Torvalds 在一个 Usenet 新闻组(comp.os.minix)中宣布他编制出了⼀种类似 UNIX 的小操作系统,叫 Linux 。新的操作系统是受到另一个 UNIX 的小操作系统 Minix 的启发,该系统是由一名叫

    Andrew S Tanenbaum 的教师开发的。读者也许猜想所发布的这个系统应该是 Linux 的 0.01 版本,实际上不是这样。真正的

    Linux 0.01版本并没有被发布,原因是 0.01 版本不实用。Linus 仅仅在第一个 Linux 的 FTP 站点(ftp://nic.funet.fi)上提供过这个版本的的源代码。

  • Torvalds 于 10 月 5 日发布的这个 Linux 版本被称为 0.02 版,它能够运行 GNU Bourne Again Shell(bash) 和 GNU 的 C 编译程序(gcc)以及为数不多的其它语言。Torvalds 绝对没有想到他设想的一种能够针对高级业余爱好者和黑客们的操作系统已经产生,这就是⼈们所称的 Linux 。

  • Linux 发布时的版本是 0.02 ,后来又有 0.03 版,然后又跳到 0.10 版。因为世界各地越来越多的程序员都开始开发 Linux ,它已经达到0.95 版。这就意味着正式公布 1.0 版本的时间已经为期不远了。正式的 1.0 版本是在 1994 年公布的。


2. 开源

  • Linux 是⼀种自由和开放源代码的类 UNIX 操作系统,该操作系统的内核由林纳斯托瓦兹在 1991 年首次发布,之后,在加上用户空间的应用程序之后,就成为了 Linux 操作系统。严格来讲,Linux 只是操作系统内核本身,但通常采用 "Linux内核" 来表达该意思。而Linux 则常用来指基于 Linux 内核的完整操作系统,它包括 GUI 组件和许多其他实用⼯具。

  • GNU 通用公共许可协议(GNU General Public License,简称 GNU GPL 或 GPL),是⼀个广泛被使用的自由软件许可协议条款,最初由理查德斯托曼为 GNU 计划而撰写,GPL 给予了计算机程序⾃由软件的定义, 任何基于 GPL 软件开发衍生的产品在发布时必须产生GPL 许可证方式,且必须公开源代码

  • Linux 是自由软件和开放源代码软件发展中最著名的例子。只要遵循 GNU 通用公共许可证,任何个人和机构都可以自由地使用 Linux 的所有底层源代码,也可以自由地修改和再发布。随着 Linux 操作系统飞速发展,各种集成在 Linux 上的开源软件和实用工具也得到了应用和普及,因此,Linux 也成为了开源软件的代名词。

3. 官网

4.企业引用现状

4.1 Linux 在服务器领域的发展

随着开源软件在世界范围内影响力日益增强,Linux服务器操作系统在整个服务器操作系统市场格局中占据了越来越多的市场份额,

已经形成了大规模市场应用的局面,并且保持着快速增长率,尤其在政府、金融、农业、交通、电信等国家关键领域得到了深度应用。

此外,考虑到Linux的快速成长性以及国家相关政策的扶持力度,Linux服务器产品必将进一步开拓更大的服务器市场。

据权威部门统计,目前Linux在服务器领域已占据75%的市场份额。同时,Linux在服务器市场的迅速崛起,

已引起全球IT产业的高度关注,并以强劲势头成为服务器操作系统领域的中坚力量。

4.2 Linux 在桌面领域的发展

近年来,尤其在国内市场,Linux桌面操作系统的发展趋势十分迅猛。国内如中标麒麟Linux、红旗Linux、深度Linux

等系统软件厂商推出的Linux桌面操作系统,目前已在政府、企业、OEM等领域得到广泛应用。

另外,SUSE、Ubuntu等厂商也相继推出了基于Linux的桌面系统,其中Ubuntu Linux已积累了大量社区用户。

不过,从系统整体功能、性能来看,Linux桌面系统与Windows系列相比仍存在一定差距,主要体现在系统易用性、系统管理、

软硬件兼容性、软件丰富程度等方面。

4.3 Linux 在移动嵌入式领域的发展

Linux的低成本、强大的定制功能以及良好的移植性能,使其在嵌入式系统领域得到广泛应用。

目前,Linux已广泛应用于手机、平板电脑、路由器、电视和电子游戏机等各类设备。在移动设备上广泛使用的Android操作系统,

正是基于Linux内核开发的。据2015年权威部门最新统计,Android操作系统的全球市场份额已达84.6%,现已成为最流行手机操作系统。

此外,思科在网络防火墙和路由器中采用了定制化Linux系统;阿里云自主研发了基于Linux的操作系统"YunOS",可应用于智能手机、

平板电脑和网络电视;常见的数字视频录像机、舞台灯光控制系统等设备,也在逐步采用定制版本的Linux实现核心功能。

这一切成果的取得,均归功于Linux与开源的强大力量。

4.4 Linux 在云计算 / 大数据领域的发展

互联网产业的迅猛发展,推动了云计算、大数据产业的形成与快速扩张。云计算、大数据平台多基于开源软件构建,

而 Linux 在其中占据核心优势。据 Linux 基金会研究数据显示,86% 的企业已采用 Linux 操作系统构建云计算、大数据平台。

目前,Linux 已逐渐取代 Unix ,成为最受青睐的云计算与大数据平台操作系统。

5. 发行版本

5.1 Debian

Debian 运行起来极其稳定,这一特性使其非常适合用于服务器场景。不过,Debian 操作系统显然并不适合新手用户,

更适配系统管理员和高级用户使用。

5.2 Ubuntu

Ubuntu 是 Debian 的一款衍生版,也是当今最受欢迎的免费操作系统之一。Ubuntu 侧重多元市场应用,在服务器、云计算领域,

甚至部分运行 Ubuntu Linux 的移动设备上都十分常见。对于新手用户而言,Ubuntu 无疑是一款容易上手、令人青睐的操作系统。

5.3 红帽企业级 Linux(RHEL)

这是第一款面向商业市场的 Linux 发行版,拥有服务器版本,支持 x86、x86_64 等众多处理器架构。红帽公司通过红帽认证系统管理员

红帽认证工程师(RHCSA/RHCE)相关课程,为系统管理员提供专业的培训与认证服务,助力提升从业人员专业能力。

5.3 CentOS

CentOS 是一款企业级 Linux 发行版,基于红帽企业级 Linux 的免费源代码重新构建而成。该重构版本完全去除了注册商标,

仅在 Binary 程序包方面存在极其细微的差异。对于不想支付高额费用,却想体验红帽企业级 Linux 核心功能的用户来说,

CentOS 值得一试。此外,CentOS 的外观表现和操作逻辑,与母发行版红帽企业级 Linux 几乎如出一辙,其软件包管理采用 YUM 工具。

5.3 Fedora

轻量型的 Fedora ,适合那些想尝试前沿技术、等不及稳定版程序发布的用户。事实上,Fedora 是红帽公司的核心测试平台,

产品在正式成为企业级发行版之前,都会在此平台上完成开发与测试工作。Fedora 本身也是一款优质的发行版,拥有庞大的用户论坛,

软件库中还包含数量可观的软件包资源。

5.3 Kali Linux

Kali Linux 是 Debian 的一款衍生版,专为渗透测试场景设计,其前身是 Backtrack 。

所有适用于 Debian 的 Binary 软件包都可安装到 Kali Linux 中,这也是 Kali 核心魅力与威力的重要来源。此外,支持Debian的用户论坛,

也为 Kali 提供了充足的技术支持,进一步提升了其易用性。Kali 默认预装了大量渗透测试工具,无论是 Wifi 测试、数据库测试,

还是其他场景的工具,均支持开箱即用,其软件包管理采用 APT 工具。毫无疑问,Kali Linux 是渗透测试人员,

以及文明黑客(非恶意黑客)群体青睐的专用操作系统。

6. os 概念,定位

使计算机更好用 ! 这是操作系统的根本要义!!

7. 使用 XShell 远程登录 Linux

7.1 关于 Linux 桌面的说明

很多同学的Linux系统启动后会进入图形化桌面,这个图形界面大家后续可以忽略,因为在实际工作场景中,基本没有机会使用图形界面。

思考:为什么不使用图形界面?

实际工作中,Linux多作为服务器使用,服务器通常不会安装图形化界面(节省系统资源、提升运行稳定性、降低安全风险),

且远程管理服务器时,命令行界面比图形界面更高效、更便捷,适配各类网络环境。

7.2 下载安装 XShell

XShell是一款常用的远程终端软件,可用于远程连接Linux主机。

官方下载地址:https://www.netsarang.com/products/xsh_overview.html

下载安装时,按照官方指引完成操作即可(建议选择对应系统的最新稳定版本)。

7.3 查看 Linux 主机 IP 地址

在 Linux 本地终端中,输入 ifconfig 指令,执行后可查看到主机的IP地址(通常在eth0或ens33网卡对应的inet字段中)。

7.4 使用 XShell 登录 Linux 主机

  1. 打开 XShell 软件,在终端窗口中输入命令:ssh [IP地址](将"[IP地址]"替换为刚才通过ifconfig查询到的Linux主机IP);

  2. 若网络畅通,终端会提示输入用户名和密码;

  3. 正确输入Linux主机的用户名和密码(输入密码时通常不显示明文),即可成功登录。

7.5 XShell下的复制粘贴操作

注意:XShell 终端中不支持 Windows 系统常用的 Ctrl+C / Ctrl+V 复制粘贴快捷键,需使用以下组合键:

  1. 复制:Ctrl + Insert(部分笔记本电脑需配合Fn键按下Insert键);

  2. 粘贴:Shift + Insert。

8. Linux 下基本指令

8.1 ls 指令

语法:

powershell 复制代码
ls [选项] [目录或文件]

功能:

若参数为目录,该命令将列出此目录下的所有子目录与文件;若参数为文件,将列出文件名及其他相关信息。

常用选项:

  • -a:列出目录下的所有文件,包括以"."开头的隐藏文件(隐含文件)。

  • -d:将目录像文件一样显示,而非显示其下的文件。示例:ls -d 指定目录

  • -i:输出文件的i节点(索引节点)的索引信息。示例:ls -ai 指定文件

  • -k:以KB(千字节)为单位表示文件大小。示例:ls -alk 指定文件

  • -l:以长格式列出文件的详细信息(含权限、所有者、大小、修改时间等)。

  • -n:用数字形式的UID(用户ID)、GID(组ID)代替用户名和组名(需了解UID、GID的核心概念)。

  • -F:在每个文件名后附加一个字符以标识文件类型(便于快速识别目录及文件属性):

    • "*":表示可执行的普通文件;

    • "/":表示目录;

    • "@":表示符号链接;

    • "|":表示FIFOs(命名管道);

    • "=":表示套接字(sockets)。

  • -r:对目录内的文件/子目录按反向顺序排序。

  • -t:按文件的修改时间排序(最新修改的文件排在首位)。

  • -s:在文件名后输出文件大小(可结合排序指令查找目录下最大文件)。

  • -R:递归列出所有子目录下的文件(遍历各级子目录)。

  • -1:一行仅输出一个文件(单列显示,提升可读性)。

举例:

bash 复制代码
[chengkl4@VM-0-9-centos ~]$ ls
dir file.txt
[chengkl4@VM-0-9-centos ~]$ ls -a
. .. dir file.txt
[chengkl4@VM-0-9-centos ~]$ ls -a -l
total 12
drwxrwxr-x 3 whb whb 4096 Jan 11 15:01 .
drwx------ 22 whb whb 4096 Jan 11 14:21 ..
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[chengkl4@VM-0-9-centos ~]$ ls -a -l -F
total 12
drwxrwxr-x 3 whb whb 4096 Jan 11 15:01 ./
drwx------ 22 whb whb 4096 Jan 11 14:21 ../
drwxrwxr-x 2 whb whb 4096 Jan 11 14:22 dir/
-rw-rw-r-- 1 whb whb 0 Jan 11 14:22 file.txt
[chengkl4@VM-0-9-centos ~]$ ls -alFn
total 12
drwxrwxr-x 3 1003 1003 4096 Jan 11 15:01 ./
drwx------ 22 1003 1003 4096 Jan 11 14:21 ../
drwxrwxr-x 2 1003 1003 4096 Jan 11 14:22 dir/
-rw-rw-r-- 1 1003 1003 0 Jan 11 14:22 file.txt

8.2 pwd 指令

语法:

bash 复制代码
pwd

功能:

显示用户当前所在的工作目录路径。

常用选项:

举例:

bash 复制代码
[chengkl4@VM-0-9-centos ~]$ pwd
/home/chengkl4

8.3 cd 指令

Linux理论知识:路径的认识

  • Linux 系统中,磁盘上的文件和目录被组织成一棵目录树,每个节点要么是目录,要么是文件。

  • 普通文件一定是目录树的叶子节点(无子节点)。

  • 目录既可以是叶子节点(空目录),也可以是中间节点(包含子目录/文件)。

  • 路径存在的意义:目录树的组织方式,核心是为了快速定位并查找指定文件,而定位文件需要唯一的方案------任何一个节点都只有一个父节点,因此从根目录开始,定位指定文件的路径具有唯一性。

  • 绝对路径:一般从根目录(/)开始,不依赖当前所在目录即可定位文件的方式,路径唯一且固定。

  • 相对路径:相对于当前用户所处目录,定位文件的路径方式,依赖当前工作目录,使用更便捷。

  • 绝对路径不会随着用户当前目录的变化而丧失唯一性,常用于特定服务的配置文件中(确保配置路径准确无误)。

  • 相对路径因便捷性,在命令行操作中使用频率更高(无需输入完整根路径)。


语法 :

bash 复制代码
cd [目录路径]

功能:

改变当前工作目录,将当前工作目录切换到指定的目录下;若不指定目录名,默认切换到当前用户的家目录(~)。

常用选项:

无(核心通过目录名/路径参数实现切换,支持特殊符号简化操作,如...、~、- 等)

举例:

bash 复制代码
# 1. 返回上级目录
[chengkl4@VM-0-9-centos ~]$ pwd
/home/chengkl4
[chengkl4@VM-0-9-centos ~]$ cd ..
[chengkl4@VM-0-9-centos home]$ pwd
/home

# 2. 绝对路径定位目录(从根目录/开始)
[chengkl4@VM-0-9-centos home]$ pwd
/home
[chengkl4@VM-0-9-centos home]$ cd /home/chengkl4/test
[chengkl4@VM-0-9-centos test]$ pwd
/home/chengkl4/test

# 3. 相对路径定位目录(相对于当前工作目录)
[chengkl4@VM-0-9-centos test]$ pwd
/home/chengkl4/test
[chengkl4@VM-0-9-centos test]$ cd ../temp/
[chengkl4@VM-0-9-centos temp]$ pwd
/home/chengkl4/temp

# 4. 家目录说明:新建用户会在/home下创建以用户名命名的家目录
# root用户家目录为/root(系统内置)
[chengkl4@VM-0-9-centos temp]$ ls /home
bss gaobo luojie chengkl4 wudu

# 5. 快速进入自己的家目录(~代表家目录)
[chengkl4@VM-0-9-centos test]$ whoami
chengkl4
[chengkl4@VM-0-9-centos test]$ pwd
/home/chengkl4/test
[chengkl4@VM-0-9-centos test]$ cd ~
[chengkl4@VM-0-9-centos ~]$ pwd
/home/chengkl4

# 6. 返回到最近访问的目录(-代表上一次所在目录)
[chengkl4@VM-0-9-centos ~]$ pwd # 当前在/home/chengkl4目录下
/home/chengkl4
[chengkl4@VM-0-9-centos ~]$ cd / # 进入根目录
[chengkl4@VM-0-9-centos /]$ pwd
/
[chengkl4@VM-0-9-centos /]$ cd - # 回退到最近一次所处目录:/home/chengkl4
/home/chengkl4
[chengkl4@VM-0-9-centos ~]$ pwd
/home/chengkl4
[chengkl4@VM-0-9-centos ~]$ cd - # 再次回退到上一次所处目录:/
/
[chengkl4@VM-0-9-centos /]$ pwd
/
[chengkl4@VM-0-9-centos /]$ cd - # 循环回退
/home/chengkl4
[chengkl4@VM-0-9-centos ~]$ pwd
/home/chengkl4

8.4 touch 指令

语法:

bash 复制代码
touch [选项]... ⽂件... 

功能:
touch 命令参数可更改文档或目录的日期时间,包括存取时间和更改时间,或者新建一个不存在的文件。

常用选项:

  • -a : change only the access time
  • -c : change only the modification time
bash 复制代码
#创建普通文件
[chengkl4@VM-0-9-centos ~]$ ls
dir file.txt
[chengkl4@VM-0-9-centos ~]$ touch newFile.txt
[chengkl4@VM-0-9-centos ~]$ ls
dir file.txt newFile.txt

#查看文件时间
[chengkl4@VM-0-9-centos ~]$ stat newFile.txt
  File: 'newFile.txt'
  Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d    Inode: 1844719     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1003/  chengkl4)   Gid: ( 1003/  chengkl4)
Access: 2023-01-11 15:06:45.832787572 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:06:45.832787572 +0800
 Birth: -

#修改文件access时间
[chengkl4@VM-0-9-centos ~]$ touch -a newFile.txt
[chengkl4@VM-0-9-centos ~]$ stat newFile.txt
  File: 'newFile.txt'
  Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d    Inode: 1844719     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1003/  chengkl4)   Gid: ( 1003/  chengkl4)
Access: 2023-01-11 15:07:00.062846804 +0800
Modify: 2023-01-11 15:06:45.832787572 +0800
Change: 2023-01-11 15:07:00.062846804 +0800  # 该时间为何会变化?
 Birth: -

#修改文件modify时间
[chengkl4@VM-0-9-centos ~]$ touch -m newFile.txt
[chengkl4@VM-0-9-centos ~]$ stat newFile.txt
  File: 'newFile.txt'
  Size: 0          Blocks: 0          IO Block: 4096   regular empty file
Device: fd01h/64769d    Inode: 1844719     Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1003/  chengkl4)   Gid: ( 1003/  chengkl4)
Access: 2023-01-11 15:07:00.062846804 +0800
Modify: 2023-01-11 15:09:19.428426903 +0800
Change: 2023-01-11 15:09:19.428426903 +0800
 Birth: -

#注:更多相关讲解,会在基础IO部分统一说明。

8.5 mkdir 指令

语法:

bash 复制代码
mkdir [选项] dirname...

功能:

在当前目录下创建⼀个名为 "dirname" 的目录

常用选项:

  • -p / --parents :可以是一个路径名称。此时若路径中的某些目录尚不存在,加上此选项后,系统将自动建立好那些尚不存在的目录,即一次可以建立多个目录
bash 复制代码
#创建普通空目录
[chengkl4@VM-0-9-centos ~]$ ls -l
total 4
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
[chengkl4@VM-0-9-centos ~]$ mkdir mydir
[chengkl4@VM-0-9-centos ~]$ ls -l
total 8
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt

#递归创建多个目录(指定路径)
[chengkl4@VM-0-9-centos ~]$ mkdir -p path1/path2/path3/path4
[chengkl4@VM-0-9-centos ~]$ ls -l
total 12
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:16 path1
[chengkl4@VM-0-9-centos ~]$ tree path1
path1
└── path2
    └── path3
        └── path4

# tree命令是⼀个递归以树状结构显⽰指定⽬录的命令,如果没有安装 
# 如果当前⽤⼾是root: yum install -y tree (因为现在开始⽤的都是root,所以推荐这个⽤法) 
# 如果当前⽤⼾是普通⽤⼾: sudo yum install -y tree (后⾯讲讲完vim,⼤家才能将⾃⼰添加到系统信任列表中,暂时普通用户⽆法使用sudo)

8.6 rmdir 指令

rmdir 是⼀个与 mkdir 相对应的命令,mkdir 是建立目录,而 rmdir 是删除命令

语法:

bash 复制代码
rmdir [-p] [dirName]

适用对象:具有当前目录操作权限的所有使用者

功能:

删除空目录

常用选项:

  • -p 当子目录被删除后如果父目录也变成空目录的话,就连带父目录一起删除。

举例:

bash 复制代码
#删除空目录
[chengkl4@VM-0-9-centos ~]$ ll
total 12
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 15:15 mydir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:16 path1
[chengkl4@VM-0-9-centos ~]$ tree mydir/
mydir/
0 directories, 0 files
[chengkl4@VM-0-9-centos ~]$ rmdir mydir
[chengkl4@VM-0-9-centos ~]$ ll
total 8
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:16 path1

#递归删除空路径
[chengkl4@VM-0-9-centos ~]$ tree path1
path1
└── path2
    └── path3
        └── path4
3 directories, 0 files
[chengkl4@VM-0-9-centos ~]$ rmdir -p path1/path2/path3/path4
[chengkl4@VM-0-9-centos ~]$ ll
total 4
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt

#注意非空路径无法删除

[chengkl4@VM-0-9-centos ~]$ rmdir -p path1/path2/path3
rmdir: failed to remove 'path1/path2/path3': Directory not empty
[chengkl4@VM-0-9-centos ~]$ touch path1/myfile.txt
[chengkl4@VM-0-9-centos ~]$ touch path1/path2/myfile.txt
[chengkl4@VM-0-9-centos ~]$ tree path1/
path1/
├── myfile.txt
└── path2
    ├── myfile.txt
    └── path3
        └── path4
3 directories, 2 files
[chengkl4@VM-0-9-centos ~]$ rmdir -p path1/path2/path3/path4
rmdir: failed to remove directory 'path1/path2': Directory not empty

8.7 rm 指令

rm 命令可以同时删除文件或目录

语法:

bash 复制代码
 rm [-f-i-r-v] [dirName/dir]

适用对象:所有使用者

功能:

删除文件或目录

常用选项:

  • -f 即使文件属性为只读(即写保护),亦直接删除

  • -i 删除前逐一询问确认

  • -r 删除目录及其下所有文件

举例:

bash 复制代码
#删除普通文件
[chengkl4@VM-0-9-centos ~]$ ll
total 8
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:26 path1
[chengkl4@VM-0-9-centos ~]$ rm file.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 8
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:26 path1

#删除目录文件(-r参数)
[chengkl4@VM-0-9-centos ~]$ ll
total 8
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 14:22 file.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:26 path1
[chengkl4@VM-0-9-centos ~]$ rm file.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 8
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 14:22 dir
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:26 path1

#删除普通文件前询问(-i 参数)
[chengkl4@VM-0-9-centos ~]$ ll
total 4
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:09 newFile.txt
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:26 path1
[chengkl4@VM-0-9-centos ~]$ rm -i newFile.txt
rm: remove regular empty file 'newFile.txt'? y
[chengkl4@VM-0-9-centos ~]$ ll
total 4
drwxrwxr-x 3 chengkl4 chengkl4 4096 Jan 11 15:26 path1

#删除目录前询问(-ri 参数)
[chengkl4@VM-0-9-centos ~]$ mkdir -p d/d/d/d
[chengkl4@VM-0-9-centos ~]$ tree d
d
└── d
    └── d
        └── d
3 directories, 0 files
[chengkl4@VM-0-9-centos ~]$ rm -ri d
rm: descend into directory 'd'? y
rm: descend into directory 'd/d'? y
rm: descend into directory 'd/d/d'? y
rm: remove directory 'd/d/d/d'? y
rm: remove directory 'd/d/d'? y
rm: remove directory 'd/d'? y
rm: remove directory 'd'? y
[chengkl4@VM-0-9-centos ~]$ ll
total 0

#递归强制删除非空目录
[chengkl4@VM-0-9-centos ~]$ tree path1/
path1/
├── myfile.txt
└── path2
    └── myfile.txt
1 directory, 2 files
[chengkl4@VM-0-9-centos ~]$ rm -f path1
rm: cannot remove 'path1': Is a directory
[chengkl4@VM-0-9-centos ~]$ rm -rf path1
[chengkl4@VM-0-9-centos ~]$ ll
total 0

8.8 man 指令

Linux 的命令有很多参数,我们不可能全记住,可以通过查看联机手册获取帮助

语法:

bash 复制代码
man [选项] 命令 

常用选项:

  • -k 根据关键字搜索联机帮助

  • num 只在第 num 章节查找

  • -a 将所有章节的都显示出来,比如 man printf 它缺省从第一章开始搜索,知道就停止,用 a 选项,当按下 q 退出,他会继续往后面搜索,直到所有章节都搜索完毕

man 手册分为 9 章(不同系统可能会有差别)

  • 1 是普通的命令

  • 2 是系统调用,如 open ,write 之类的(通过这个,至少可以很方便的查到调用这个函数,需要加什么头文件)

  • 3 是库函数,如 printf,fread4 是特殊文件,也就是 /dev 下的各种设备文件

  • 4 略

  • 5 是指文件的格式,比如 passwd ,就会说明这个文件中各个字段的含义

  • 6 是给游戏留的,由各个游戏自己定义

  • 7 是附件还有⼀些变量,比如像 environ 这种全局变量在这里就有说明

  • 8 是系统管理用的命令,这些命令只能由 root 使用,如 ifconfig

  • 9 略

bash 复制代码
# 示例1:查看printf指令(printf也是一个命令)
[chengkl4@VM-0-9-centos ~]$ man printf
# 示例2:查看fork系统调用(默认无该指令,man自动去2号手册查找)
[chengkl4@VM-0-9-centos ~]$ man fork
# 示例3:指定2章查看fork系统调用(修正原命令拼写错误frok→fork)
[chengkl4@VM-0-9-centos ~]$ man 2 fork
# 示例4:指定3章查看printf的C库函数帮助
[chengkl4@VM-0-9-centos ~]$ man 3 printf
# 示例5:指定7章查看signal变量帮助
[chengkl4@VM-0-9-centos ~]$ man 7 signal
# 示例6:查看environ变量帮助(默认从7章查找)
[chengkl4@VM-0-9-centos ~]$ man 7 environ
# 示例7:查看man手册自身的帮助
[chengkl4@VM-0-9-centos ~]$ man man

8.9 cp 指令

语法:

bash 复制代码
cp [选项] 源⽂件或⽬录 ⽬标⽂件或⽬录

功能:

复制文件或目录

说明:

  • cp 指令用于复制文件或目录

  • 如同时指定两个以上的文件或目录,且最后的目的地是一个已经存在的目录,则它会把前面指定的所有文件或目录复制到此目录中

常用选项:

  • -f 或 --force 强行复制文件或目录,不论目标文件或目录是否已经存在

  • -i 或 --interactive 覆盖文件之前先询问用户

  • -r 递归处理,将指定目录下的文件与子目录⼀并处理。若源文件或目录的形态,不属于目录或符号链接,则一律视为普通文件处理

举例:

bash 复制代码
#复制普通文件
[chengkl4@VM-0-9-centos ~]$ echo "hello linux">myfile.txt
[chengkl4@VM-0-9-centos ~]$ cat myfile.txt
hello linux
[chengkl4@VM-0-9-centos ~]$ ll
total 4
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile.txt
[chengkl4@VM-0-9-centos ~]$ cp myfile.txt myfile-backup.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 8
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile.txt
[chengkl4@VM-0-9-centos ~]$ cat myfile-backup.txt
hello linux

#将多个文件拷贝到指定路径下(通配符使用)
[chengkl4@VM-0-9-centos ~]$ ll
total 8
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile.txt
[chengkl4@VM-0-9-centos ~]$ mkdir dir
[chengkl4@VM-0-9-centos ~]$ ll
total 12
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile.txt
[chengkl4@VM-0-9-centos ~]$ cp *.txt dir  # *表示通配符,匹配所有.txt结尾的文件名
[chengkl4@VM-0-9-centos ~]$ ll
total 12
drwxrwxr-x 2 chengkl4 chengkl4 4096 Jan 11 15:48 dir
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile-backup.txt
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 11 15:47 myfile.txt
[chengkl4@VM-0-9-centos ~]$ tree dir
dir
├── myfile-backup.txt
└── myfile.txt

#目标文件存在时直接覆盖
[chengkl4@VM-0-9-centos ~]$ echo "hello bite tech" > myfile.txt
[chengkl4@VM-0-9-centos ~]$ cat myfile.txt
hello bite tech
[chengkl4@VM-0-9-centos ~]$ cp myfile.txt myfile-backup.txt
[chengkl4@VM-0-9-centos ~]$ cat myfile-backup.txt
hello bite tech

#复制前询问(i参数)
[chengkl4@VM-0-9-centos ~]$ echo "hello bite tech" > myfile.txt
[chengkl4@VM-0-9-centos ~]$ cat myfile.txt
hello bite tech
[chengkl4@VM-0-9-centos ~]$ cp myfile.txt myfile-backup.txt
[chengkl4@VM-0-9-centos ~]$ cat myfile-backup.txt
hello bite tech

#递归强制复制整个目录(-rf参数)
[chengkl4@VM-0-9-centos ~]$ tree test
test
├── dir
│   ├── myfile-backup.txt
│   └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files
[chengkl4@VM-0-9-centos ~]$ cp -rf test test-backup
[chengkl4@VM-0-9-centos ~]$ tree test-backup
test-backup
├── dir
│   ├── myfile-backup.txt
│   └── myfile.txt
├── myfile-backup.txt
└── myfile.txt
1 directory, 4 files

8.10 mv 指令

mv 命令是 move 的缩写,可以用来移动文件或者将文件改名(move (rename) files,经常用来备份文件或者目录

语法:

bash 复制代码
mv [选项] 源文件或目录 目标文件或目录 

功能:

  1. mv 命令中第二个参数类型的不同(是目标文件还是目标目录),mv 命令将文件重命名或将其移至⼀个新的目录中。

  2. 当第二个参数类型是文件时,mv 命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。

  3. 当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv 命令将各参数指定的源文件均移至目标目录中。

常用选项:

  • -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖

  • -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

举例:

bash 复制代码
#更改文件名称(基础用法)
[chengkl4@VM-0-9-centos ~]$ touch myfile.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:56 myfile.txt
[chengkl4@VM-0-9-centos ~]$ mv myfile.txt yourfile.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:56 yourfile.txt

#同名文件存在时,改名即覆盖(默认行为)
[chengkl4@VM-0-9-centos ~]$ touch myfile.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:58 myfile.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:57 yourfile.txt
[chengkl4@VM-0-9-centos ~]$ mv yourfile.txt myfile.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:57 myfile.txt

#改名前询问(-i参数)
[chengkl4@VM-0-9-centos ~]$ touch yourfile.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:57 myfile.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:59 yourfile.txt
[chengkl4@VM-0-9-centos ~]$ mv -i yourfile.txt myfile.txt
mv: overwrite 'myfile.txt'? y
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:59 myfile.txt

#移动文件/目录(mv核心功能拓展)
[chengkl4@VM-0-9-centos ~]$ touch yourfile.txt
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:57 myfile.txt
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:59 yourfile.txt
[chengkl4@VM-0-9-centos ~]$ mv -i yourfile.txt myfile.txt
mv: overwrite 'myfile.txt'? y
[chengkl4@VM-0-9-centos ~]$ ll
total 0
-rw-rw-r-- 1 chengkl4 chengkl4 0 Jan 11 15:59 myfile.txt

8.11 cat 指令

语法:

bash 复制代码
cat [选项] [⽂件]

功能:

查看目标文件的内容

常用选项:

  • -b 对非空输出行编号,空行不做编号
  • -n 对输出的所有行编号
  • -s 不输出多行空行

举例:

bash 复制代码
#命令行构建多行文本(配合重定向)
[chengkl4@VM-0-9-centos ~]$ cnt=0; while [ $cnt -le 20 ]; do echo "hello linux"; let cnt++; done > temp.txt

#查看文本内容(cat基本用法)

[chengkl4@VM-0-9-centos ~]$ cat temp.txt
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux

#输出携带行号(-b参数,仅非空行编号)
[chengkl4@VM-0-9-centos ~]$ cat -b temp.txt
 1  hello linux
 2  hello linux
 3  hello linux
 4  hello linux
 5  hello linux
 6  hello linux
 7  hello linux

#测试-b参数对非空行编号(文件含多行空行)
# 修改temp.txt,使其携带多行空行(使用vim编辑)
[chengkl4@VM-0-9-centos ~]$ vim temp.txt
# 测试-b参数,仅对非空行编号
[chengkl4@VM-0-9-centos ~]$ cat -b temp.txt
 1  hello linux
 2  hello linux
 3  hello linux


 
 4  hello linux
 5  hello linux
 6  hello linux
 7  hello linux

#11.3.5 测试-n参数(对所有行编号,包括空行)
[chengkl4@VM-0-9-centos ~]$ cat -n temp.txt
 1  hello linux
 2  hello linux
 3  hello linux
 4  
 5  
 6  
 7  hello linux
 8  hello linux
 9  
10  hello linux
11  hello linux

#测试-s参数(压缩多行行空行为一行)
[chengkl4@VM-0-9-centos ~]$ cat -s temp.txt
hello linux
hello linux
hello linux

hello linux
hello linux
hello linux
hello linux

8.12 more 指令

语法:

bash 复制代码
 more [选项]

功能:

more 命令,功能类似 cat

常用选项:

  • -n 指定输出行数

  • q 退出 more

举例:

bash 复制代码
#指定每页输出行数(-n参数)
[chengkl4@VM-0-9-centos ~]$ more -10 temp.txt
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
hello linux
--More--(0%)

8.13 less 指令

less 工具是 Linux 系统中正统的文件内容分页显示工具,功能比 more 更强大、更灵活。与 more 仅能向前浏览不同,

less 支持前后自由翻页,且在查看文件前不会加载整个文件,适合浏览大文件,同时具备丰富的搜索功能。

语法格式:

bash 复制代码
less [参数] 文件

核心功能:

  • 与more类似,可分页显示文件或其他输出内容;

  • 支持自由浏览:可通过PageUp、PageDown等按键向前、向后翻看文件,操作更灵活;

  • 高效加载:查看文件前不会加载整个文件,打开大文件速度更快;

  • 丰富搜索:支持向下、向上搜索字符串,且可重复搜索或反向重复搜索。

常用选项与交互操作:

less 的操作分为"命令选项"(执行命令时添加)和"交互操作"(打开文件后按键操作),核心常用项如下:

  • -i:忽略搜索时的大小写(命令选项);

  • -N:显示每一行的行号(命令选项);

  • /字符串:向下搜索"字符串"(交互操作,打开文件后使用);

  • ?字符串:向上搜索"字符串"(交互操作,打开文件后使用);

  • n:重复前一个搜索(与/或?有关,交互操作);

  • N:反向重复前一个搜索(与/或?有关,交互操作);

  • q:退出less浏览模式(交互操作,打开文件后使用);

  • PageUp:向上翻一页(交互操作);

  • PageDown:向下翻一页(交互操作);

  • Enter键:向下翻一行(交互操作);

  • b键:向上翻一页(交互操作,同PageUp);

  • 空格键:向下翻一页(交互操作,同PageDown)。

实操举例:

bash 复制代码
# 示例1:基础用法,分页查看文件内容
[chengkl4@VM-0-9-centos ~]$ less temp.txt
# 打开后可通过PageUp/PageDown翻页,q键退出

# 示例2:显示行号查看文件(-N选项)
[chengkl4@VM-0-9-centos ~]$ less -N temp.txt

# 示例3:忽略大小写搜索(-i选项+向下搜索)
[chengkl4@VM-0-9-centos ~]$ less -i temp.txt
# 打开后输入 /HELLO (忽略大小写,等价于搜索hello),按Enter执行搜索

# 示例4:向上搜索字符串
[chengkl4@VM-0-9-centos ~]$ less temp.txt
# 打开后输入 ?bite ,按Enter向上搜索"bite"字符串

# 示例5:重复搜索与反向重复搜索
[chengkl4@VM-0-9-centos ~]$ less temp.txt
# 1. 输入 /hello 向下搜索,按Enter定位第一个匹配项
# 2. 按n键,重复向下搜索下一个匹配项
# 3. 按N键,反向向上搜索上一个匹配项

# 示例6:结合重定向查看命令输出(less也可查看其他命令的输出内容)
[chengkl4@VM-0-9-centos ~]$ ls -l /etc | less
# 分页查看/etc目录下的文件列表,支持翻页和搜索

8.14 head 指令

head 指令与 tail 指令是 Linux 系统中常用的文件内容截取工具,功能浅显易懂, head 专门用于显示文件开头的部分内容,

默认情况下会打印文件的前 10 行,可通过参数自定义显示行数,操作简洁高效。

语法格式:

bash 复制代码
head [参数]... [文件]...

核心功能:

  • 显示文件开头部分内容至标准输出;

  • 默认打印文件前10行内容,可通过参数指定具体显示行数;

  • 支持同时处理多个文件,分别显示每个文件的开头内容。

常用选项:

  • -n<行数> 或 --lines=<行数>:指定要显示的行数,<行数>为正整数(如-n5表示显示前5行,也可简写为-5);

  • -v 或 --verbose:显示文件名(当处理多个文件时,会在每个文件内容前标注文件名,便于区分);

  • -q 或 --quiet 或 --silent:不显示文件名(当处理多个文件时,仅显示内容,不标注文件名,默认无此选项时处理多个文件会显示文件名)。

实操举例:

bash 复制代码
# 示例1:默认用法,显示文件前10行内容
[chengkl4@VM-0-9-centos ~]$ head temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4
hello 5
hello 6
hello 7
hello 8
hello 9

# 示例2:指定显示前5行内容(-n5写法)
[chengkl4@VM-0-9-centos ~]$ head -n5 temp.txt
hello 0
hello 1
hello 2
hello 3
hello 4

# 示例3:指定显示前3行内容(简写为-3,等价于-n3)
[chengkl4@VM-0-9-centos ~]$ head -3 temp.txt
hello 0
hello 1
hello 2

# 示例4:处理多个文件,显示每个文件前2行(默认显示文件名)
[chengkl4@VM-0-9-centos ~]$ touch test1.txt test2.txt
[chengkl4@VM-0-9-centos ~]$ echo -e "test1 line1\ntest1 line2\ntest1 line3" > test1.txt
[chengkl4@VM-0-9-centos ~]$ echo -e "test2 line1\ntest2 line2\ntest2 line3" > test2.txt
[chengkl4@VM-0-9-centos ~]$ head -n2 test1.txt test2.txt
==> test1.txt <==
test1 line1
test1 line2

==> test2.txt <==
test2 line1
test2 line2

# 示例5:处理多个文件,不显示文件名(-q选项)
[chengkl4@VM-0-9-centos ~]$ head -q -n2 test1.txt test2.txt
test1 line1
test1 line2
test2 line1
test2 line2

# 示例6:强制显示文件名(-v选项,单个文件也会显示)
[chengkl4@VM-0-9-centos ~]$ head -v -n2 temp.txt
==> temp.txt <==
hello 0
hello 1

8.15 tail 指令

tail 指令与 head 指令对应,是 Linux 系统中核心的文件内容截取工具,专门用于显示文件末尾的部分内容。

其最常用的场景是查看实时更新的日志文件,通过循环读取功能可实时监控文件内容变化,操作简洁且实用性极强。

语法格式:

bash 复制代码
tail 必要参数 [文件]

核心功能:

  • 显示指定文件末尾的内容,不指定文件时,可处理输入信息并显示末尾部分;

  • 默认打印文件最后10行内容,可通过参数自定义显示行数;

  • 支持循环读取文件(实时监控),适合查看正在动态更新的日志文件等场景;

  • 支持同时处理多个文件,分别显示每个文件的末尾内容。

常用选项:

  • -n<行数> 或 --lines=<行数>:指定要显示的末尾行数,<行数>为正整数(如-n5表示显示最后5行,也可简写为-5;若行数前加"+",表示从第n行开始显示到文件末尾);

  • -f 或 --follow:循环读取文件内容,实时监控文件变化,文件更新时会自动刷新显示最新内容(需按Ctrl+C退出循环);

  • -F:等价于"-f -r"(部分系统支持),不仅循环读取,还会监测文件是否被删除或重命名,若文件重建会自动重新连接并读取;

  • -v 或 --verbose:显示文件名(处理多个文件时,在每个文件内容前标注文件名,便于区分);

  • -q 或 --quiet 或 --silent:不显示文件名(处理多个文件时,仅显示内容,不标注文件名)。

实操举例:

bash 复制代码
# 示例1:默认用法,显示文件最后10行内容
[chengkl4@VM-0-9-centos ~]$ tail temp.txt
hello 1991
hello 1992
hello 1993
hello 1994
hello 1995
hello 1996
hello 1997
hello 1998
hello 1999
hello 2000

# 示例2:指定显示最后5行内容(-n5写法)
[chengkl4@VM-0-9-centos ~]$ tail -n5 temp.txt
hello 1996
hello 1997
hello 1998
hello 1999
hello 2000

# 示例3:指定显示最后3行内容(简写为-3,等价于-n3)
[chengkl4@VM-0-9-centos ~]$ tail -3 temp.txt
hello 1998
hello 1999
hello 2000

# 示例4:从第1998行开始显示到文件末尾(-n+行数写法)
[chengkl4@VM-0-9-centos ~]$ tail -n+1998 temp.txt
hello 1997
hello 1998
hello 1999
hello 2000

# 示例5:处理多个文件,显示每个文件最后2行(默认显示文件名)
[chengkl4@VM-0-9-centos ~]$ tail -n2 test1.txt test2.txt
==> test1.txt <==
test1 line2
test1 line3

==> test2.txt <==
test2 line2
test2 line3

# 示例6:循环读取(实时监控文件),适合查看日志
[chengkl4@VM-0-9-centos ~]$ touch log.txt
# 打开另一个终端,持续向log.txt写入内容(模拟日志更新)
[chengkl4@VM-0-9-centos ~]$ while true; do echo "`date`: 系统正常运行"; sleep 1; done >> log.txt
# 本终端执行tail -f监控日志
[chengkl4@VM-0-9-centos ~]$ tail -f log.txt
Fri Jan 11 18:30:00 CST 2023: 系统正常运行
Fri Jan 11 18:30:01 CST 2023: 系统正常运行
Fri Jan 11 18:30:02 CST 2023: 系统正常运行
# 按Ctrl+C退出循环读取

# 示例7:强制显示文件名(-v选项,单个文件也会显示)
[chengkl4@VM-0-9-centos ~]$ tail -v -n2 temp.txt
==> temp.txt <==
hello 1999
hello 2000

8.16 date 指令

date 指令是 Linux 系统中核心的时间操作命令,主要用于显示当前系统时间、按指定格式输出时间,同时支持 root 用户设定系统时间,还可实现时间与 Unix 时间戳的相互转换,是日常运维和脚本编写中的常用工具。

语法格式:

bash 复制代码
date [OPTION]... [+FORMAT]

说明:无选项和格式时,默认显示当前系统的完整时间(包括星期、日期、时间、时区);+FORMAT 用于指定时间显示格式,

格式标记需紧跟加号;OPTION 主要用于设置时间等操作。

核心功能:

  • 显示当前系统时间,支持自定义显示格式;

  • root用户可设定系统时间(日期、具体时分秒,或完整时间);

  • 实现时间与Unix时间戳的相互转换(时间戳为1970年1月1日UTC午夜至今的秒数)。

常用格式标记(显示时间用):

设定显示格式时,需在标记前加"+",常用核心标记如下

  • %H:小时(00...23,24小时制);

  • %M:分钟(00...59);

  • %S:秒(00...61,预留闰秒空间);

  • %X:等价于 %H:%M:%S(完整时分秒格式);

  • %d:日(01...31,补零显示);

  • %m:月份(01...12,补零显示);

  • %Y:完整年份(0000...9999,如2026);

  • %F:等价于 %Y-%m-%d(标准日期格式,如2026-01-23);

  • %s:Unix时间戳(从1970-01-01 00:00:00 UTC至今的秒数)。

常用选项(设置时间与时间戳转换用):

  • -s 或 --set=STRING:设置系统时间,仅root用户有权限,普通用户只能查看;

  • -d 或 --date=STRING:显示指定字符串对应的时间,常用于时间戳转换(时间戳前加"@")。

实操举例:

bash 复制代码
#按默认格式显示当前时间
# 普通用户和root用户均可执行
[chengkl4@VM-0-9-centos ~]$ date
Fri Jan 23 15:30:00 CST 2026  # 格式:星期 月 日 时:分:秒 时区 年份

#按指定格式显示时间(核心用法)

# 示例1:显示完整年份:月份:日期(用户指定格式)
[chengkl4@VM-0-9-centos ~]$ date +%Y:%m:%d
2026:01:23

# 示例2:显示标准日期格式(%F等价于%Y-%m-%d)
[chengkl4@VM-0-9-centos ~]$ date +%F
2026-01-23

# 示例3:显示完整时分秒(%X等价于%H:%M:%S)
[chengkl4@VM-0-9-centos ~]$ date +%X
15:32:18

# 示例4:组合格式(日期+时间,中间用空格分隔)
[chengkl4@VM-0-9-centos ~]$ date +%Y-%m-%d\ %H:%M:%S  # 空格前加\转义,避免被解析为分隔符
2026-01-23 15:33:45

# 示例5:组合格式(简洁写法,%F+%X)
[chengkl4@VM-0-9-centos ~]$ date +%F\ %X
2026-01-23 15:34:20

8.17 cal 指令

cal 指令是 Linux 系统中用于显示公历(阳历)日历的工具,公历又称格列历、西历,是国际通用历法,以地球绕太阳一周为一年。

通过 cal 指令可快速查看当前月、指定月/年、全年的日历,还能显示日期在当年的天数等信息,操作简单直观。

语法格式:

cal 参数 [年份]

说明:参数为可选,年份/月份参数需符合以下规则:

  • 无参数无年份:默认显示当前月份的日历;

  • 仅 1 个参数(数字):若参数为 1 - 9999,显示该年份的全年日历;

  • 2 个参数(数字,顺序:月份 年份):显示指定年份指定月份的日历(月份需为 1 - 12,年份需为 1 - 9999 )。

核心功能:

  • 显示当前月份、指定月份或指定年份的公历日历;

  • 显示指定日期在当年中的天数(从 1 月 1 日算起);

  • 同时显示前一个月、当前月、下一个月的日历,便于日期对照。

常用选项:

  • -3:显示系统前一个月、当前月、下一个月的月历,三页日历同时展示,便于跨月日期查看;

  • -j:显示日期在当年中的第几天(从1月1日算起,默认显示当前月各日期对应的天数,配合其他参数可显示指定月/年的天数);

  • -y:显示当前年份的完整日历,12个月份按顺序展示。

实操举例:

bash 复制代码
# 示例1:无参数无年份,默认显示当前月份日历
[chengkl4@VM-0-9-centos ~]$ cal
    January 2026
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31

# 示例2:-y选项,显示当前年份(2026年)完整日历
[chengkl4@VM-0-9-centos ~]$ cal -y
                               2026

    January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
       1  2  3  4  5                  1  2                  1  2
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   3  4  5  6  7  8  9
13 14 15 16 17 18 19  10 11 12 13 14 15 16  10 11 12 13 14 15 16
20 21 22 23 24 25 26  17 18 19 20 21 22 23  17 18 19 20 21 22 23
27 28 29 30 31        24 25 26 27 28        24 25 26 27 28 29 30
                                            31

    April                  May                   June
...  # 后续月份日历省略,实际执行会显示完整12个月

# 示例3:-3选项,显示前一月、当前月、下一月日历(2025年12月、2026年1月、2026年2月)
[chengkl4@VM-0-9-centos ~]$ cal -3
    December 2025          January 2026          February 2026
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4         1  2  3  4  5                  1  2
 5  6  7  8  9 10 11   6  7  8  9 10 11 12   3  4  5  6  7  8  9
12 13 14 15 16 17 18  13 14 15 16 17 18 19  10 11 12 13 14 15 16
19 20 21 22 23 24 25  20 21 22 23 24 25 26  17 18 19 20 21 22 23
26 27 28 29 30 31     27 28 29 30 31        24 25 26 27 28

# 示例4:-j选项,显示当前月日期在当年的天数
[chengkl4@VM-0-9-centos ~]$ cal -j
    January 2026
Su Mo Tu We Th Fr Sa
       1  2  3  4  5
 6  7  8  9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
# 说明:1月1日对应当年第1天,1月2日对应第2天,以此类推,1月23日对应第23天

# 示例5:显示指定年份(2025年)的日历(仅1个参数,为年份)
[chengkl4@VM-0-9-centos ~]$ cal 2025
                               2025

    January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
          1  2  3  4                     1   1  2  3  4  5  6  7
 5  6  7  8  9 10 11   2  3  4  5  6  7  8   8  9 10 11 12 13 14
...  # 后续月份日历省略

# 示例6:显示指定月份和年份(2026年6月)的日历(2个参数,月份 年份)
[chengkl4@VM-0-9-centos ~]$ cal 6 2026
     June 2026
Su Mo Tu We Th Fr Sa
          1  2  3  4
 5  6  7  8  9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

# 示例7:组合选项(-j+y),显示当前年份完整日历并标注各日期当年天数
[chengkl4@VM-0-9-centos ~]$ cal -jy
                               2026

    January               February               March
Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa  Su Mo Tu We Th Fr Sa
       1  2  3  4  5                  1  2                  1  2
 6  7  8  9 10 11 12   3  4  5  6  7  8  9   3  4  5  6  7  8  9
...  # 各日期对应当年天数同步显示

#root用户设置系统时间(需切换root权限)

# 先切换到root用户(普通用户无权限设置)
[chengkl4@VM-0-9-centos ~]$ su root
Password:  # 输入root密码(输入时不显示)

# 示例1:设置仅日期(时间默认为00:00:00)
[root@VM-0-9-centos ~]# date -s 20260123
Fri Jan 23 00:00:00 CST 2026

# 示例2:设置仅时间(日期不变)
[root@VM-0-9-centos ~]# date -s 15:40:00
Fri Jan 23 15:40:00 CST 2026

# 示例3:设置完整时间(日期+时间,多种写法均可)
[root@VM-0-9-centos ~]# date -s "2026-01-23 15:45:00"
Fri Jan 23 15:45:00 CST 2026
[root@VM-0-9-centos ~]# date -s "20260123 15:46:00"
Fri Jan 23 15:46:00 CST 2026
[root@VM-0-9-centos ~]# date -s "15:47:00 2026-01-23"
Fri Jan 23 15:47:00 CST 2026

# 设置完成后,验证时间
[root@VM-0-9-centos ~]# date +%F\ %X
2026-01-23 15:47:05

# root用户设置系统时间(需切换root权限)
# 先切换到root用户(普通用户无权限设置)
[chengkl4@VM-0-9-centos ~]$ su root
Password:  # 输入root密码(输入时不显示)

# 示例1:设置仅日期(时间默认为00:00:00)
[root@VM-0-9-centos ~]# date -s 20260123
Fri Jan 23 00:00:00 CST 2026

# 示例2:设置仅时间(日期不变)
[root@VM-0-9-centos ~]# date -s 15:40:00
Fri Jan 23 15:40:00 CST 2026

# 示例3:设置完整时间(日期+时间,多种写法均可)
[root@VM-0-9-centos ~]# date -s "2026-01-23 15:45:00"
Fri Jan 23 15:45:00 CST 2026
[root@VM-0-9-centos ~]# date -s "20260123 15:46:00"
Fri Jan 23 15:46:00 CST 2026
[root@VM-0-9-centos ~]# date -s "15:47:00 2026-01-23"
Fri Jan 23 15:47:00 CST 2026

# 设置完成后,验证时间
[root@VM-0-9-centos ~]# date +%F\ %X
2026-01-23 15:47:05

#时间与时间戳相互转换
# 示例1:当前时间 -> Unix时间戳(%s标记)
[chengkl4@VM-0-9-centos ~]$ date +%s
1779835820  # 输出为时间戳(秒数,随当前时间变化)

# 示例2:时间戳 -> 时间(-d@时间戳,@不可省略)
[chengkl4@VM-0-9-centos ~]$ date -d@1779835820
Fri Jan 23 15:50:20 CST 2026

# 示例3:时间戳 -> 指定格式的时间(结合格式标记)
[chengkl4@VM-0-9-centos ~]$ date -d@1779835820 +%F\ %X
2026-01-23 15:50:20

8.18 find 指令

find 指令是 Linux 系统中功能强大的文件搜索工具,可在指定目录结构(文件树)中遍历查找文件/目录,

并对找到的目标执行指定操作。该命令支持多种查找条件,适配各类搜索场景,即使在网络文件系统(NFS)中,

只要具备相应权限也能正常使用。由于遍历大文件系统(30G以上)可能耗时较长,通常建议将消耗资源较多的 find 命令,

放在后台执行。

语法:

find pathname -options [动作]

说明:

  • pathname:必填参数,指定查找的路径。"." 表示当前目录,"/" 表示根目录,也可指定具体路径(如/home/chengkl4);

  • -options:可选参数,查找条件(如按文件名、大小、时间等查找),是find命令的核心;

  • 动作\]:可选参数,对找到的文件/目录执行的操作(如删除、查看详情等),默认动作是输出找到的目标路径。

  • 在指定路径及其子目录(文件树)中递归查找文件/目录;

  • 支持多维度查找条件(文件名、大小、修改时间、权限、所有者等),可组合使用;

  • 对查找结果执行自定义操作(删除、复制、查看属性等);

  • 兼容本地文件系统和网络文件系统(NFS),权限足够即可正常使用。

选项:

find 命令选项繁多,以下先介绍最常用的核心选项,重点掌握按文件名查找,其他常用选项后续补充:

  • -name "文件名":按照文件名精确查找,支持通配符(*、?、[]等),文件名需用引号包裹;

  • -iname "文件名":按文件名查找,忽略大小写(如查找test.txt时,Test.txt、TEST.TXT也会匹配);

  • -type 类型:按文件类型查找,常用类型:f(普通文件)、d(目录)、l(符号链接文件);

  • -size 大小:按文件大小查找,单位支持:b(字节,默认)、k(千字节)、M(兆字节)、G(吉字节),如+10M表示大于10兆,-5k表示小于5千字节,100b表示等于100字节;

  • -mtime 天数:按文件修改时间查找,天数前加+表示修改时间超过N天,加-表示不足N天,不加符号表示正好N天(如-1表示24小时内修改过的文件);

  • -user 用户名:按文件所有者查找(查找属于指定用户的文件/目录);

  • -perm 权限值:按文件权限查找(如755、644等,精确匹配权限)。

常用动作:

  • -print:默认动作,将查找结果输出到标准输出(屏幕),可省略;

  • -delete:删除找到的文件/目录(删除目录需确保目录为空,谨慎使用);

  • -exec 命令 {} ;:对每个查找结果执行指定命令,{} 表示查找结果的占位符,; 表示命令结束(如-exec ls -l {} ; 表示查看每个找到目标的详细信息);

  • -ok 命令 {} ;:与-exec类似,但执行命令前会询问用户确认,避免误操作。

实操举例:

bash 复制代码
#按文件名查找
# 示例1:在当前目录(.)下查找名为myfile.txt的普通文件(精确匹配)
[chengkl4@VM-0-9-centos ~]$ find . -name "myfile.txt" -type f
./myfile.txt  # 输出找到的文件路径

# 示例2:在当前目录下查找所有.txt结尾的文件(通配符*使用)
[chengkl4@VM-0-9-centos ~]$ find . -name "*.txt" -type f
./myfile.txt
./test1.txt
./dir/myfile-backup.txt

# 示例3:在根目录(/)下查找名为passwd的文件(需权限,可能需要root)
[chengkl4@VM-0-9-centos ~]$ su root
Password:
[root@VM-0-9-centos ~]# find / -name "passwd" -type f
/etc/passwd
/usr/bin/passwd

# 示例4:按文件名查找,忽略大小写(-iname选项)
[chengkl4@VM-0-9-centos ~]$ find . -iname "MYFILE.TXT" -type f
./myfile.txt  # 即使文件名是小写,也能匹配到

#按照文件类型查找
# 示例1:在当前目录下查找所有目录(-type d)
[chengkl4@VM-0-9-centos ~]$ find . -type d
.
./dir
./temp
./path1/path2/path3

# 示例2:在当前目录下查找所有符号链接文件(-type l)
[chengkl4@VM-0-9-centos ~]$ ln -s myfile.txt linkfile.txt  # 先创建一个符号链接
[chengkl4@VM-0-9-centos ~]$ find . -type l
./linkfile.txt

#按照文件大小查找
# 示例1:在当前目录下查找大于100字节的普通文件(-size +100b)
[chengkl4@VM-0-9-centos ~]$ find . -type f -size +100b
./largefile.txt  # 假设该文件大小为200字节

# 示例2:在当前目录下查找小于5兆(5M)的普通文件
[chengkl4@VM-0-9-centos ~]$ find . -type f -size -5M

# 示例3:在当前目录下查找大小正好为1KB的普通文件(-size 1024b 或 -size 1k)
[chengkl4@VM-0-9-centos ~]$ find . -type f -size 1k

#按照文件修改时间查找
# 示例1:在当前目录下查找24小时内(1天内)修改过的普通文件(-mtime -1)
[chengkl4@VM-0-9-centos ~]$ find . -type f -mtime -1

# 示例2:在当前目录下查找修改时间超过7天的普通文件(-mtime +7)
[chengkl4@VM-0-9-centos ~]$ find . -type f -mtime +7

# 示例3:在/var/log目录下查找3天内修改过的日志文件(.log结尾)
[root@VM-0-9-centos ~]# find /var/log -name "*.log" -type f -mtime -3

#对查找结果执行指定操作
# 示例1:查找当前目录下所有.txt文件,并查看其详细信息(-exec ls -l {} \;)
[chengkl4@VM-0-9-centos ~]$ find . -name "*.txt" -type f -exec ls -l {} \;
-rw-rw-r-- 1 chengkl4 chengkl4 22 Jan 23 15:47 ./myfile.txt
-rw-rw-r-- 1 chengkl4 chengkl4 30 Jan 23 16:00 ./test1.txt

# 示例2:查找当前目录下3天前修改的.txt文件,删除前询问确认(-ok rm {} \;)
[chengkl4@VM-0-9-centos ~]$ find . -name "*.txt" -type f -mtime +3 -ok rm {} \;
rm: remove regular file './oldfile.txt'? y  # 输入y确认删除,n取消

# 示例3:查找当前目录下所有空目录,并直接删除(-delete选项)
[chengkl4@VM-0-9-centos ~]$ find . -type d -empty -delete

#多条件组合查找
# 示例1:查找当前目录下,属于chengkl4用户、24小时内修改过的.txt文件
[chengkl4@VM-0-9-centos ~]$ find . -name "*.txt" -type f -user chengkl4 -mtime -1

# 示例2:查找当前目录下,大小在1KB到10KB之间、权限为644的普通文件
[chengkl4@VM-0-9-centos ~]$ find . -type f -size +1k -size -10k -perm 644

# 示例3:查找根目录下,不是目录、且大于100M的文件(需root权限)
[root@VM-0-9-centos ~]# find / -type f ! -size -100M  # !表示否定条件

8.19 which 指令

功能:搜索系统指定的命令

举例:

bash 复制代码
[whb@bite-alicloud test]$ which ls
alias ls='ls --color=auto'
 		/usr/bin/ls
[whb@bite-alicloud test]$ which pwd
/usr/bin/pwd

8.20 whereis 指令

功能:用于找到程序的源、二进制文件或手册

举例:

bash 复制代码
[chengkl4@VM-0-9-centos ~]$ whereis ls
ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz /usr/share/man/man1p/ls.1p.gz
[chengkl4@VM-0-9-centos ~]$ whereis libc.so
libc: /usr/lib64/libc.so /usr/lib64/libc.a /usr/share/man/man7/libc.7.gz

8.21 alias 指令

功能:设置命令的别名

举例:

bash 复制代码
[chengkl4@VM-0-9-centos ~]$ alias hello='ls -a -l -n'
[chengkl4@VM-0-9-centos ~]$ which hello
alias hello='ls -a -l -n'
 		/usr/bin/ls
[chengkl4@VM-0-9-centos ~]$ hello
total 36
drwxrwxr-x 2 1003 1003 4096 Jan 11 17:59 .
drwx------ 22 1003 1003 4096 Jan 11 17:57 ..
-rw-rw-r-- 1 1003 1003 28667 Jan 11 18:29 temp.txt

8.22 grep 指令

语法:

bash 复制代码
grep [选项] 搜寻字符串 文件

功能:

在文件中搜索字符串,将找到的行打印出来

常用选项:

  • -i :忽略大小写的不同,所以大小写视为相同

  • -n :顺便输出行号

  • -v :反向选择,亦即显示出没有 '搜寻字符串' 内容的那一行

举例:

bash 复制代码
# ⽂件内容 [chengkl4@VM-0-9-centos ~]$ cat temp.txt 
abcd
ABCD
hello
bite
1234
#基本查找 
[chengkl4@VM-0-9-centos ~]$ grep "abcd" temp.txt 
abcd
# 忽略⼤⼩写的不同,所以⼤⼩写视为相同 
[chengkl4@VM-0-9-centos ~]$ grep -i "abcd" temp.txt
abcd
ABCD
# 顺便输出⾏号 
[chengkl4@VM-0-9-centos ~]$ grep -n "abcd" temp.txt
1:abcd
[chengkl4@VM-0-9-centos ~]$ grep -ni "abcd" temp.txt
1:abcd
2:ABCD
# 反向选择,亦即显⽰出没有 '搜寻字符串' 内容的那⼀⾏ 
[chengkl4@VM-0-9-centos ~]$ grep -v "abcd" temp.txt
ABCD
hello
bite
1234
[chengkl4@VM-0-9-centos ~]$ grep -vn "abcd" temp.txt
2:ABCD
3:hello
4:bite
5:1234
[chengkl4@VM-0-9-centos ~]$ grep -vni "abcd" temp.txt
3:hello
4:bite
5:1234

8.23 top 指令

bash 复制代码
top -d 1 -n 5
-d: 刷新的时间间隔
-n: 刷新的次数
q:退出

8.24 zip/unzip 指令

语法:

bash 复制代码
 zip 压缩文件.zip 目录或文件

功能:

将目录或文件压缩成 zip 格式

常用选项:

  • -r:递归处理,将指定⽬录下的所有文件和子目录一并处理

举例:

test2 目录压缩: zip test2.zip test2/*

解压到 tmp 目录:unzip test2.zip -d /tmp

关于 rzsz :

这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件。安装完毕之后可以通过拖拽的方式将文件上传过去。

bash 复制代码
sudo yum/apt install -y lrzlz

8.25 tar 指令(重点)

功能:

打包/解包,不打开它,直接看内容

语法:

bash 复制代码
 tar [-cxtzjvf] 文件与目录 ....

参数:

  • -c :建立一个压缩文件的参数指令(create 的意思)

  • -x :解开一个压缩文件的参数指令

  • -t :查看 tarfile 里面的文件

  • -z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?

  • -j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?

  • -v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!

  • -f :使用档名,请留意,在 f 之后要立即接档名!不要再加参数!

  • -C :解压到指定⽬录

案例:

范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar

bash 复制代码
[root@linux ~]$ tar -cvf /tmp/etc.tar /etc<==仅打包,不压缩!
[root@linux ~]$ tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩
[root@linux ~]$ tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩

特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。

如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar fila

如果加 j 参数,则以 .tar.bz2 来作为附档名

上述指令在执行的时候,会显示⼀个警告讯息:

『tar: Removing leading /" from member names』那是关于绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?

bash 复制代码
[root@linux ~]$ tar -ztvf /tmp/etc.tar.gz

由于我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下

bash 复制代码
[root@linux ~]$ cd /usr/local/src
[root@linux src]$ tar -zxvf /tmp/etc.tar.gz

在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,我先将工作目录变换到 /usr/local/src 底下,

并且解开 /tmp/etc.tar.gz ,则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc 则会发现,

该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已

bash 复制代码
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -zxvf /tmp/etc.tar.gz etc/passwd

可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,就可以透过这个方式来下达!

注意到!etc.tar.gz内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!

bash 复制代码
[root@linux ~]$ tar -zxvpf /tmp/etc.tar.gz /etc
# 这个 -p 的属性是很重要的,尤其是当您要保留原本⽂件的属性时! 

范例六:在 /home 当中,比 2005/06/01 新的文件才备份

bash 复制代码
[root@linux ~]$ tar -N "2005/06/01" -zcvf home.tar.gz /home

范例七:我要备份 /home,/etc ,但不要 /home/dmtsai

bash 复制代码
[root@linux ~]$ tar --exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!

bash 复制代码
[root@linux ~]$ cd /tmp
[root@linux tmp]$ tar -cvf - /etc | tar -xvf -

这个动作有点像是 cp -r /etc /tmp 依旧是有其有用途的!

要注意的地方在于输出档变成 - 而输入档也变成 - ,又有⼀个 | 存在

这分别代表 standard output,standard input 与管线命令啦!

8.26 bc 指令(了解)

bc 命令可以很方便的进行浮点运算,由于使用频率不高,所以不作更加详细的讲解

8.27 uname ‒r 指令

语法:

bash 复制代码
uname [选项]

功能:

uname 用来获取电脑和操作系统的相关信息。

补充说明:

uname 可显示 linux 主机所用的操作系统的版本、硬件的名称等基本信息。

常用选项:

  • -a 或 ‒all 详细输出所有信息,依次为内核名称,主机名,内核版本号,内核版本,硬件名,处理器类型,硬件平台类型,操作系统名称

  • lsb_release -a:查看操作系统版本

8.28 重要的几个热键 [Tab], [ctrl]-c, [ctrl]-d

  • [Tab] 按键 --- 具有『命令补全』和『档案补齐』的功能

  • [Ctrl]-c 按键 --- 让当前的程序『停掉』

  • [Ctrl]-d 按键 --- 通常代表着:『键盘输入结束(End Of File, EOF, End OfInput)』的意思;另外,他也可以用来取代 exit

8.29 shutdown 指令(了解)

语法:

bash 复制代码
shutdown [选项]

功能:

将服务器进行关机

这里作者强烈建议读者们不要对这个指令进行实践,如果是用云服务器的读者还要,一旦不是云服务器的读者,那就要去机房对机器进行重启,所以读者们只需将这个指令作为了解即可

常见选项:

  • -h:将系统的服务停掉后,立即关机。

  • -r:在将系统的服务停掉之后就重新启动

  • -t sec:-t 后面加秒数,亦即『过几秒后关机』的意思

8.30 拓展指令

以下命令作为扩展

  • 安装和登录命令:login、shutdown、halt、reboot、install、mount、umount、chsh、exit、last;

  • 文件处理命令:file、mkdir、grep、dd、find、mv、ls、diff、cat、ln;

  • 系统管理相关命令:df、top、free、quota、at、lp、adduser、groupadd、kill、crontab;

  • 网络操作命令:ifconfig、ip、ping、netstat、telnet、ftp、route、rlogin、rcp、finger、mail、nslookup;

  • 系统安全相关命令:passwd、su、umask、chgrp、chmod、chown、chattr、sudo ps、who;

  • 其它命令:tar、unzip、gunzip、unarj、mtools、man、unendcode、uudecode。

9. shell 命令以及运行原理

Linux 严格意义上说的是一个操作系统,我们称之为"核心(kernel)",但我们⼀般用户,不能直接使用 kernel。

而是通过 kernel 的"外壳"程序,也就是所谓的 shell ,来与 kernel 沟通。如何理解?为什么不能直接使用 kernel ?

从技术角度,Shell 的最简单定义:命令行解释器(command Interpreter)主要包含:

  • 将使用者的命令翻译给核心(kernel)处理。

  • 同时,将核心的处理结果翻译给使用者。

对比 windows GUI,我们操作 windown 不是直接操作 windows 内核,而是通过图形接口,点击,

从而完成我们的操作(比如进入 D 盘的操作,我们通常是双击 D 盘盘符,或者运行起来⼀个应用程序)。

shell 对于 Linux ,有相同的作用,主要是对我们的指令进行解析,解析指令给 Linux 内核。反馈结果在通过内核运行出结果,

通过 shell 解析给用户。

  • 帮助理解:如果说你是一个闷骚且害羞的程序员,那 shell 就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的小花。你看上了小花,但是有不好意思直接表白,那就让你你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给小花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的 bash 。

10. Linux权限的概念

Linux 下有两种用户:超级用户(root)、普通用户。

  • 超级用户:可以在 linux 系统下做任何事情,不受限制

  • 普通用户:在 linux 下做有限的事情。

  • 超级用户的命令提示符是 "#" ,普通用户的命令提⽰符是"$"。

命令:

bash 复制代码
su [用户名]

功能:

切换用户

例如,要从 root 用户切换到普通用户 user ,则使用 su user

要从普通用户 user 切换到 root 用户则使用 su root (root可以省略),此时系统会提示输入 root 用户的口令。

11. Linux 权限管理

文件访问者的分类(人):

  • 文件和文件目录的所有者:u --- User

  • 文件和文件目录的所有者所在的组的用户:g --- Group

  • 其它用户:o --- Others(外国人)

文件类型和访问权限(事物属性):

  • 文件类型:

    • d:文件夹

    • -:普通文件

    • l:软链接(类似Windows的快捷方式)

    • b:块设备文件(例如硬盘、光驱等)

    • p:管道文件

    • c:字符设备文件(例如屏幕等串口设备)

    • s:套接口文件

  • 基本权限:

    • 读(r/1):Read对文件而言,具有读取⽂件内容的权限;对⽬录来说,具有浏览该⽬录信息的权限1

    • 写(w/2):Write对⽂件⽽⾔,具有修改⽂件内容的权限;对⽬录来说具有删除移动⽬录内⽂件的权限

    • 执行(x/3):execute对⽂件⽽⾔,具有执⾏⽂件的权限;对⽬录来说,具有进⼊⽬录的权限

    • " - " 表示不具有该项权限文件权限值的表示方法

文件权限值表达方式:

  • 字符表示方法

  • 8 进制数值表示方法

12. 文件访问权限的相关设置方法

12.1 chmod 指令

功能:

设置文件的访问权限

格式:

chmod [参数] 权限 文件名

常用选项:

  • R -> 递归修改目录文件的权限

  • 说明:只有文件的拥有者和 root 才可以改变文件的权限

chmod 命令权限值的格式:

  • 用户表示符 + / - / = 权限字符

    • +: 向权限范围增加权限代号所表示的权限

    • -: 向权限范围取消权限代号所表示的权限

    • =: 向权限范围赋予权限代号所表示的权限

  • 用户符号:

    • u:拥有者

    • g:拥有者同组用户

    • o:其它用户

    • a:所有用户

实例:

bash 复制代码
 chmod u+w /home/abc.txt
 chmod o-x /home/abc.txt
 chmod a=x /home/abc.txt
 #三位8进制数字修改文件权限
 chmod 664 /home/abc.txt
 chmod 640 /home/abc.txt

12.2 chown 指令

功能:

修改文件的拥有者

格式:

bash 复制代码
chown [参数] 用户名 文件名

实例:

bash 复制代码
chown user1 f1
chown -R user1 filegroup1

12.3 chgrp 指令

功能:

修改文件或目录的所属组

格式:

bash 复制代码
chgrp [参数] 用户组名 文件名 

常用选项:

  • -R 递归修改文件或目录的所属组

实例:

bash 复制代码
chgrp users /abc/f2

12.4 umask 指令

功能:

  • 查看或修改⽂件掩码

  • 新建文件夹默认权限 =0666

  • 新建目录默认权限 =0777

  • 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到 umask 的影响。假设默认权限是 mask ,则实际创建的出来的文件权限是: mask & ~umask (默认 mask 八进制权限值与 umask 的八进制值的反码相与的结果)

格式:

bash 复制代码
umask 权限值

说明:

将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为 0022 ,普通用户默认为 0002 。

实例:

  • umask 755

  • umask //查看

  • umask 044//设置

12.5 file 指令

功能说明: 辨识文件类型。

语法:

bash 复制代码
file [选项] 文件或目录... 

常用选项:

  • -c:详细显示指令执行过程,便于排错或分析程序执行的情形。

  • -z:尝试去解读压缩⽂件的内容。

使用 sudo 分配权限

  1. 修改 /etc/sudoers 文件分配文件
bash 复制代码
chmod 740 /etc/sudoers
vi /etc/sudoer

格式:

接受权限的用户登陆的主机 =(执行命令的用户)命令

  1. 使用 sudo 调用授权的命令
bash 复制代码
$ sudo --u ⽤⼾名 命令

实例:

bash 复制代码
$ sudo -u root /usr/sbin/useradd u2

12.6 目录的权限

  • 可执行权限(x):如果目录没有可执行权限,则无法 cd 到目录中。

  • 可读权限(r):如果目录没有可读权限,则无法用 ls 等命令查看目录中的文件内容。

  • 可写权限(w):如果目录没有可写权限,则无法在目录中创建文件,也无法在目录中删除文件,于是问题来了,就是只要用户具有目录的写权限,用户就可以删除目录中的文件,而不论这个用户是否有这个文件的写权限,这好像不太科学啊,我张三创建的一个文件,凭什么被你李四可以删掉?我们用下面的过程印证⼀下。

bash 复制代码
[root@localhost ~]$ chmod 0777 /home/
[root@localhost ~]$ ls /home/ -ld 
drwxrwxrwx. 3 root root 4096 9⽉ 19 15:58 /home/
[root@localhost ~]$ touch /home/root.c
[root@localhost ~]$ ls -l /home/
总⽤量 4
-rw-r--r--. 1 root root 0 9⽉ 19 15:58 abc.c
drwxr-xr-x. 27 litao litao 4096 9⽉ 19 15:53 litao
-rw-r--r--. 1 root root 0 9⽉ 19 15:59 root.c

[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/root.c #litao可以删除root创建的⽂件 
rm:是否删除有写保护的普通空⽂件 "/home/root.c"? y

[litao@localhost ~]$ exit 
logout

为了解决这个不科学的问题,Linux 引入了粘滞位的概念。

12.7 关于权限的总结

  • 目录的可执行权限是表示你可否在目录下执行命令。

  • 如果目录没有 -x 权限,则无法对目录执行任何命令,甚至无法 cd 进入目录,即使目录仍然有 -r 读权限(这个地方很容易犯错,认为有读权限就可以进入目录读取目录下的文件)

  • 而如果目录具有 -x 权限,但没有 -r 权限,则用户可以执行命令,可以 cd 进入目录。但由于没有目录的读权限。

  • 所以在目录下,即使可以执行 ls命令,但仍然没有权限读出目录下的文档。

12.8 粘滞位(重要)

bash 复制代码
[root@localhost ~]$ chmod +t /home/ # 加上粘滞位 
[root@localhost ~]$ ls -ld /home/
drwxrwxrwt. 3 root root 4096 9⽉ 19 16:00 /home/
[root@localhost ~]$ su - litao
[litao@localhost ~]$ rm /home/abc.c #litao不能删除别⼈的⽂件 
rm:是否删除有写保护的普通空⽂件 "/home/abc.c"? y
rm: ⽆法删除"/home/abc.c": 不允许的操作

当一个目录被设置为 "粘滞位" (用 chmod +t),则该目录下的文件只能由

  1. 超级管理员删除

  2. 该⽬录的所有者删除

  3. 该⽂件的所有者删除

相关推荐
YMLT花岗岩2 小时前
Python学习之-函数-入门训练-在函数中修改全局变量
python·学习
tqs_123452 小时前
tcc中的空回滚和悬挂问题
java·数据库
MX_93592 小时前
以配置非自定义bean来演示bean的实例化方式
java·开发语言·后端
zl_dfq2 小时前
Linux 之 【日志】(实现一个打印日志的类)
linux
哪里不会点哪里.2 小时前
Spring 事务机制详解:原理、传播行为与失效场景
java·数据库·spring
电饭叔2 小时前
哥德巴赫猜想学习
学习
EmbedLinX2 小时前
一文理解后端核心概念:同步/异步、阻塞/非阻塞、进程/线程/协程
linux·服务器·c语言·网络
风筝在晴天搁浅3 小时前
hot100 102.二叉树的层序遍历
java·算法
zhangrelay3 小时前
linux下如何通过与AI对话设置thinkpad电池充电阈值
linux·运维·笔记·学习