diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240515 \345\210\235\350\257\206Linux.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240515 \345\210\235\350\257\206Linux.md" new file mode 100644 index 0000000000000000000000000000000000000000..c18f11be53fc768edbb197b8c798f1b909ad2bf2 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240515 \345\210\235\350\257\206Linux.md" @@ -0,0 +1,83 @@ +初识Linux + +1. Linux发展史 + +2. Linux与Windows区别 + +3. 为什么我们选择Debian为教学的发行版本 + +4. 如何安装一个Debian + + 1. 安装一个VM虚拟机 + + 1. 下载VM + 2. 注册VM:百度到处都是序列号 + + 2. 下载Debian的安装镜像ISO + + 1. https://mirror.lzu.edu.cn/debian-cd/12.5.0/amd64/iso-cd/ + 2. [debian-12.5.0-amd64-netinst.iso](https://mirror.lzu.edu.cn/debian-cd/12.5.0/amd64/iso-cd/debian-12.5.0-amd64-netinst.iso) + + 3. 将Debian安装进VM + + 1. 创建一个空白虚拟机 + 2. 配置好相关的硬件参数 + 3. 关键是修改CD-ROM,选择ISO文件路径 + 4. 启动虚拟机 + 5. 在选择语言时,选择简体中文,可以将配置的界面都中文显示 + 6. 遇到选镜像站点时,选mirror.lzu.edu.cn 兰州大学的站点 + 7. 软件安装时,只保留最后的标准工具,其它都不选 + + 4. 安装好系统之后,可以用两种帐号登录。 + + 1. root 超级管理员,他具有最高的权限。 + 2. 普通用户 dabian2ban 权限很低 + + 5. 默认情况,我们是没有安装SSH服务端的。得自己在debian安装一个SSH的服务端 + + ```js + apt-get update // 将软件库更新到最新,得到最新可用的软件列表 + apt-get install ssh //安装ssh + + // 安装SSH服务端之后,就可以用电脑的SSH客户端进行连接 + // cmd,finalshell,tabby,putty + // ssh -l 用户名 ip + // ssh 用户名@ip + // 但普通用户权限受限,所以需要一些权限时,要么切换到root登录,要么借用root的权限 + root@172.16.90.103's password: + Permission denied, please try again. // root用户默认是禁止SSH登录的。 + // 为了使root可以远程登录,配置SSH服务端 + // /etc/ssh/sshd_config // 编辑sshd_config这个文件,但vi编辑器太原始 + // 改用vim, + apt-get install vim -y // 安装vim + ``` + + vim /etc/ssh/sshd_config + + ```js + Port 22 // 开启端口22 + PermitRootLogin yes // 允许root登录 + PasswordAuthentication yes // 使用密码验证的模式 + PermitEmptyPasswords no // 禁用空密码 + // 重启ssh让配置生效 + systemctl restart ssh + /etc/init.d/ssh restart + + + // 默认是命令模式,按i进入编辑模式 + // 保存时,按ESC,退回命令模式,按shift+: ,输入qw! + ``` + + linux 执行的服务的命令 + + 1. systemctl 指令 服务名 + 2. /etc/init.d/服务器 指令 + + + + 6. 默认也可以用ip addr show 查看ip 地址 + + 7. 小练习, + + 1. 自行让你的Deiban可用ifconfig命令,这个指令可以用来查看ip + 2. 学习VIM常用指令 \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240516 \345\210\233\345\273\272\346\226\207\344\273\266\345\244\271\345\222\214\345\216\213\347\274\251\345\222\214\350\247\243\345\216\213\346\226\207\344\273\266\345\244\271.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240516 \345\210\233\345\273\272\346\226\207\344\273\266\345\244\271\345\222\214\345\216\213\347\274\251\345\222\214\350\247\243\345\216\213\346\226\207\344\273\266\345\244\271.md" new file mode 100644 index 0000000000000000000000000000000000000000..ee9d56a658863e2c7893ab5a63583f719b880f0c --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240516 \345\210\233\345\273\272\346\226\207\344\273\266\345\244\271\345\222\214\345\216\213\347\274\251\345\222\214\350\247\243\345\216\213\346\226\207\344\273\266\345\244\271.md" @@ -0,0 +1,103 @@ +# Linux目录结构 + +”/"目录是Linux文件系统的跟目录,包含了整个文件的基础结构 + +Linux命令格式:命令名称 【命令选项】 【命令参数】 + +命令选项:长格式(两个横线)和短格式(一个横线) + +# LInux常用命令 + +回到/home根文件:cd ~ + +创建文件夹:mkdir 文件夹名称 + +创建文件:touch 文件名称 + +删除空目录:rmdir 文件夹名称 (删除的必须是空目录) + +删除文件:rm 文件名称 + +强制删除文件夹及其一下目录:rm -rf 目录 //r代表递归删除,f代表强制删除 + +# Linux的原则 + +1.严格区分大小写 + +2.一切的根源是“/” + +3.不要漏写空格符号 + +# 5.18作业 + +## 一.什么是环境变量 + +环境变量是操作系统中的一种机制,它们是在操作系统级别上定义的一些变量,用于存储在计算机中可供各个程序使用的信息。环境变量 + +可以包含各种不同类型的数据,例如路径、配置参数、操作系统版本等。 + +环境变量通常由操作系统或其他主要软件应用程序设置和更新,但用户也可以手动编辑它们。在命令行或脚本中,可以使用环境变量来引 + +用特定的值,以及在不同的计算机或操作系统之间共享配置信息。 + +可以帮助程序员轻松地访问和管理各种系统配置信息。 + +## 二.创建文件夹和压缩和解压文件夹 + +1.新建用户并设置密码 + +``` +adduser 用户名称 +会弹出密码设置 +切换用户:su 用户名称 +``` + +2.创建文件夹 + +``` +创建单个文件夹:mkdir 文件夹 +创建连续多个文件夹:mkidr 文件夹名称 -p +``` + +3.创建txt文件 + +``` +touch 文件名称.txt +``` + +4.添加txt内容 + +``` +vim 文件名称.txt //即可编辑,编辑按i,保存按esc输入:wq,退出输入:q! +如果保存不了把权限设置为可修改保存: +chmod u+w /路径 //这样就可以修改保存了 +``` + +5.压缩文件和解压文件 + +``` +需要先安装zip和unzip: +apt install zip +apt insatll -y unzip zip +``` + +``` +压缩文件命令示例: +1.压缩同目录文件夹中的文件夹: +zip -r 压缩名字.zip 要压缩的文件名称 +``` + +``` +解压文件命令示例: +unzip 解压文件 +unzip 解压文件 [-d] /目录 +[-d]:可以解压到指定目录 +``` + +6.将压缩包下载到本地电脑中 + +``` +安装lrzsz: +apt install lrzsz +sz 下载文件 +``` \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240518 \346\227\245\350\256\260\345\260\217\347\273\203\344\271\240 .md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240518 \346\227\245\350\256\260\345\260\217\347\273\203\344\271\240 .md" new file mode 100644 index 0000000000000000000000000000000000000000..3b09fce760f9f989c7c0ec5b0b6088fb6b5f0a6b --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240518 \346\227\245\350\256\260\345\260\217\347\273\203\344\271\240 .md" @@ -0,0 +1,152 @@ +## 环境变量 + +``` +环境变量 (environment variables) 是在操作系统中用来指定操作系统运行环境的一些参数。环境变量是在操作系统中一个具有特定名字的对象,它包含了一个或者多个应用程序所使用到的信息。Windows 和 DOS 操作系统中的 path 环境变量,当要求系统运行一个程序而没有告诉它程序所在的完整路径时,系统除了在当前目录下面寻找此程序外,还应到 path 中指定的路径去找。用户通过设置环境变量,来更好的运行进程。 +环境变量是包含关于系统及当前登录用户的[环境信息]的字符串,一些软件程序使用此信息确定在何处放置文件(如[临时文件] +环境变量是包含诸如驱动器、路径或文件名之类的字符串。环境变量控制着多种程序的行为。例如,TEMP 环境变量指定程序放置临时文件的位置。 +任何用户都可以添加、修改或删除用户的环境变量。但是,只有管理员才能添加、修改或删除系统环境变量 +#### 环境变量](https://wenwen.sogou.com/s/?w=环境变量&ch=ww.xqy.chain)简单来说就是将某些数据,文件或文件夹设置为系统默认值,这样你调用的时候就不用给出完整路径和地址或进行设置,直接用名字就可以了 + +cd ~ //切换到当前目录的家目录 +``` + + + +### 概括 + +#### [环境变量](https://wenwen.sogou.com/s/?w=环境变量&ch=ww.xqy.chain)简单来说就是将某些数据,文件或文件夹设置为系统默认值,这样你调用的时候就不用给出完整路径和地址或进行设置,直接用名字就可以了 + +cd ~ //切换到当前目录的家目录 + +## 练习 + +登录超级管理员模式root,创建普通用户模式 + +```js +root@hecs-165744:~# adduser wxy + //sudo userdel -r wxy --删除用户wxy +New password: +Retype new password: +passwd:password updated successfully +Changing the user information for wxy +Enter the new value,or press ENTER for the default + Full Name []: + Rocm Number []: + Work Phone []: + Home Phone []: + Other []: //全部回车 +Is the information correct?[Y/n] Y +``` + +登录普通用户模式 + +```js +//创建多个文件夹 mkdir 文件名/文件名/…… -p +zpp@hecs-161832:/home$ mkdir 中国/河南省/南阳市/社旗县/赊店镇/张起瑞 -p +//进入文件夹 +zpp@hecs-161832:/home$ cd 中国/河南省/南阳市/社旗县/赊店镇/张起瑞 -p +//创建文件 touch 文件名.txt +zpp@hecs-161832:/home$ / 中国/河南省/南阳市/社旗县/赊店镇/张起瑞 touch 2244310250张起瑞.txt //检查是否创建成功 ls +//编写内容 +zpp@hecs-161832:/home$ / 中国/河南省/南阳市/社旗县/赊店镇/张起瑞 vim 2244310250张起瑞.txt +//压缩文件 tar -cvf 压缩包名.tar 文件或目录 +zpp@hecs-161832:~$ sudo tar -cvf 中国.tar 中国 +//解压 tar -xf 压缩包名.tar +zpp@hecs-161832::~$ tar -xf 中国.tar //解压并提取中国,-x:表示从归档文件中提取文件 +``` + +``` +Linux hecs-161832 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64 + + Welcome to Huawei Cloud Service + +Last login: Sat May 18 11:26:51 2024 from 112.5.195.104 +root@hecs-161832:~# adduser zqr +Adding user `zqr' ... +Adding new group `zqr' (1001) ... +Adding new user `zqr' (1001) with group `zqr' ... +Creating home directory `/home/zqr' ... +Copying files from `/etc/skel' ... +New password: +Retype new password: +passwd: password updated successfully +Changing the user information for zqr +Enter the new value, or press ENTER for the default + Full Name []: + Room Number []: + Work Phone []: + Home Phone []: + Other []: +Is the information correct? [Y/n] y^HY^H^H^H +root@hecs-161832:~# su zqr +zqr@hecs-161832:/root$ cd../ +bash: cd../: Permission denied +zqr@hecs-161832:/root$ cd ../ +zqr@hecs-161832:/$ cd home +zqr@hecs-161832:/home$ su mkdir 中国/福建省/龙岩市/新罗区/闽大/张起瑞 +su: user mkdir does not exist or the user entry does not contain all the required fields +zqr@hecs-161832:/home$ su mkdir 中国/福建省/龙岩市/新罗区/闽大/张起瑞 -p +su: user mkdir does not exist or the user entry does not contain all the required fields +zqr@hecs-161832:/home$ sudo mkdir 中国/福建省/龙岩市/新罗区/闽大/张起瑞 -p +bash: sudo: command not found +zqr@hecs-161832:/home$ cd ~ +zqr@hecs-161832:~$ sudo mkdir 中国/福建省/龙岩市/新罗区/闽大/张起瑞 -p +bash: sudo: command not found +zqr@hecs-161832:~$ apt install sudo +E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) +E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root? +zqr@hecs-161832:~$ mkdir 中国 +zqr@hecs-161832:~$ ls +中国 +zqr@hecs-161832:~$ mkdir 中国/福建省/龙岩市/新罗区/闽大/张起瑞 +mkdir: cannot create directory ‘中国/福建省/龙岩市/新罗区/闽大/张起瑞’: No such file or directory +zqr@hecs-161832:~$ cd 中国/ +zqr@hecs-161832:~/中国$ mkdir 中国/福建省/龙岩市/新罗区/闽大/张起瑞 -p +zqr@hecs-161832:~/中国$ cd 中国/ +zqr@hecs-161832:~/中国/中国$ +zqr@hecs-161832:~/中国/中国$ exit +exit +root@hecs-161832:~# su zqr +zqr@hecs-161832:/root$ cd ../ +zqr@hecs-161832:/$ cd home +zqr@hecs-161832:/home$ cd ~ +zqr@hecs-161832:~$ ls +中国 +zqr@hecs-161832:~$ cd 中国/ +zqr@hecs-161832:~/中国$ mkdir 福建省/龙岩市/新罗区/闽大/张起瑞 -p +zqr@hecs-161832:~/中国$ cd 福建省/ +zqr@hecs-161832:~/中国/福建省$ cd 龙岩市/ +zqr@hecs-161832:~/中国/福建省/龙岩市$ cd 新罗区/ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区$ cd 闽大/ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大$ cd 张起瑞/ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞$ mkdir 2244310250张起瑞 +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞$ cd 2244310250张起瑞/ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞/2244310250张起瑞$ touch 日记.txt +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞/2244310250张起瑞$ vim 日记.txt +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞/2244310250张起瑞$ ls +日记.txt +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞/2244310250张起瑞$ cd ../ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大/张起瑞$ cd ../ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区/闽大$ cd ../ +zqr@hecs-161832:~/中国/福建省/龙岩市/新罗区$ cd ../ +zqr@hecs-161832:~/中国/福建省/龙岩市$ cd ../ +zqr@hecs-161832:~/中国/福建省$ cd ../ +zqr@hecs-161832:~/中国$ cd ../ +zqr@hecs-161832:~$ sudo tar -cvf 中国.tar 中国 +bash: sudo: command not found +zqr@hecs-161832:~$ tar -cvf 中国.tar 中国 +中国/ +中国/福建省/ +中国/福建省/龙岩市/ +中国/福建省/龙岩市/新罗区/ +中国/福建省/龙岩市/新罗区/闽大/ +中国/福建省/龙岩市/新罗区/闽大/张起瑞/ +中国/福建省/龙岩市/新罗区/闽大/张起瑞/2244310250张起瑞/ +中国/福建省/龙岩市/新罗区/闽大/张起瑞/2244310250张起瑞/日记.txt +zqr@hecs-161832:~$ apt-get install sudo +E: Could not open lock file /var/lib/dpkg/lock-frontend - open (13: Permission denied) +E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), are you root? +zqr@hecs-161832:~$ sudo + +``` + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240520 \345\216\213\347\274\251\345\222\214\346\226\207\344\273\266\345\244\271\345\217\212\346\226\207\344\273\266\347\256\241\347\220\206\347\232\204\351\242\204\344\271\240\344\275\234\344\270\232.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240520 \345\216\213\347\274\251\345\222\214\346\226\207\344\273\266\345\244\271\345\217\212\346\226\207\344\273\266\347\256\241\347\220\206\347\232\204\351\242\204\344\271\240\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..cf68c986fb0762a70c38a926c480c791339a1a12 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240520 \345\216\213\347\274\251\345\222\214\346\226\207\344\273\266\345\244\271\345\217\212\346\226\207\344\273\266\347\256\241\347\220\206\347\232\204\351\242\204\344\271\240\344\275\234\344\270\232.md" @@ -0,0 +1,208 @@ +```js +20240518作业老师讲过的过程: +1. 新建一个用户dabian2ban,密码设置666 + 1. Linuxt系统命令怎么创建用户: + 1. useradd 用户名 -m -s /bin/bash 需要自己写清每个选项 + 2. adduser 用户名 高级命令,可以对话形式给你完成主要设置 + 2. 删除一个用户 + 1. userdel 用户名 + 2. deluser +2. 以刚建的用户登录,操作以下 + 1. 重新打开个连接 + 2. su 用户a :切换到用户a身份(exit,logout) +3. 使用命令,在自己的家目录,以以下层次依次建立文件夹 + 1. 国家 + 1. 省份 + 1. 市 + 1. 县(区) + 1. 镇(街道) + 1. 村(小区) + 1. 姓名 + 2. mkdir -p //-p的选项当相关目录不存在时,就创建,若已经存在就跳过创建而不报错 +4. 在姓名文件夹,建立一个自己的学号姓名文件 + 1. touch 文件名 直接用touch创建一个空文件 + 2. vim 文件名:使用vim编辑器创建文件,并编辑 + 1. 普通模式:默认 + 2. 编辑模式: + 1. 按i进入编辑模式 + 2. 按Esc退回普通模式 + 3. 命令模式(末行模式): + 1. shift+: + 2. 在这个可以输入对应的命令进行操作 :write写入(保存) quit(退出) 强制执行! + 1. w 只保存不退出 + 2. q 只退出不保存 + 3. !强制退出,不保存 + 4. 正常一般组合使用 + 1. wq! 保存并退出 + 2. q! 直接退出不保存 + 3. vim 直接打开编辑器,书写内容后保存 :w 文件名 + 4. nano编辑Debian默认编辑,vim + 5. echo 文件名:使用echo命令 创建文件,并将echo的内容保存在这个文件 +5. 在这个文件中,写一篇不少于400字的日记 +6. 最后,将国家这个文件夹打包,同时练习怎么解压 + 1. 打包:tar -cvf 打包后的文件名.tar 被打包的目录或文件名 ,只有打包的效果,不压缩 + 2. 解包:tar -xvf 包名 -C 指定解包在哪目录(前提这个目录存在) + 3. && 依次执行多个命令 命令1 && 命令2 && 命令3 && 命令4 + 4. gzip 只负责压缩,和解压缩,所以通常和tar一起使用,gzip作为tar一个-z参数存在 + 5. tar -cvzf 打包后的文件名.tar 被打包的目录或文件名 ,打包且压缩 +7. 使用命令将这个压缩包下载到本地电脑【不能用shell里自带的下载功能】 + 1. scp 源 目标 + 2. sftp :get下载 ,put上传 + 3. 以上两个命令都在客户端执行 +8. 相关命令百度预习 +9. 命令参考 https://www.linuxcool.com/ +10. 相关过程,做成笔记 +``` + +## 作业: + +``` +### 综合练习题:大学生生活场景中的文件夹和文件管理 + +假设你是一名大学生,现在面临着整理学习资料和课程作业的任务。请按照以下要求完成相关的文件夹和文件管理操作: + +1. 在你的个人文档目录下创建一个名为`学习资料`的文件夹,并进入该文件夹。 +2. 在`学习资料`文件夹中创建一个名为`计算机科学`的文件夹。 +3. 在`计算机科学`文件夹中创建两个子文件夹,分别命名为`课程资料`和`编程项目`。 +4. 将你最近的一门计算机科学课程的课件文件(假设文件名为`CS101_第一讲.pdf`)放入`课程资料`文件夹。 +5. 在`编程项目`文件夹中创建一个名为`Java项目`的文件夹。 +6. 在`Java项目`文件夹中创建两个空文件,分别命名为`主程序.java`和`工具类.java`。 +7. 复制`主程序.java`并命名为`备份_主程序.java`。 +8. 创建一个名为`Python项目`的文件夹,并将`工具类.java`移动到`Python项目`文件夹中。 +9. 列出`计算机科学`文件夹中所有文件和文件夹的内容。 +10. 删除`编程项目`文件夹及其包含的所有内容。 +11. 重命名`Python项目`为`数据分析项目`。 +12. 最后,列出当前所在目录的路径。 +``` + +```js +连接主机... +连接主机成功 +Linux hecs-161832 5.10.0-23-amd64 #1 SMP Debian 5.10.179-1 (2023-05-12) x86_64 + + Welcome to Huawei Cloud Service + +Last login: Tue May 21 15:59:18 2024 from 112.5.195.104 +root@hecs-161832:~# adduser zpp //新建用户 +adduser: The user `zpp' already exists. +root@hecs-161832:~# userdel zpp +root@hecs-161832:~# adduser zpp +Adding user `zpp' ... +Adding new group `zpp' (1000) ... +Adding new user `zpp' (1000) with group `zpp' ... +Creating home directory `/home/zpp' ... +Copying files from `/etc/skel' ... +New password: +Retype new password: +passwd: password updated successfully +Changing the user information for zpp +Enter the new value, or press ENTER for the default + Full Name []: + Room Number []: + Work Phone []: + Home Phone []: + Other []: +Is the information correct? [Y/n] y^HY^H^H +root@hecs-161832:~# su zpp //进入普通用户 +zpp@hecs-161832:/root$ cd ../ //进入上一级 +zpp@hecs-161832:/$ cd home //进入家目录 +zpp@hecs-161832:/home$ cd ~ //进入用户的目录 +zpp@hecs-161832:~$ mkdir 学习资料 //创建文件夹 +zpp@hecs-161832:~$ cd 学习资料 //进入文件夹 +zpp@hecs-161832:~/学习资料$ mkdir 计算机科学 //创建文件夹 +zpp@hecs-161832:~/学习资料$ cd 计算机科学 //进入文件夹 +zpp@hecs-161832:~/学习资料/计算机科学$ mkdir 课程资料 //创建子文件夹 +zpp@hecs-161832:~/学习资料/计算机科学$ mkdir 编程项目 //创建子文件夹 +zpp@hecs-161832:~/学习资料/计算机科学$ cd 课程资料 //进入文件夹 +zpp@hecs-161832:~/学习资料/计算机科学/课程资料$ cd ../ //返回上一级 +zpp@hecs-161832:~/学习资料/计算机科学$ cd 编程项目 //进入文件夹 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目$ mkdir Java //创建文件夹 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目$ mv Java Java项目 //修改文件名称 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目$ cd Java项目 //进入子文件夹 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目/Java项目$ touch 主程序.java //创建文件 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目/Java项目$ touch 工具类.java //创建文件 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目/Java项目$ cp 主程序.java 备份_主程序.java //文件备份 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目/Java项目$ mkdir Python项目 //创建文件夹 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目/Java项目$ mv 工具类.java Python项目 //移动文件 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目/Java项目$ cd ../ //返回上一级 +zpp@hecs-161832:~/学习资料/计算机科学/编程项目$ cd ../ //再返回上一级 +zpp@hecs-161832:~/学习资料/计算机科学$ ls //查看文件目录 +编程项目 课程资料 +zpp@hecs-161832:~/学习资料/计算机科学$ rm -rf 编程项目 //删除文件夹 +zpp@hecs-161832:~/学习资料/计算机科学$ mkdir Python项目 //创建文件夹 +zpp@hecs-161832:~/学习资料/计算机科学$ cd Python项目 // 进入文件夹 +zpp@hecs-161832:~/学习资料/计算机科学/Python项目$ touch 工具类.java //创建文件 +zpp@hecs-161832:~/学习资料/计算机科学/Python项目$ cd ../ //返回上一级 +zpp@hecs-161832:~/学习资料/计算机科学$ mv -i Python项目 数据分析项目 //修改文件名称 +zpp@hecs-161832:~/学习资料/计算机科学$ pwd //查看当前文件所在路径 +/home/zpp/学习资料/计算机科学 +``` + +``` +cmd: +crosoft Windows [版本 10.0.19044.4412] +(c) Microsoft Corporation。保留所有权利。 + +C:\Users\zqr>stfp zpp@123.60.178.142 +'stfp' 不是内部或外部命令,也不是可运行的程序 +或批处理文件。 + +C:\Users\zqr>sftp zpp@123.60.178.142 +zpp@123.60.178.142's password: +Connected to 123.60.178.142. +sftp> lls + Volume in drive C has no label. + Volume Serial Number is A2F4-06B0 + + Directory of C:\Users\zqr + +2024/05/19 14:01 . +2024/05/19 14:01 .. +2024/05/21 00:04 3,680 .bash_history +2024/05/16 08:33 220 .gitconfig +2024/05/17 11:03 150 .packettracer +2024/05/19 14:01 .ssh +2024/05/05 23:23 .vscode +2024/03/28 14:49 3D Objects +2024/05/17 11:03 Cisco Packet Tracer 7.3.0 +2024/03/28 14:49 Contacts +2024/05/20 13:28 Desktop +2024/05/19 15:40 Documents +2024/05/20 20:23 Downloads +2024/03/28 14:49 Favorites +2024/03/28 14:49 Links +2024/03/28 14:49 Music +2024/03/28 14:49 Pictures +2024/03/28 14:49 Saved Games +2024/03/28 14:50 Searches +2024/03/28 14:49 Videos +2024/03/30 15:37 WPSDrive + 3 File(s) 4,050 bytes + 18 Dir(s) 106,774,642,688 bytes free +sftp> ls +Interrupt +Connection closed + +C:\Users\zqr>stfp zpp@123.60.178.142 +'stfp' is not recognized as an internal or external command, +operable program or batch file. + +C:\Users\zqr>sftp zpp@123.60.178.142 +zpp@123.60.178.142's password: +Connected to 123.60.178.142. +sftp> ls +学习资料 +sftp> cd 学习资料 +sftp> ls +计算机科学 +sftp> cd 计算机科学 +sftp> ls +编程项目 课程资料 +sftp> cd 课程资料 +sftp> put 第1章-动手部署一台Linux操作系统.pdf to home/zpp/学习资料/计算机科学/课程资料 +Uploading 第1章-动手部署一台Linux操作系统.pdf to /home/zpp/学习资料/计算机科学/课程资料/to +第1章-动手部署一台Linux操作系统.pdf 100% 2067KB 6.5MB/s 00:00 +sftp> + +``` + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240522 \346\237\245\347\234\213\347\233\256\345\275\225\344\275\234\344\270\232.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240522 \346\237\245\347\234\213\347\233\256\345\275\225\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..e051f3aa30ec490545cefc9b820cb7347f291c07 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240522 \346\237\245\347\234\213\347\233\256\345\275\225\344\275\234\344\270\232.md" @@ -0,0 +1,434 @@ +## 笔记: + +在Linux系统中,你可以使用以下命令对文件夹和文件进行管理: + +1. **ls**:列出目录内容。 + + ```bash + ls #列出当前目录下的文件和目录 + ls /home/user #列出指定目录下的文件和目录 + ls -d 文件夹A # 列出文件夹A本身的信息,而不是其它下面的目录和内容 + ls -a # all 列出当前目录下的所有文件和目录,包括隐藏文件/目录 + ls -l #以长格式列出当前目录下的文件和目录,包括权限、所有者、组、大小、创建日期等信息 + ls -h # 以易读的方式列出当前目录下的文件和目录,将文件大小以KB、MB\GB等单位表示 + ls -t # t->time 根据修改时间排序列出当前目录下的文件和目录 + ls -r # r -> reverse 反向排序列出当前目录下的文件和目录 + ls -S # S -> Size 根据文件大小排序列出当前目录下的文件和目录 + ls -R # 递归列出当前目录及其子目录下的所有文件和目录 + ls --color # --color(英文全拼:colorize 给着色 ) + # 以不同颜色区分不同类型的文件,例如蓝色表示目录、绿色表示可执行文件等。 + + ## 扩展如何修改环境变量 家目录下的自己的文件下,使用ls -a 显示所有文件,即可看到.bashrc这个环境变量的配置文件。将# alias ll='ls -l' 前的#号删除,并保存文件。最后要生效,就要退出帐号一次,再登录,即可使用ll来代替ls -l + alias la='ls -a' + alias l='ls -CF' + + ``` + +​ + +2. **cd**:改变当前目录。 + + - 进入某个目录:`cd 目录名` + - 返回上一级目录:`cd ..` + - 返回家目录:`cd ~` 或者 `cd ` (啥也不跟): /home/用户名 + - 返回上次所在目录:`cd -` + +3. **pwd**:显示当前工作目录的绝对路径。 + + ```bash + pwd # 显示当前工作目录的绝对路径 + dir1 = $(pwd) # 将当前工作目录路径保存到变量中(在Shell脚本中常用) + echo $dir1 + ``` + + + +4. **mkdir**:创建新目录。 + + - 示例:`mkdir 目录名` + + ```bash + #场景:在当前位置创建一个新的目录 + mkdir 目录名 # 创建一个新目录 + + mkdir 路径/目录名 # 在指定路径下创建目录 + + #场景:在创建目录的同时,如果父目录不存在,则一并创建父目录。 + mkdir -p 父目录/新目录 # 创建多个目录,包括父目录(如果不存在) + # 通常在写脚本的时候,为避免已存在,或不存在某目录后续命令无法继续执行,在mkdir的时候,会加-p选项 + + #场景:创建一个具有特定权限的目录,可以用于设置目录的读写执行权限。 + mkdir -m 权限模式 目录名 # 创建具有特定权限的目录 + # mkdir -m 777 mydir + #场景:需要一个文件夹 + mkdir -p /tmp/新目录 # 创建临时目录,不长期保留,与用户文件隔离,避免暴露用户 + ``` + + + +5. **rmdir**:删除空目录。 + + - 示例:`rmdir 目录名` ,只能删除空的目录 + +6. **rm**:删除文件或目录。 + + ```bash + # ------------------- 删除文件 ------------------- + rm -i 文件名 # 删除指定的文件,删除前会询问是否删除(y 确认,n 取消)。 + rm -f 文件名 # 强制删除指定的文件,不会进行询问。 + rm -f a.txt b.txt # 同时删除多个文件:可以在命令中添加多个文件名,用空格分隔,如 。 + rm -f a* # 删除所有以 a 开头的文件 ;删除以特定字符或模式开头的文件:使用通配符* 。 + rm -f .* # 删除隐藏文件:使用 .*,如 (但请注意,这可能会删除当前目录下的所有隐藏文件,包括 . 和 ..,所以请谨慎使用)。 + ## 扩展 + mv example.txt .example.txt # 隐藏文件 + mv mydir .mydir # 隐藏目录 + # ------------------- 删除目录 ------------------- + rmdir 目录名 # 仅删除空的目录。 + rm -r 目录名 # 递归地删除目录及其子目录和文件,删除前会询问是否删除。 + rm -rf 目录名 # 递归地强制删除目录及其子目录和文件,不会进行询问。 + rm -rfv 目录名 # 除了递归强制删除外,还会显示删除的详细步骤。 + rm -d 目录名 # 只删除空目录(与 rmdir 命令类似)。 + ``` + + + +7. **cp**:复制文件或目录。 + + - 复制文件:`cp 源文件 目标文件` + - 复制文件到目录: cp 源文件 目标目录 + - 复制目录:`cp -r 源目录 目标目录` + + `cp` 是 Linux 和 Unix 系统中用于复制文件或目录的命令。以下是 `cp` 命令的一些常见用法: + + 1. **复制单个文件**: + + + ```bash + cp source_file destination_file + ``` + + 例如,将 `example.txt` 复制到 `new_example.txt`: + + + ```bash + cp example.txt new_example.txt + ``` + + 2. **复制文件到目录**: + + + ```bash + cp source_file destination_directory/ + ``` + + 例如,将 `example.txt` 复制到 `target_dir` 目录: + + + ```bash + cp example.txt target_dir/ + ``` + + 3. **递归复制目录**: + 使用 `-r` 或 `-R` 选项可以递归地复制目录及其内容。 + + + ```bash + cp -r source_directory destination_directory/ + ``` + + 例如,将 `source_dir` 目录及其内容复制到 `target_dir`: + + + ```bash + cp -r source_dir target_dir/ + ``` + + 4. **交互式复制**: + 使用 `-i` 选项,在覆盖已存在的文件前会提示用户确认。 + + + ```bash + cp -i source_file destination_file + ``` + + 5. **保留文件属性**: + 使用 `-p` 选项可以保留原文件的属性(如时间戳、权限等)。 + + + ```bash + cp -p source_file destination_file + ``` + + 6. **显示复制进度**: + 使用 `-v` 选项可以显示详细的复制进度信息。 + + + ```bash + cp -v source_file destination_file + ``` + + 7. **仅当源文件较新时复制**: + 使用 `-u` 选项可以仅当源文件比目标文件新时才进行复制。 + + + ```bash + cp -u source_file destination_file + ``` + + 8. **强制复制**: + 使用 `-f` 或 `--force` 选项可以强制复制,即使目标文件已存在也不提示,直接覆盖。 + + + ```bash + cp -f source_file destination_file + ``` + + 9. **批量复制文件**: + 可以使用通配符(如 `*`)来批量复制文件。 + + + ```bash + cp *.txt destination_directory/ + ``` + + 这将复制当前目录下所有 `.txt` 结尾的文件到 `destination_directory` 目录。 + + 这只是 `cp` 命令的一些基本用法,实际上它还有许多其他选项和功能。你可以通过运行 `man cp` 或 `cp --help` 来查看完整的命令手册和选项列表。 + +8. **mv**:移动文件或目录,也可用于重命名文件或目录。 + + - 移动文件或目录:`mv 源目录/文件 目标目录` + - 重命名文件或目录:`mv 原文件名 新文件名` + + 在 Linux 中,`mv` 命令用于移动文件或目录,或者对它们进行重命名。以下是 `mv` 命令的一些常见用法: + + 1. **移动文件或目录**: + + + * 将文件从一个目录移动到另一个目录: + + ```bash + mv source_file destination_directory/ + ``` + + * 移动目录:与移动文件类似,但目录的末尾不应有斜杠(/),除非目标位置是一个已经存在的目录。 + + ```bash + mv source_directory destination_directory/ + ``` + + 注意:如果目标目录不存在,`mv` 命令会将其视为要重命名的文件名,这可能会导致意外的结果。 + + 2. **重命名文件或目录**: + + + * 重命名文件: + + ```bash + mv old_name.txt new_name.txt + ``` + + * 重命名目录: + + ```bash + mv old_directory_name new_directory_name + ``` + + 3. **移动并重命名文件**: + + + * 你可以在一次操作中既移动又重命名文件。 + + ```bash + mv source_directory/old_name.txt destination_directory/new_name.txt + ``` + + 4. **使用通配符移动多个文件**: + + + * 你可以使用通配符(如 `*`)来匹配多个文件,并将它们移动到目标目录。 + + ```bash + mv *.txt destination_directory/ + ``` + + 这将移动当前目录下所有 `.txt` 结尾的文件到 `destination_directory` 目录。 + + 5. **交互式操作**: + + + * 使用 `-i` 选项,`mv` 命令会在移动或重命名文件前进行确认,以避免意外覆盖文件。 + + ```bash + mv -i source_file destination_file + ``` + + 当目标位置已经存在同名文件时,系统会提示你是否要覆盖。 + + 6. **显示详细信息**: + + + * 使用 `-v` 选项,`mv` 命令会显示详细的操作信息,包括移动或重命名的文件名。 + + ```bash + mv -v source_file destination_file + ``` + + 7. **覆盖文件前先备份**: + + * 使用 `-b` 选项,`mv` 命令会在覆盖文件之前对其进行备份。 + + + ```bash + mv -b source_file destination_file + ``` + + 请注意,`mv` 命令的使用可能因不同的 Linux 发行版或 shell 环境而略有差异。但上述用法在大多数情况下都是通用的。如果你需要更详细的信息或特定选项的解释,可以使用 `man mv` 命令来查看 `mv` 命令的手册页。 + +9. **touch**:创建空文件或者更改文件访问和修改时间。 + + - 示例:`touch 文件名` + +10. **chmod**:修改文件或目录权限。 + +- 示例:`chmod 权限值 文件名` + +1. **chown**:改变文件或目录的所有者。 + +- 示例:`chown 用户名 文件名` + +1. **chgrp**:改变文件或目录的所属组。 + +- 示例:`chgrp 组名 文件名` + +这些是常用的Linux文件夹和文件管理相关操作命令,通过它们你可以进行各种文件和目录的管理 + +## 作业: + +假设您刚刚登录到一个Linux系统,并位于您的家目录(`~`)下。您需要完成以下一系列复杂的操作来组织和清理您的文件和目录。请按照顺序执行,并给出相应的命令。 + +1. **创建测试文件**:在家目录下创建三个文本文件,分别命名为`.hidden.txt`(隐藏文件)、`visible1.txt`和`visible2.txt`。 + + ~~~js + touch .hidden.txt && touch Visible1.txt && touch Visible2.txt + ~~~ + + + +2. **列出文件和目录**:列出家目录(`~`)下的所有文件和目录,包括隐藏文件,并查看其详细权限和属性。 + + ~~~js + ls -la ~ + ~~~ + + + +3. **创建工作区**:创建一个新的目录`work_area`,并在其中创建三个子目录:`project_a`、`project_b`和`docs`。 + + ~~~js + mkdir work_area && cd work_area && mkdir project_a && mkdir project_b && mkdir docs + ~~~ + + + +4. **移动文本文件**:将家目录下的所有`.txt`文件移动到`work_area/docs`目录中,并确保这些文件在移动后仍然是隐藏的(如果它们是隐藏的)。 + + ~~~js + zpp@hecs-161832:~/work_area$ mv /home/zpp/.hidden.txt /home/zpp/work_area/bocs + zpp@hecs-161832:~/work_area$ mv /home/zpp/Visible1.txt /home/zpp/work_area/bocs + zpp@hecs-161832:~/work_area$ mv /home/zpp/Visible2.txt /home/zpp/work_area/bocsmv /home/zpp/.hidden.txt /home/zpp/work_area/bocs && mv /home/zpp/Visible1.txt /home/zpp/work_area/bocs && mv /home/zpp/ Visible2.txt /home/zpp/work_area/bocs + + ~~~ + + + +5. **创建新文件**:在`work_area/project_a`目录下创建一个新的文本文件`notes.txt`,并添加一些内容(例如:`echo "Initial notes for ptouch roject A" > work_area/project_a/notes.txt`)。 + + ~~~js + touch notes.txt && echo "fairy" > /home/zpp/work_area/project_a/notes.txt + ~~~ + + + +6. **复制目录**:递归地复制`work_area/project_a`目录到`work_area/project_b`,并命名为`project_a_backup`。 + + ~~~js + cp project_a /home/zpp/work_area/project_b -r && cd project_b && mv project_a project_a_backup + ~~~ + +7. **列出文件并按大小排序**:列出`work_area/docs`目录下的所有文件,并按文件大小降序排列。 + + ~~~js + ls -laS + ~~~ + + + +8. **删除所有文件**:删除`work_area/docs`目录下所有文件。 + + ~~~js + rm -f * + ~~~ + + + +9. **删除目录**:假设您不再需要`work_area/project_b`目录及其所有内容,请递归地强制删除它。 + + ~~~js + rm -r project_b + ~~~ + + + +10. **清理空目录**:清理`work_area`目录,删除其中所有的空目录(注意:不要删除非空的目录)。 + + ~~~js + rm -d work_area/ + ~~~ + + + +11. **创建别名**:回到您的家目录,并创建一个别名`llh`,该别名能够列出当前目录下文件和目录的长格式列表,并以人类可读的格式显示文件大小(类似于`ls -lh`命令)。 + +~~~js +vim .bashrc +alias llh='ls -lh' +~~~ + +``` +zpp@hecs-161832:~$ rm -rf /home/zpp/work_area +zpp@hecs-161832:~$ touch .hidden.txt && touch Visible1.txt && touch Visible2.txt +zpp@hecs-161832:~$ ls -la ~ +zpp@hecs-161832:~$ mkdir work_area && cd work_area && mkdir project_a && mkdir project_b && mkdir bocs +zpp@hecs-161832:~/work_area$ mv /home/zpp/.hidden.txt /home/zpp/work_area/bocs +zpp@hecs-161832:~/work_area$ mv /home/zpp/Visible1.txt /home/zpp/work_area/bocs +zpp@hecs-161832:~/work_area$ mv /home/zpp/Visible2.txt /home/zpp/work_area/bocs +zpp@hecs-161832:~/work_area$ ls +zpp@hecs-161832:~/work_area$ cd project_a +zpp@hecs-161832:~/work_area/project_a$ touch notes.txt && echo "fairy" +fairy +zpp@hecs-161832:~/work_area/project_a$ cd ../ +zpp@hecs-161832:~/work_area$ cd ../ +zpp@hecs-161832:~$ cd work_area +zpp@hecs-161832:~/work_area$ cp project_a /home/zpp/work_area/project_b -r && cd project_b && mv project_a project_a_backup +zpp@hecs-161832:~/work_area/project_b$ cd ../ +zpp@hecs-161832:~/work_area$ cd /home/zpp/work_area/bocs +zpp@hecs-161832:~/work_area/bocs$ ls -la +zpp@hecs-161832:~/work_area/bocs$ ls -laS +zpp@hecs-161832:~/work_area/bocs$ rm -f * +zpp@hecs-161832:~/work_area/bocs$ cd ../ +zpp@hecs-161832:~/work_area$ cd /home/zpp/work_area/project_b +zpp@hecs-161832:~/work_area/project_b$ cd ../ +zpp@hecs-161832:~/work_area$ rm -r project_b +zpp@hecs-161832:~/work_area$ cd ../ +zpp@hecs-161832:~$ rm -d work_area/ +rm: cannot remove 'work_area/': Directory not empty +zpp@hecs-161832:~$ cd work_area +zpp@hecs-161832:~/work_area$ rm -d work_area/ +rm: cannot remove 'work_area/': No such file or directory +zpp@hecs-161832:~/work_area$ cd ../ +zpp@hecs-161832:~$ cd /home/ +zpp@hecs-161832:/home$ vim .bashrc +zpp@hecs-161832:/home$ alias llh='ls -lh' +``` + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240524 \344\275\234\344\270\232\345\222\214\347\273\203\344\271\240.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240524 \344\275\234\344\270\232\345\222\214\347\273\203\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..8384c2ba0984a5e354e695de2aad7d32245b0241 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240524 \344\275\234\344\270\232\345\222\214\347\273\203\344\271\240.md" @@ -0,0 +1,331 @@ +相关和目录可自行创建后再操作 + + + +# 练习题: + +### 练习题 1:复制文件 + +假设你有两个目录:`/home/user/docs` 和 `/home/user/backup`。 + +1. 将`/home/user/docs`目录下的`file1.txt`复制到`/home/user/backup`目录下。 + + ``` + cp docs/file1.txt backup/ + ``` + +2. 复制`/home/user/docs`目录下的所有`.txt`文件到`/home/user/backup`目录下。 + + ``` + cp /home/zpp/docs/*.txt /home/zpp/backup/ + ``` + + + +### 练习题 2:复制文件夹及其内容 + +1. 假设`/home/user/photos`是一个包含多个图片文件夹的目录,请复制整个`/home/user/photos`目录及其所有内容到`/home/user/archive`目录下。 + + ``` + cp -R /home/zpp/photos /home/zpp/archive + ``` + + + +### 练习题 3:移动文件 + +1. 将`/home/user/docs`目录下的`file2.docx`移动到`/home/user/papers`目录下。 + +2. 如果`/home/user/papers`目录下已经有一个名为`file2.docx`的文件,请确保移动操作会询问你是否要覆盖它。 + + ``` + mv /home/zpp/docs/file2.docx /home/zpp/papers + 2. mv -i /home/zpp/docs/file2.docx /home/zpp/papers/ + 2.rsync /home/user/docs/file2.docx /home/user/papers -i + + ``` + + + +### 练习题 4:重命名文件 + +1. 将`/home/user/docs`目录下的`oldname.pdf`重命名为`newname.pdf`。 + + ``` + mv /home/zpp/docs/oldname.pdf /home/zpp/docs/newname.pdf + ``` + +### 练习题 5:结合使用 + +1. 复制`/home/user/docs`目录下的`report.md`到`/home/user/temp`,然后将复制过去的文件重命名为`temp_report.md`。 + + ``` + cp /home/zpp/docs/report.md /home/zpp/temp/temp_report.md + ``` + + + +2. 将`/home/user/docs`目录下所有以`.doc`结尾的文件移动到`/home/user/processed`,并且如果这些文件在目标目录中已经存在,则不覆盖它们。 + + ``` + mv -n /home/zpp/docs/*.doc /home/zpp/processed/ + ``` + + + +### 练习题 6:使用通配符 + +1. 复制`/home/user/docs`目录下所有以`.jpg`或`.png`结尾的图片文件到`/home/user/images`目录。 + + ``` + cp /home/zpp/docs/*.{jpg,png} /home/user/images/ + ``` + + + +### 练习题 7:详细输出 + +1. 使用`cp`命令复制文件时,显示详细的复制信息。 + + ``` + cp -v /home/zpp/docs/file.txt /home/zpp/backup/ + ``` + + + +2. 使用`mv`命令移动文件时,显示详细的移动信息。 + + ``` + mv -v /home/zpp/docs/*.txt /home/zpp/backup/ + ``` + +### 练习题 8:更新文件 + +1. 如果`/home/user/backup`目录中已经有一个与`/home/user/docs`目录下的`file1.txt`同名的文件,并且`/home/user/docs/file1.txt`的内容是更新的,请使用`cp`命令将更新的文件复制到备份目录,并覆盖旧文件(假设你知道旧文件可以被安全地覆盖)。 + + ``` + cp -f /home/zpp/docs/file1.txt /home/zpp/backup + ``` + + # 作业: + +1. 相关和目录可自行创建后再操作 + + 1. 在家目录下建立文件exam.c,将文件exam.c拷贝到/tmp这个目录下,并改名为 shiyan.c + + ~~~js + touch exam.c && mkdir tmp && mv exam.c /home/guan/tmp/ + ~~~ + + 2. 在任何目录下回到用户主目录? + + ~~~js + cd ~ + ~~~ + + + + 3. 用长格式列出/tmp/test目录下所有的文件包括隐藏文件? + + ~~~js + ls -la tmp/test/ + ~~~ + + + + 4. /tmp/test2目录下,创建5个文件分别是 1.txt 2.txt 3.txt 4.txt 5.txt,压缩这5个文件,压缩包的名字是hailiang.tar + + ~~~js + tar -cvzf hailiang.tar 1.txt 2.txt 3.txt 4.txt 5.txt + ~~~ + + + + 5. 当前目录,建立文件 file1.txt 并更名为 file2.txt? + + ~~~js + mv file1.txt file2.txt + ~~~ + + + + 6. 当前目录,用vim建立文件bbbb.txt 并将用户名的加入其中保存退出? + + ~~~js + vim bbbb.txt + 按i进入编辑模式,写完ESC退出编辑模式,shift+: 输入wq! 保存退出 + ~~~ + + + + 7. 将家目录中扩展名为txt、doc和bak的文件全部复制到/tmp/test目录中? + + ~~~js + cp -r *.txt *.doc *.bak /home/zpp/tmp/test + ~~~ + + + + 8. 将文件file1.txt从当前目录移动到家目录的/docs中。 + + ~~~js + mv file1.txt /home/zpp/docs/ + ~~~ + + + + 9. 复制文件file2.txt从当前目录到家目录/backup中。 + + ~~~js + cp -r file2.txt /home/zpp/backup/ + ~~~ + + + + 10. 将家目录/docs中的所有文件和子目录移动到家目录/archive中。 + + ~~~js + mv * /home/zpp/archive/ + ~~~ + + + + 11. 复制家目录/photos及其所有内容到家目录/backup中。 + + ~~~js + cp -r photos /home/zpp/backup/ + ~~~ + + + + 12. 将文件家目录/docs/report.doc移动到家目录/papers中,并将其重命名为final_report.doc。 + + ~~~js + mv report.doc ../papers/final_report.doc + ~~~ + + + + 13. 在家目录/docs中创建一个名为notes.txt的空文件,并将其复制到目录家目录/backup中。 + + ~~~js + cp notes.txt ../backup/ + ~~~ + + + + 14. 复制家目录/images中所有以.jpg结尾的文件到家目录/photos中。 + + ~~~js + cp /home/zpp/images/*.jpg /home/guan/photos/ + ~~~ + + + + 15. 将文件家目录/docs/file1.txt和家目录/docs/file2.txt复制到家目录/backup中。 + + ~~~js + cp file1.txt file2.txt ../backup/ + ~~~ + + + + 16. 将家目录/docs中的所有.txt文件复制到家目录/text_files中。 + + ~~~js + cp docs/*.txt text_files/ + ~~~ + + + + 17. 将家目录/docs中的所有文件移动到家目录/temp中,并且如果文件已存在,则覆盖它们。 + + ~~~js + cp -i docs/* temp/ + ~~~ + + + + 18. 将家目录/docs中的所有文件移动到家目录/archive中,并且在移动时显示详细的移动信息。 + + ~~~js + mv -v docs/* archive/ + ~~~ + + + + 19. 复制家目录/docs中的所有子目录及其内容到家目录/backup中。 + + ~~~js + cp -r docs/* backup/ + ~~~ + + + + 20. 将家目录/docs中的所有文件和子目录移动到家目录/backup中,但排除文件名以"temp_"开头的文件。 + + ~~~js + mv ~/docs/[^temp_]* ~/backup + ~~~ + + + + 21. 将目录/docs/report.txt移动到家目录/archive中,但如果目标目录中已存在同名文件,则不直接覆盖,先备份同名文件为report.txt_bak。 + + ~~~js + mv -bS_bak report.txt ../archive/ + ~~~ + + + + 22. 将家目录/docs中所有以.pdf结尾的文件复制到家目录/pdf_files中,并且如果目标目录中已存在同名文件,则忽略它们。 + + ~~~js + cp -i docs/*.pdf pdf_files/ + ~~~ + + #### 笔记 + + ##### cp复制 cp 源文件 目标目录 + + ~~~js + 复制到目录:cp 源文件 目标目录 + 复制文件到目录: cp 源文件 目标目录 + 复制目录:cp -r 源目录 目标目录 + 复制并改名:cp 文件1 目录1/文件2 //将文件1复制到目录1并改名为文件2 + 复制多个文件:cp 文件1 文件2 文件3 目录 + + 参数:-r 递归复制 + -i问是否覆盖 + -p 保留原属性,包括相间 + -v 显示详细的复制进度 + -u 源文件比目标文件新时才会覆盖 + -f 强制复制 + -b 备份文件 + ~~~ + + #### mv移动 + + 1. 当是移动时,只能是文件移到目录 + 2. 如何分辩是移动还是重命名 + 1. 源文件 - 目标文件 + 1. 目标已经存在:源文件替换了目标文件 + 2. 目标不存在:直接将源文件改名为目标文件 + 2. 源文件 -目标目录 + 1. 目标存在:将源文件移到目标目录里 + 2. 目标不存在:重命名 + 3. 源目录 - 目标目录 + 1. 目标已存在:将源移到目标里 + 2. 已经不存在:重命名 + + ~~~js + mv 文件 目标目录 + 移动并重命名:mv 源文件 目标目录/新名字 + mv 源目录 目标目录/新名字 + ~~~ + + + +2. ```js + cp -n ~/docs/*.pdf ~/pdf_files + ``` \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240525 \347\233\270\345\257\271\350\267\257\345\276\204\347\273\235\345\257\271\350\267\257\345\276\204.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240525 \347\233\270\345\257\271\350\267\257\345\276\204\347\273\235\345\257\271\350\267\257\345\276\204.md" new file mode 100644 index 0000000000000000000000000000000000000000..addc269a42cd3764a069fd96368025eb4a0fbcbf --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240525 \347\233\270\345\257\271\350\267\257\345\276\204\347\273\235\345\257\271\350\267\257\345\276\204.md" @@ -0,0 +1,471 @@ +相关和目录可自行创建后再操作 + +1. 在家目录下建立文件exam.c,将文件exam.c拷贝到/tmp这个目录下,并改名为 shiyan.c + + ```bash + touch exam.c + cp exam.c ../../tmp/shiyan.c + ``` + + + +2. 在任何目录下回到用户主目录? + + ```bash + cd ~ + ``` + + + +3. 用长格式列出/tmp/test目录下所有的文件包括隐藏文件? + + ```bash + mkdir ../../tmp/test + ls -la ../../tmp/test/.* ../../tmp/test/* + ``` + + + +4. /tmp/test2目录下,创建5个文件分别是 1.txt 2.txt 3.txt 4.txt 5.txt,压缩这5个文件,压缩包的名字是hailiang.tar + + ```bash + mkdir ../../tmp/test2 + touch ../../tmp/test2/{1..5}.txt + tar -czvf hailiang.tar.gz ../../tmp/test2/{1..5}.txt + ``` + + + +5. 当前目录,建立文件 file1.txt 并更名为 file2.txt? + + ```bash + mkdir ../../tmp/file1.txt + mv ../../tmp/file1.txt ../../tmp/file2.txt + ``` + + + +6. 当前目录,用vim建立文件bbbb.txt 并将用户名的加入其中保存退出? + + ```bash + touch ../../tmp/bbbb.txt && vim ../../tmp/bbbb.txt + ``` + + + +7. 将家目录中扩展名为txt、doc和bak的文件全部复制到/tmp/test目录中? + + ```bash + mkdir 1.txt 1.doc 1.back + cp *.txt *.doc *.back ../../tmp/test + ``` + + + +8. 将文件file1.txt从当前目录移动到家目录的/docs中。 + + ```bash + touch ../../tmp/file1.txt + + mv ../../tmp/file1.txt docs + ``` + + + +9. 复制文件file2.txt从当前目录到家目录/backup中。 + + ```bash + mkdir backup + cp-r ../../tmp/file2.txt backup + ``` + + + +10. 将家目录/docs中的所有文件和子目录移动到家目录/archive中。 + + ```bash + mkdir archive + mv docs archive + ``` + + + +11. 复制家目录/photos及其所有内容到家目录/backup中。 +```bash +mkdir photos +cp -r photos backup +``` + + +12. 将文件家目录/docs/report.doc移动到家目录/papers中,并将其重命名为final_report.doc。 +```bash +touch docs/report.doc +mv docs/report.doc papers/final_report.doc +``` + +13. 在家目录/docs中创建一个名为notes.txt的空文件,并将其复制到目录家目录/backup中。 +```bash +touch ~/docs/notes.txt +mkdir backup +mv notes.txt backup +cp ~/docs/notes.txt ~/backup +``` +14. 复制家目录/images中所有以.jpg结尾的文件到家目录/photos中。 +```bash +mkdir images && touch images/1.jpg images/2.jpg +cp images/*.jpg photos +``` +15. 将文件家目录/docs/file1.txt和家目录/docs/file2.txt复制到家目录/backup中。 +```bash +touch docs/file1.txt docs/file2.txt +cp ~/docs/{file1.txt,file2.txt} ~/backup +cp docs/file1.txt docs/file2.txt backup +``` + +16. 将家目录/docs中的所有.txt文件复制到家目录/text_files中。 +```bash +mkdir text_files +cp docs/*.txt text_files //错 +cp ~/docs/*.txt ~/text_files //对 +``` + +17. 将家目录/docs中的所有文件移动到家目录/temp中,并且如果文件已存在,则覆盖它们。 +```bash +mkdir temp +mv -f docs/* temp +``` + +18. 将家目录/docs中的所有文件移动到家目录/archive中,并且在移动时显示详细的移动信息。 +```bash +mv -v docs/* archive +``` + +19. 复制家目录/docs中的所有子目录及其内容到家目录/backup中。 +```bash +cp docs/* backup +``` + +20. 将家目录/docs中的所有文件和子目录移动到家目录/backup中,但排除文件名以"temp_"开头的文件。 +```bash +mkdir docs +mkdir docs/temp_file docs/111 docs/222 +mv docs/[^temp_]* backup + + +find ~/docs -type f ! -name 'temp_*' -exec mv -t ~/backup {} + +find ~/docs -type d ! -name 'temp_*' -exec mv -t ~/backup {} + +//find ~/docs:在~/docs目录下查找文件和目录。 + + -type f:指定只查找文件。 + + ! -name 'temp_*':排除那些文件名以"temp_"开头的文件。 + + -exec mv -t ~/backup {} +:对于查找到的每个文件,执行mv命令将其移动到~/backup目录。{}是占位符,代表查找到的文件名,+表示尽可能多地组合文件名以减少mv命令的调用次数。 + + 第二行命令与第一行类似,但是使用了-type d来指定只查找目录。 +``` + +21. 将目录/docs/report.txt移动到家目录/archive中,但如果目标目录中已存在同名文件,则不直接覆盖,先备份同名文件为report.txt_bak。 +```bash +touch docs/report.txt archive/report.txt +mv -bS _bak docs/report.txt archive +``` + +22. 将家目录/docs中所有以.pdf结尾的文件复制到家目录/pdf_files中,并且如果目标目录中已存在同名文件,则忽略它们。 +```bash +touch docs/1.pdf docs/2.pdf +mkdir pdf_files +cp -n docs/*.pdf pdf_files +``` + +相关和目录可自行创建后再操作 + +1. 在家目录下建立文件exam.c,将文件exam.c拷贝到/tmp这个目录下,并改名为 shiyan.c + + ~~~js + touch /home/zqr/exam.c && mv /home/zqr/exam.c /tmp/shiyan.c + ~~~ + + ~~~js + touch ~/exam.c && mv ~/exam.c /tmp/shiyan.c + ~~~ + +2. 在任何目录下回到用户主目录? + + ~~~js + cd /home/zqr/ + ~~~ + + ~~~js + cd ~ + ~~~ + + + +3. 用长格式列出/tmp/test目录下所有的文件包括隐藏文件? + + ~~~js + ls -la /tmp/test/ + ~~~ + + ~~~js + ls -la /tmp/test/ + ~~~ + + + +4. /tmp/test2目录下,创建5个文件分别是 1.txt 2.txt 3.txt 4.txt 5.txt,压缩这5个文件,压缩包的名字是hailiang.tar + + ~~~js + touch /tmp/test2/{1..5}.txt + + tar -cvzPf hailiang.tar /tmp/test2/*.txt + ~~~ + + ~~~js + tar -cvzPf hailiang.tar /tmp/test2/*.txt + ~~~ + + + +5. 当前目录,建立文件 file1.txt 并更名为 file2.txt? + + ~~~js + mv /tmp/test2/file1.txt /tmp/test2/file2.txt + ~~~ + + ~~~js + mv file1.txt file2.txt + ~~~ + + + +6. 当前目录,用vim建立文件bbbb.txt 并将用户名的加入其中保存退出? + + ~~~js + vim /tmp/test2/bbbb.txt + 按i进入编辑模式,写完ESC退出编辑模式,shift+: 输入wq! 保存退出 + ~~~ + + ~~~js + vim bbbb.txt + ~~~ + + + +7. 将家目录中扩展名为txt、doc和bak的文件全部复制到/tmp/test目录中? + + ~~~js + cp /home/zqr/*.txt /home/zqr/*.doc /home/zqr/*.bak /tmp/test/ + ~~~ + + ~~~js + cp ~/*.txt ~/*.doc ~/*.bak /tmp/test/ + ~~~ + + + +8. 将文件file1.txt从当前目录移动到家目录的/docs中。 + + ~~~js + mv /tmp/test2/file1.txt /home/zqr/docs/ + ~~~ + + ~~~js + mv /tmp/test2/file1.txt ~/docs/ + ~~~ + + + +9. 复制文件file2.txt从当前目录到家目录/backup中。 + + ~~~js + cp /tmp/test2/file2.txt /home/zqr/backup/ + ~~~ + + ~~~js + cp file2.txt ~/backup/ + ~~~ + + + +10. 将家目录/docs中的所有文件和子目录移动到家目录/archive中。 + + ~~~js + mv /home/zqr/docs/* /home/zqr/archive/ + ~~~ + + ~~~js + mv ~/docs/* ~/archive/ + ~~~ + + + +11. 复制家目录/photos及其所有内容到家目录/backup中。 + + ~~~js + cp -r /home/zqr/photos /home/zqr/backup/ + ~~~ + + ~~~js + cp -r ~/photos ~/backup/ + ~~~ + + + +12. 将文件家目录/docs/report.doc移动到家目录/papers中,并将其重命名为final_report.doc。 + + ~~~js + mv /home/zqr/docs/report.doc /home/zqr/papers/final_report.doc + ~~~ + + ~~~js + mv ~/docs/report.doc ~/papers/final_report.doc + ~~~ + + + +13. 在家目录/docs中创建一个名为notes.txt的空文件,并将其复制到目录家目录/backup中。 + + ~~~js + touch /home/zqr/docs/notes.txt + cp /home/zqr/docs/notes.txt /home/zqr/backup/ + ~~~ + + ~~~js + touch ~/docs/notes.txt + cp ~/notes.txt ~/backup/ + ~~~ + + + +14. 复制家目录/images中所有以.jpg结尾的文件到家目录/photos中。 + + ~~~js + cp /home/zqr/images/*.jpg /home/zqr/photos/ + ~~~ + + ~~~js + cp ~/images/*.jpg ~/photos/ + ~~~ + + + +15. 将文件家目录/docs/file1.txt和家目录/docs/file2.txt复制到家目录/backup中。 + + ~~~js + cp /home/zqr/docs/file1.txt /home/zqr/docs/file2.txt /home/zqr/backup/ + ~~~ + + ~~~js + cp file1.txt file2.txt ../backup/ + ~~~ + + + +16. 将家目录/docs中的所有.txt文件复制到家目录/text_files中。 + + ~~~js + cp /home/zqr/docs/*.txt /home/zqr/text_files/ + ~~~ + + ~~~Js + cp ~/docs/*.txt ~/text_files/ + ~~~ + + + +17. 将家目录/docs中的所有文件移动到家目录/temp中,并且如果文件已存在,则覆盖它们。 + + ~~~js + cp -i /home/zqr/docs/* /home/zqr/temp/ + ~~~ + + ~~~js + cp -i ~/docs/* ~/temp/ + ~~~ + + + +18. 将家目录/docs中的所有文件移动到家目录/archive中,并且在移动时显示详细的移动信息。 + + ~~~js + mv -v /home/zqr/docs/* /home/zqr/archive/ + ~~~ + + ~~~js + mv -v ~/docs/* ~/archive/ + ~~~ + + + +19. 复制家目录/docs中的所有子目录及其内容到家目录/backup中。 + + ~~~js + cp -r /home/zqr/docs/* /home/zqr/backup/ + ~~~ + + ~~~js + cp -r ~/docs/* ~/backup/ + ~~~ + + + +20. 将家目录/docs中的所有文件和子目录移动到家目录/backup中,但排除文件名以"temp_"开头的文件。 + + ~~~js + cd /home/zqr/docs + mv !(temp_*) /home/zqr/backup + ~~~ + + ~~~js + cd ~/docs + mv !(temp_*) ~/backup + ~~~ + + + +21. 将目录/docs/report.txt移动到家目录/archive中,但如果目标目录中已存在同名文件,则不直接覆盖,先备份同名文件为report.txt_bak。 + + ~~~js + mv -bS_bak /home/zqr/report.txt /home/zqr/archive/ + ~~~ + + ~~~js + mv -bS_bak ~/report.txt ~/archive/ + ~~~ + + + +22. 将家目录/docs中所有以.pdf结尾的文件复制到家目录/pdf_files中,并且如果目标目录中已存在同名文件,则忽略它们。 + +~~~js +cp -f /home/zqr/docs/*.pdf /home/zqr/pdf_files/ +~~~ + +~~~js +cp -f ~/docs/*.pdf ~/pdf_files/ +~~~ + + + +#### 笔记 + + 绝对路径:从根目录 `/` 开始的完整路径,用于唯一确定文件或目录的位置 + +​ 以 `/` 开头 + +相对路径:相对于当前工作目录的路径,用于在当前目录的基础上指向文件或目录 + +​ 不以 `/` 开头 + +~~~js +表示当前目录 ./ +表示上一级目录../ + 在Linux中,绝对路径是指从根目录开始的完整路径,包括所有的目录和子目录12。相对路径是指相对于当前工作目录的路径132。相对路径不以/开头,绝对路径以/开头3。使用绝对路径可以访问文件系统中或其他位置的文件或文件夹,而无需切换当前目录1。使用最短路径原则,如果切换的目录离当前目录近可以使用相对路径,如果切换的目录离根目录近可以使用绝对路径4。绝对路径和相对路径的使用4: +使用绝对路径切换到桌面:cd /home/python/Desktop +在下载目录以相对路径切换到桌面:cd ./Desktop +当敲出文件或者目录或者命令的前几个字母之后,按下tab键,如果输入的没有歧义,系统会自动补全。 +当切换目录或者使用命令的时候,如果不确定当前目录下有那些子目录或者其它命令,可以通过两次tab键查看。 +~~~ + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240527 \346\237\245\350\257\242\345\221\275\344\273\244\347\233\270\345\205\263\347\232\204\347\273\203\344\271\240.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240527 \346\237\245\350\257\242\345\221\275\344\273\244\347\233\270\345\205\263\347\232\204\347\273\203\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..a78714023b3a53d80a491a6fbcbcd7270b573fc1 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240527 \346\237\245\350\257\242\345\221\275\344\273\244\347\233\270\345\205\263\347\232\204\347\273\203\344\271\240.md" @@ -0,0 +1,97 @@ +### 操作题 + +1. **查找当前目录及其子目录中所有扩展名为 `.log` 的文件**: + ```bash +touch 1.log +find ./ -type f -name "*.log" + ``` + +2. **在 `/var/logs` 目录及其子目录中查找所有包含关键字 `error` 的文件,并显示匹配的行**: + + ```bash +find /var/logs -type f -exec grep -H 'error' {} \; + find ./ -type f -name *.txt -exec grep 'error' {} +; +``` + +3. **在 `/home/user/docs` 目录中查找文件名包含 `report` 的所有文件**: + + ```bash + find ./docs -type f -name "report*" +``` + +4. **查找 `/etc` 目录中最近7天内修改过的文件**: + ```bash + find /etc -mtime -7 + find /etc/ -type f -mtime -10 +``` + +5. **显示 `/usr/bin` 目录中名为 `python` 的可执行文件的路径**: + + ```bash + find ./usr/bin/ -type f -name "python*" +``` + +6. **查找系统中名为 `ls` 的命令及其手册页位置**: + + ```bash + whereis ls 1 +``` + +7. **查找当前目录中包含关键字 `TODO` 的所有文件,并显示匹配的行和文件名**: + ```bash + grep -rn --include='*.txt' "TODO" . +find ./ -type f -exec grep -rn "TODO" {} \; + find ./ -type f -exec grep -rn "TODO" {} +; +``` + +8. **在 `/home/user/projects` 目录中查找所有包含关键字 `function` 的 `.js` 文件**: + + ```bash +grep -rn --include='*.js' "function" /home/user/projects + find /home/user/projects -type f -name "*.js" -exec grep -rn "function" {} \; +find ./ -type f -name "*.js" -exec grep -H "function" {} +; + ``` + +9. **查找并显示当前目录及其子目录中所有空文件**: + + ```bash +find ./ -type f -empty + ``` + +10. **在 `/var/www` 目录中查找包含关键字 `database` 的所有文件,并只显示文件名**: + + ```bash + find /var/www -type f -exec grep -l "database" {} +; + ``` + +### 综合操作题 + +**综合操作题:** + +假设你在一个名为 `/home/user/workspace` 的目录中工作。你需要完成以下任务: + +1. 查找该目录中所有扩展名为 `.conf` 的文件。 +2. 在这些 `.conf` 文件中查找包含关键字 `server` 的行。 +3. 将包含关键字 `server` 的文件名和匹配的行保存到一个名为 `server_lines.txt` 的文件中。 + +**预期命令步骤:** + +1. 查找所有扩展名为 `.conf` 的文件: + ```bash + mkdir workspace + echo server >workspace/1.conf + find ./workspace -type f -name "*.conf" + ``` + +2. 在这些 `.conf` 文件中查找包含关键字 `server` 的行: + ```bash + grep -r "server" /home/user/workspace/*.conf +``` + +3. 将结果保存到 `server_lines.txt` 文件中: + ```bash + touch workspace/server_lines.txt + grep -r "server" /home/user/workspace/*.conf > /home/user/workspace/server_lines.txt +``` + +通过这套操作题和综合操作题,你可以全面地了解和应用Linux系统中与文件和内容查询相关的常用命令。 \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240529 \346\226\207\344\273\266\345\206\205\345\256\271\346\237\245\347\234\213.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240529 \346\226\207\344\273\266\345\206\205\345\256\271\346\237\245\347\234\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..de39cae1f298ba0e6c9b282c88549b9e794cb4a6 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240529 \346\226\207\344\273\266\345\206\205\345\256\271\346\237\245\347\234\213.md" @@ -0,0 +1,273 @@ +**以下所有操作都在家目录执行:** + +### `cat` 命令操作题 + +1. **操作题一**:使用 `cat` 命令显示 `/etc/passwd` 文件的内容。 + + ~~~bash + cat /etc/passwd + ~~~ + + + +2. **操作题二**:将文件 `/etc/passwd` 的内容复制到 `passwd_bak.txt` 文件中,但不使用 `cp` 命令。 + + ~~~bash + cat /etc/passwd > passwd_bak.txt + ~~~ + + + +3. **操作题三**:新建两个文件 `file1.txt` 和 `file2.txt`,分别写一些不同的内容,再将这两个文件的内容合并到一个新的文件 `file3.txt` 中。 + + ~~~bash + cat file1.txt file2.txt >file3.txt + ~~~ + + + +### `tac` 命令操作题 + +1. 使用命令从尾部开始显示 `bigfile.txt` 文件的内容。 + + ~~~bash + tac bigfile.txt + ~~~ + + + +2. 尝试找出 `bigfile.txt` 文件的最后一行内容,只使用 `tac` 命令。 + + ~~~bash + tac bigfile.txt | tail -n 1 + ~~~ + + + +3. 查看 `bigfile.txt` 文件的最后5行内容。 + + ~~~bash + tac bigfile.txt | head -n 5 + ~~~ + + + +4. 倒序查看 `bigfile.txt` 文件的最后5行内容。 + + ~~~bash + tac bigfile.txt | tail -n 5 + ~~~ + + + +### `more` 命令操作题 + +1. **操作题一**:使用 `more` 命令查看 `bigfile.txt` 文件的内容,并在查看过程中使用空格键翻页。 + + ~~~bash + more bigfile.txt + ~~~ + + + +2. **操作题二**:在 `more` 命令的查看过程中,如何使用回车键来逐行查看文件内容? + + ~~~bash + more bigfile.txt + ~~~ + + + +3. **操作题三**:如何在 `more` 命令中搜索`bigfile.txt`特定字符串(例如 "error")并跳转到下一个匹配项? + + ~~~bash + more bigfile.txt //斜杠搜索 + ~~~ + + + +### `less` 命令操作题 + +1. **操作题一**:使用 `less` 命令查看 `bigfile.txt` 文件,并快速定位到文件的末尾 + + ~~~bash + less bigfile.txt // 按大写G快速到末尾 + ~~~ + + + +2. **操作题二**:在 `less` 命令中,如何向上和向下滚动文件内容? + + ~~~bash + 可以用方向键的上下键来滚动或者用鼠标滚轮也可以 + ~~~ + + + +3. **操作题三**:在 `less` 命令中,如何搜索`bigfile.txt`一个特定的函数名(例如 `def my_function`),并查看所有匹配项? + + ~~~bash + less bigfile.txt + 按/ 之后输入def my_function(要搜索的字符串)回车 + 然后按n来跳转到下一个匹配项 + 按 N 跳转到上一个匹配项 + ~~~ + + + +### `head` 命令操作题 + +1. **操作题一**:使用 `head` 命令显示 `bigfile.txt` 文件的前5行内容。 + + ~~~bash + head -n 5 bigfile.txt + ~~~ + + + +2. **操作题二**:将 `bigfile.txt` 的前20行内容保存到 `bigfile_20.txt` 文件中。 + + ~~~bash + head -n 20 bigfile.txt > bigfile_20.txt + ~~~ + + + + + +3. **操作题三**:如何结合 `head` 和 `grep` 命令来查找 `bigfile.txt` 文件中以 "A" 开头的前10行? + + ~~~bash + grep "^A" bigfile.txt | head -10 + ~~~ + + + +### `tail` 命令操作题 + +1. **操作题一**:使用 `tail` 命令显示 `bigfile.txt` 文件的最后20行内容。 + + ~~~bash + tail -n 20 bigfile.txt + ~~~ + + + +2. **操作题二**:如何实时跟踪一个正在写入的日志文件(如 `bigfile.txt`)的最后10行内容? + + ~~~bash + tail -f -n 20 bigfile.txt + ~~~ + + + +3. **操作题三**:在 `tail` 命令中,如何反向显示文件的最后10行内容(即按从旧到新的顺序显示)? + + ~~~bash + tac bigfile.txt | tail -n 10 + ~~~ + + + +### 综合题 + +**综合题**:假设你有一个非常大的日志文件 `bigfile.txt`,你需要找出所有包含 "ERROR" 字符串的行,并查看这些行及其之前的两行内容。如何结合使用 `grep`、`head`、`tail` 和其他命令来完成这个任务? + +**提示**:你可能需要多次使用 `grep` 来找到包含 "ERROR" 的行,并使用 `tail` 和 `head` 来提取这些行及其前后的内容。另外,考虑使用管道(`|`)来连接命令。 + +~~~bash +grep "ERROR" bigfile.txt | head -n 2 +~~~ + + + +### 笔记 + +##### cat + +~~~bash +cat [选项] 文件 ... +# 作用:显示文件内容,也可以将多个文件内容连接在一起输出 +显示文件内容:cat fil~e.txt +连接多个文件内容:cat file1.txt file2.txt +连接多个文件内容:cat file1.txt file2.txt +~~~ + +##### more + +~~~bash +more [选项] 文件 +# 作用:分页显示文件内容,每次显示一屏。即按页显示文件内容 +分页显示文件内容:more file.txt +使用空格键向下翻页,回车键显示下一行,q键退出 + +常用于按页查看大文件,但会先一次性加载整个大文件,导致加载变慢 +~~~ + +##### less + +~~~bash +当你要查看一个大文件时,通常用less命令一页一页加载,类似more的分页显示:less file.txt +less [选项] 文件 +# 作用:与`more`类似,但提供了更多的导航和搜索功能,如上下滚动、搜索等 + + - 使用上下键、Page Up/Page Down键进行滚动,/搜索,n下一个匹配,N上一个匹配,q退出 + + -N 显示行号 + -M 显示长提示符,包括文件名和行号,百分比 + -MN 内容中显示行号,底部显示文件名,行号和百分比 + -m 或 -i 搜索时忽略大小写 + +行数 打开文件后立即跳转到指定的行数 +~~~ + +##### head + +~~~bash +当你想要快速查看文件的前几行内容而不必打开整个文件时,可以使用 head 命令 + +head [选项] 文件 ... +# 作用:显示文件开头的内容(默认10行) + +显示文件开头的10行:head file.txt +显示多个文件开头的10行:head file1.txt file2.txt +使用-n选项指定行数:head -n 20 file.txt(显示前20行) +js使用-q不显示文件名。当使用多个文件作为输入时,该选项可以省略文件名前的标题 +~~~ + +##### tail + +~~~bash +tail 用于查看文件的末尾内容 + +tail [选项] 文件... +# 作用:显示文件结尾的内容(默认10行) + +显示文件结尾的10行:tail file.txt +显示多个文件结尾的10行:tail file1.txt file2.txt 加-q不显示文件名 +使用`-n`选项指定行数:tail -n 20 file.txt(显示最后20行) +实时查看文件增长(如日志文件):tail -f logfile.txt + +-n 显示文件的最后指定行数。如果不指定行数,则默认为显示最后10行 +-f 实时追踪文件的变化并输出新增的内容。通常用于监视日志文件的增长 +-q 不显示文件名。当使用多个文件作为输入时,该选项可以省略文件名前的标题 +~~~ + +##### nl + +~~~bash +nl [选项] 文件... +# 作用: 显示文件内容,并添加行号(空行不加) +为文件内容添加行号 +~~~ + +##### do + +~~~~bASh +od [OPTIONS] [FILE]... + 以八进制、十进制、十六进制或其他格式转储文件内容 + + 显示文件内容的八进制表示:od -An -t o file.txt + 显示文件内容的十六进制表示:od -An -t x1 file.txt + 使用`-c`选项显示字符:od -c file.txt +~~~~ + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240530 \350\277\220\347\273\264\344\272\272\345\221\230\345\277\205\345\244\207\345\221\275\344\273\244\345\260\217\351\242\204\344\271\240.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240530 \350\277\220\347\273\264\344\272\272\345\221\230\345\277\205\345\244\207\345\221\275\344\273\244\345\260\217\351\242\204\344\271\240.md" new file mode 100644 index 0000000000000000000000000000000000000000..d6cf6629f51feab72d71d6c93b55ce3ea780cd5b --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240530 \350\277\220\347\273\264\344\272\272\345\221\230\345\277\205\345\244\207\345\221\275\344\273\244\345\260\217\351\242\204\344\271\240.md" @@ -0,0 +1,163 @@ +查看系统信息: + +``` +查看操作系统内核版本和系统架构信息。 +查看 Linux 发行版信息。 +查看操作系统版本信息。 +``` + +管理文件系统: + +``` +查看文件系统使用情况。 +查看目录或文件的磁盘使用情况。 +列出目录中的文件和子目录,并显示详细信息。 +``` + +进程管理: + +``` +查看当前运行的所有进程。 +实时监视系统的进程和资源使用情况。 +结束指定进程,其中 PID 是进程 ID。 +``` + +日志管理: + +``` +实时查看系统日志。 +在日志文件中搜索关键词。 +``` + +网络管理: + +``` +查看网络接口信息。 +查看当前网络连接和监听端口。 +测试与目标 IP 地址的连通性。 +跟踪数据包到达目标域名的路径。 +``` + +用户和权限管理: + +``` +查看当前登录用户。 +修改指定用户的密码。 +修改文件的所有者和所属组。 +修改文件或目录的权限。 +``` + +软件包管理: + +``` +更新本地软件包列表。 +升级已安装的软件包。 +安装指定软件包。 +卸载指定软件包。 +``` + +系统维护: + +``` +立即关机或重启系统。 +编辑定期执行的任务列表。 +``` + +安全性检查: + +``` +查看防火墙状态。 +检查系统上运行的服务和监听端口。 +``` + +备份和恢复: + +``` +创建压缩的 tar 存档。 +解压 tar 存档。 +在两个目录之间同步文件。 +``` + + 1cut [-d delimiter] [-f fields] + ``` + +- **参数说明**: + + - `-d` 指定列分隔符,默认为制表符(tab)。 + - `-f` 指定要提取的字段范围,可以是单个字段(如 `-f2` 提取第二列)或范围(如 `-f2-4` 提取第2到第4列)。 + +### join + +`join` 命令用于将两个已经排序的文件中,基于一个共同字段进行合并。这个命令常用于数据库风格的数据处理。 + +- **基本语法**: + + Bash + + ``` + 1join [-t delimiter] [-1 field1] [-2 field2] file1 file2 + ``` + +- **参数说明**: + + - `-t` 指定输入文件的字段分隔符,默认为空格。 + - `-1` 指定第一个文件中用于连接的字段。 + - `-2` 指定第二个文件中用于连接的字段。 + +### sort + +`sort` 命令用于对输入的文本行进行排序。 + +- **基本语法**: + + Bash + + ``` + 1sort [-t 分隔符] [-k n1[,n2]] [-nr] [file] + ``` + +- **参数说明**: + + - `-t` 指定排序时使用的字段分隔符。 + - `-k` 指定排序的字段,可以是单个字段或范围,如 `-k2,3` 表示根据第二列到第三列排序。 + - `-n` 按照数值大小排序。 + - `-r` 反向排序。 + +### uniq + +`uniq` 命令用于报告或忽略文件中重复的行。通常在排序后的数据上使用效果最好,因为 `uniq` 默认只删除相邻的重复行。 + +- **基本语法**: + + Bash + + ``` + uniq [-c] [-u] [-d] [input_file] + ``` + +- **参数说明**: + + - `-c` 在每行前加上该行在文件中出现的次数。 + - `-u` 只显示唯一的行。 + - `-d` 只显示重复的行。 + +### wc + +`wc` (Word Count)命令用于统计文件中的字节数、单词数、行数。 + +- **基本语法**: + + Bash + + ``` + 1wc [-clw] [file] + ``` + +- **参数说明**: + + - `-c` 计算字节数。 + - `-l` 计算行数。 + - `-w` 计算单词数。 + +这些命令经常被组合使用,以进行复杂的数据处理和分析任务 + ``` \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240601 sed \346\223\215\344\275\234\344\275\234\344\270\232.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240601 sed \346\223\215\344\275\234\344\275\234\344\270\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..46712cf41b9eeadb5b0b0b89cbcecdc36722227f --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240601 sed \346\223\215\344\275\234\344\275\234\344\270\232.md" @@ -0,0 +1,347 @@ +#### 作业 + +### exam.txt 文件内容: + +``` +This is a text file for practice. +It contains some words like dog, cat, and bird. +There are also numbers like 123 and 456. +# heihei +We will use sed to manipulate this file. +``` + +#### 修改操作 + +1. 使用 `sed` 将文件 `exam.txt` 中所有的 "dog" 替换为 "cat",并将结果输出到标准输出。 + +```bash +sed 's/dog/cat/g' exam.txt +``` + +1. 使用 `sed` 将文件 `exam.txt` 中所有的 "123" 替换为 "OneTwoThree",并将结果保存到新文件 `updated_exam.txt` 中。 + +```bash +sed s/123/IneTwoThree/g exam.txt >updateed_exam.txt +``` + +#### 删除操作 + +1. 使用 `sed` 删除文件 `exam.txt` 中所有以 "#" 开头的注释行,并将结果输出到标准输出。 + +``` +sed -n '/^#/d' exam.txt +``` + +1. 使用 `sed` 删除文件 `exam.txt` 中所有包含 "words" 的行,并将结果保存到新文件 `clean_exam.txt` 中。 + +``` +sed '/words/d' exam.txt > clean_exam.txt +``` + +#### 插入操作 + +1. 使用 `sed` 在文件 `exam.txt` 的第2行插入一行 "Welcome to sed manipulation",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed '2i\Welcome to sed' exam.txt > updated_exam.txt +``` + +1. 使用 `sed` 在文件 `exam.txt` 的`numbers`所在行插入一行 "This is a new line",并将结果输出到标准输出。 + +``` +sed '/numbers/c\This is a new line' exam.txt +``` + +#### 追加操作 + +1. 使用 `sed` 在文件 `exam.txt` 的末尾追加一行 "End of practice",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed '$a\End of practie' exam.txt > updated_exam.txt +``` + +1. 使用 `sed` 在文件 `exam.txt` 的每一行末尾追加内容 " - 2024-05-31",并将结果输出到标准输出。 + +``` +sed -n 's/$/- 2024-05-31/p' exam.txt +``` + +#### 整行替换操作 + +1. 使用 `sed` 将文件 `exam.txt` 中所有以字母 "W" 开头的行替换为 "Not Available",并将结果输出到标准输出。 + +``` + sed '/^W/c\Not Available' exam.txt +``` + +1. 使用 `sed` 将文件 `exam.txt` 中所有包含 "words" 的行替换为 "Replaced",并将结果保存到新文件 `updated_exam.txt` 中。 + +``` +sed '/words/c\Replaced' exam.txt > updated_exam.txt +``` + +#### 多命令操作 + +1. 使用 `sed` 删除文件 `exam.txt` 中`dog`所在行,`file`换成`文件`,并将结果输出到标准输出。 + +``` +sed '/cat/d' exam.txt ; s/file/文件/g' exam.txt +sed -e '/dog/d' -e 's/file/文件/' exam.txt +``` + +1. 使用 `sed` 将文件 `exam.txt` 中,删除空白行并将所有以 "It" 开头的行替换为 "This", + +``` +sed '/^$/d ; s/^It/This/' exam.txt +``` + +#### 脚本文件操作 + +1. 创建一个 `sed` 脚本文件 `replace_apple_with_orange.sed`,实现将文件 `exam.txt` 中所有 "apple" 替换为 "orange" 的功能,并将结果输出到标准输出。 + +``` +s/apple/orange/ +``` + +运行脚本: + +``` +sed -f replace_apple_with_orange.sed exam.txt +``` + +1. 创建一个 `sed` 脚本文件 `remove_blank_lines.sed`,实现删除文件 `exam.txt` 中所有空白行的功能,并将结果保存到新文件 `cleaned_exam.txt` 中。 + +``` +/^$/d +``` + +运行脚本: + +``` +sed -f remove_blank_lines.sed exam.txt +``` + +#### 练习 + +为了设计一个素材文件,使得上述所有操作题都可以在这个文件上执行,我们可以创建一个名为 `lianxi.txt` 的文件,其中包含以下内容: + +```sh +# This is a comment line in the file +apple +This is an apple on the table. +Another apple is in the basket. + +banana +I like to eat banana for breakfast. + +A line with some text +A line starting with A + +Line 1 of report +Line 2 of report +... + +# A configuration option +# This is another comment + +Email: someone@example.com +This is a test email address: test@example.com + +A note about something + +Another note + +color is an important concept in art. +I like this color. +``` + +接下来,我们可以使用 `sed` 命令来执行上述操作题: + +### 操作题 1 + +1. 使用 `sed` 将文件 `lianxi.txt` 中所有的 "apple" 替换为 "banana",并将结果输出到标准输出。 + +```bash +sed 's/apple/banana/g' lianxi.txt +``` + +2. 使用 `sed` 删除文件 `lianxi.txt` 中所有以字母 "A" 开头的行,并将结果保存到新文件 `clean_data.csv` 中。 + +```bash + sed '/^A/d lianxi.txt' > clean_data.csv + sed -n '/^A/!p' lianxi.txt > clean_data.csv + +``` + +注意:尽管我们保存为 `.csv`,但内容并不是 CSV 格式。 + +3. 使用 `sed` 在文件 `lianxi.txt` 的每一行开头插入文本 "Line:",并将结果覆盖原始文件。 + +```bash +sed -i 's/^/Line/' lianxi.txt +``` + +或者(如果支持 `-i` 选项直接修改文件): + +```bash + +``` + +### 操作题 2 + +1. 使用 `sed` 将文件 `lianxi.txt` 中所有以 "#" 开头的行(注释行)删除,然后将结果输出到标准输出。 + +```bash +sed '/^#/d' lianxi.txt +``` + +2. 使用 `sed` 在文件 `lianxi.txt` 中每一行的末尾追加文本 " - The End",并将结果保存到新文件 `story_end.txt` 中。 + +```bash +sed 's/$/-The End/' lianxi.txt >story_end.txt +``` + +3. 使用 `sed` 将文件 `lianxi.txt` 中第10行至第20行的内容输出到标准输出。 + +```bash +sed -n '10,20p' lianxi.txt +``` + +### 操作题 3 + +1. 使用 `sed` 找到文件 `lianxi.txt` 中所有包含 "@example.com" 的邮箱地址,并将结果输出到标准输出。 + +```bash +sed -n '/@example.com/p' lianxi.txt +``` + +2. 使用 `sed` 删除文件 `lianxi.txt` 中的空白行,并将结果保存到新文件 `clean_notes.txt` 中。 + +```bash +sed '/^$/d' lianxi.txt clean_notes.txt + +``` + +3. 使用 `sed` 将文件 `lianxi.txt` 中所有的 "color" 替换为 "colour",并将结果输出到标准输出。 + +```bash + sed 's/color/colour/g' lianxi.txt +``` + +#### 笔记 + +##### sed命令:sed [选项] '命令' 文件 + +-e:直接在命令行模式中执行多个sed命令 + +-f:从指定的文件中读取sed命令 + +-i:直接编辑文件内容 + +-n:禁止自动打印模式空间内容 + +#### 1. 文本替换 + +将文件`example.txt`中的所有`apple`替换为`orange`: + +```bash +sed 's/apple/orange/g' example.txt # g 表示全局,所有 +``` + +#### 2. 只替换第一个匹配项 + +仅替换每行中的第一个`apple`: + +```bash +sed 's/apple/orange/' example.txt # 每行一次 +``` + +其它一些用法 + +```bash +#在文件 example.txt 中每一行的开头插入 "Hello, " +sed 's/^/Hello, /' example.txt +# 在文件 example.txt 中每一行的末尾追加 "!": +sed 's/$/!/' example.txt +``` + +#### 3. 指定行进行替换 + +只替换第2行的`apple`: + +```bash +sed '2s/apple/orange/' example.txt +# s前加行号 +sed '2s/apple/orange/g' example.txt +# 如果后面还加了g 就是该行的所有被替换 +``` + +#### 4. 删除行 delele + +删除包含`apple`的行: + +```bash +sed '2d' example.txt # 删除第2行 +sed 'd' example.txt # 删除所有行 +sed "/apple/d" # 删除所有包含了apple的行 +``` + +#### 5. 打印行 print => p + +打印包含`apple`的行: + +```bash +sed -n '/apple/p' example.txt +``` + +#### 6. 插入文本 a行后追加一行, i行前追加一行 c + +在第2行后插入一行文本`This is inserted.`: + +```bash +sed '2a\This is inserted.' example.txt +``` + +#### 7. 替换整行 c + +将第2行替换为`This is replaced.`: + +```bash +sed '2c\This is replaced.' example.txt +``` + +#### 8. ;结合多个命令 + +删除包含`apple`的行并将`banana`替换为`grape`: + +```bash +sed '/apple/d; s/banana/grape/g' example.txt +``` + +#### 9. 直接修改文件 + +将文件`example.txt`中所有`apple`替换为`orange`并保存更改: + +```bash +sed -i 's/apple/orange/g' example.txt +``` + +#### 10. 使用包含 `sed` 命令的脚本文件 + +`-f` 选项允许 `sed` 从一个文件中读取编辑命令,而不是直接在命令行中指定。 + +第一步,先编写脚本文件test.txt + +```bash +# sed的命令脚本文件 +/apple/d # 删除包含apple的所有行 +s/banana/grape/ # 将banana替换成grape +# 注意多个命令直接一行一个,不用;号也不用-e +``` + +第二步,执行这个脚本 + +```bash +sed -f test.txt banana.txt # 使用test.txt中的sed命令对banana.txt文件进行处理 +``` + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240604 awk.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240604 awk.md" new file mode 100644 index 0000000000000000000000000000000000000000..9239772808ed2bcd1db1be07e9a841765b05f9f6 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240604 awk.md" @@ -0,0 +1,664 @@ +假设已有student_scores.csv 文件(后面的演示都基于这个文件),内容如下 + +``` +姓名,数学,语文,科学,班级 +张伟,85,92,88,1班 +李娜,78.5,81,79.5,2班 +王强,95,89,94.5,3班 +赵敏,90,72.5,70,2班 +刘洋,88,94,90,1班 +陈刚,74,85,80,1班 +杨梅,91,87,89,3班 +黄磊,55.5,90,86,3班 +周红,76,78,80,2班 +王彬,90,93.5,92,1班 +大王,85,86,45.5,2班 +小王,74,56,88,3班 +``` + +## 2. Awk 命令的结构 + +一般情况下,`awk` 命令的基本结构如下: + +```sh +awk [选项] '脚本' 文件 +# 最简单的一个脚本,打印全文 +awk '{ print }' student_scores.csv +``` + +这里的 `[选项]` 是可选的,它们在 `awk` 命令中通常出现在脚本和文件名之前。 + +AWK 脚本由一个或多个语句块组成,每个语句块可以是以下三种之一: + +1. 开始语句块:在程序开始时执行 `BEGIN { print "start" }` +2. 通用语句块:逐行处理文件内容 `pattern { commands }`, +3. 结束语句块:在程序结束时执行 `END { print "end" }` + +示例: +```sh +awk 'BEGIN { print "开始" } pattern { commands } END { print "结束" }' file +# 头尾各加一行 +awk 'BEGIN { print "我是开头"} { print } END { print "我是结尾" } ' student_scores.csv +``` + +可以通过管道获取数据: +```sh +cat file | awk 'BEGIN { print "start" } pattern { commands } END { print "end" }' +``` + +### 2.1 语句块的构成部分 + +语句块语法:由模式 (pattern) 和动作 (action) 构成。 + +```bash +awk 'pattern { actions }' # 即 模式 {动作} +# 模式 (pattern): 可以是正则表达式、关系表达式、特定条件等。 +# 动作 (action): 一组语句,描述在匹配模式的行上执行的操作 +# 示例 +awk '/王/ { print $0 }' student_scores.csv +# 打印文件中所有包含 王 的行。 +``` + +- 如果没有指定模式,则对每一行都执行动作。 +- 指定模式后,只有匹配模式的行,才执行动作,即满足条件才执行 + +### 2.2 深入理解三个语句块 + +**示例:** + +```sh +awk -F, 'BEGIN { print "----开始-----" } +$2>=80 { print } +END { print "----结束-----" } +' student_scores.csv +# 脚本解释 +# -F,:指定逗号作为字段分隔符,不指定默认是空格(\t)做分隔符 +# BEGIN { print "----开始-----" }:在处理文件开始时打印“----开始-----”。 +# $2 >= 80 { print }:对于每一行,如果第二个字段(数学成绩)大于或等于80,则打印该行。 +# END { print "----结束-----" }:在处理文件结束时打印“----结束-----”。 +``` + +**输出** + +运行上述脚本的输出如下: + +``` +----开始----- +姓名,数学,语文,科学 +张伟,85,92,88 +王强,95,89,94 +刘洋,88,94,90 +杨梅,91,87,89 +黄磊,82,90,86 +王彬,90,93,92 +----结束----- +``` + +### 2.3 术语解释 + +#### Awk 中的常用选项(限命令行) + +- `-F`:指定输入字段分隔符。例如,`-F,` 将逗号设置为字段分隔符。 + - 默认是以空格\t等为分隔符 + - 类似于FS="分隔符" 在文件中使用 + +- `-v`:赋值外部变量。例如,`-v var=value`。 min=60 +- `-f`:指定 Awk 脚本文件。例如,`-f script.awk`。 +- `-W`:控制警告和其他运行时选项。例如,`-W version` 用于显示版本信息。 + +#### Awk 中的常用模式(pattern) + +- 匹配正则表达式 + - `/pattern/`:匹配包含指定模式的行。例如,`/error/` 匹配所有包含“error”的行。 + - $2 ~ /pattern/ :匹配第2列包含关键字pattern的行, + - $2 !~ /pattern/:匹配第2列不包含关键字pattern的行 + +- 比较运算符 + - 匹配第 n 行。例如,`NR == 1` 匹配第一行。 + - `==`(等于),例$2 == "张三" 匹配第二列等于张三的行 + - `!=`(不等于) + - `<`(小于) + - `<=`(小于等于) + - `>`(大于) + - `>=`(大于等于) + +- 逻辑运算符 + - `NR >= m && NR <= n`:匹配第 m 到第 n 行。例如,`NR >= 2 && NR <= 4` 匹配第2到第4行。 + - `&&`:逻辑与(AND) + - `||`:逻辑或(OR) + - `!`:逻辑非(NOT) + +- 三元运算符 + - 条件运算符 `? :` + - grade = ($2 >= 60 ? "及格" : "不及格") + + +#### Awk 中的常用动作(action) + +- `print`:打印指定内容。例如,`print $1` 打印第一字段。 + +- `printf`:格式化输出。例如,`printf "%s\n", $1` 以格式化方式打印第一字段。 + + - 语法: + + ```bash + printf (format, expression1, expression2, ...) + # format 是一个包含格式说明符的字符串。 + # expression1, expression2, ... 是要格式化并插入到 format 字符串中的表达式。 + ``` + + - 常用的格式说明符 + + - `%s`:字符串 + - `%d`:有符号十进制整数 + - `%f`:浮点数 + + - 带有宽度和对齐的写法: + - `%5s`:字段宽度为 5 的字符串,右对齐 + - `%-5s`:字段宽度为 5 的字符串,左对齐 + - `%10d`:字段宽度为 10 的有符号十进制整数,右对齐 + - `%-10d`:字段宽度为 10 的有符号十进制整数,左对齐 + - `%8.2f`:字段总宽度为 8,其中小数点后有 2 位的浮点数 + +- `{}`:包含一个或多个动作的块。例如,`{ print $1; print $2 }`。 + + - 用;号分隔多个动作语句 + - 如果每个语句在单独的行上,;号可以省略 + + +#### Awk 中的特殊变量 + +- `NR`:表示记录的数量(当前行号)。Numbers of Rows +- `NF`:表示当前行的字段数量。`$NF`表示什么?最后一列 Number of flied +- `$0`:包含当前行的文本内容,即一整行内容。有时候也省略 +- `$1`、`$2`:表示当前行的第1个、第2个字段的内容,以次类推。 +- `FS`:输入时的域分割符。效果同-F选项 File split +- `OFS`:输出时的域分割符。out File split + +### 2.4 示例 + +#### 计算总成绩: +```sh +awk 'BEGIN { FS="," } NR > 1 { print $1, $2 + $3 + $4 }' student_scores.csv +# BEGIN { FS="," }:设置字段分隔符 FS 为逗号。 +# NR > 1:跳过标题行,只处理从第二行开始的数据。 +# { print $1, $2 + $3 + $4 }:打印每一行的第一个字段和第二到第五个字段的和。 +``` + +#### 查找姓名为`王强` 的学生信息: +```sh +awk 'BEGIN { FS="," } $1 == "王强" { print }' student_scores.csv +# 输出 王强,95,89,94,85 +``` + +#### 打印行号和学生姓名: +```sh +awk -F ',' '{ print NR, $1 }' student_scores.csv +``` + +#### 查找特定学生的成绩: +```sh +awk -F ',' '$1 == "杨梅" { print "姓名:" $1, "数学:" $2, "语文:" $3, "科学:" $4 }' student_scores.csv +``` + +#### 使用正则表达式查找学生: +```sh +awk -F ',' '$1 ~ /王强/ { print $1, $2 + $3 + $4 }' student_scores.csv +#使用 ~ 运算符明确表示匹配第一个字段 $1,即检查第一字段是否包含 "王强"。 + +#$1 == "王强":匹配完全等于 "王强" 的行。 +#$1 ~ /王强/:匹配包含 "王强" 的所有行 + +#思考:查找姓名中包含王字的学生的行 +``` + +#### 格式化输出: +```sh +# 思考以下命令得到什么格式的结果 +awk -F, '{ printf("%s 的成绩是 %.2f\n", $1, $2 + $3 + $4) }' student_scores.csv + +# 以下呢 +awk -F, 'NR>1 { printf("%s 的成绩是 %10.2f\n", $1, $2 + $3 + $4) }' student_scores.csv + +awk -F, 'NR>1 { printf("%s 的成绩是 %d\n", $1, $2 + $3 + $4) }' student_scores.csv +``` + +#### 结合模式使用: +```sh +awk -F, '$2 >= 85 || $3 >= 90 { print $0 }' student_scores.csv # 数字85以上,或数学90以上 +awk -F, '$2<60 || $3<60 || $4<60 {print} ' student_scores.csv # 有任意一科挂科的 +# 思考如何找出所有科目都及格的学生 +``` + +#### 2.5 数据验证 + +验证数据的一些示例: +```sh +awk -F, '$2 < 60 { print $0, "语文不及格" }' student_scores.csv +``` + +#### 2.6 BEGIN 语句块的作用 + +在 BEGIN 语句块中输出头信息: +```sh +awk 'BEGIN { print "我在最开头输出" } { print $0 }' student_scores.csv +``` + +设置域分隔符: +```sh +cat /etc/passwd +awk 'BEGIN { FS=":" } { print $1, $6 }' /etc/passwd # 打印用户和家目录 +``` + +#### 2.7 END 语句块 + +在 END 语句块中输出汇总信息: +```sh +awk 'END { print "共有"NR"个", "students" }' student_scores.csv # 输出共有13个 students +# 如何去掉标题的那一行 +``` + +#### 计算总成绩和平均成绩: + +```sh +awk -F, '{ total += $2 + $3 + $4 } +END { + print NR-1, "个学生"; + print "总分 is", total; + print "平均分 is", total/(NR-1) +}' student_scores.csv +``` + +### 2.8 Awk 中的控制语句 + +```sh +# 利用数组lines[]存放每一行的内容,再倒序打印每一行 +awk '{ lines[NR] = $0 } END { for (i = NR; i > 0; i--) print lines[i] }' student_scores.csv + +# 在所有不及格的分数后添加不及格三个字 +awk -v min=60 'BEGIN { FS=","; OFS="\t\t" } +{ + math=$2; + chinese=$3; + science=$4; + if (math < min) math = math " 不及格"; + if (chinese < min) chinese = chinese " 不及格"; + if (science < min) science = science " 不及格"; + print $1, math, chinese, science + }' student_scores.csv + +``` + +### 2.9 关联数组 + +使用关联数组处理数据: +```sh +# 按班级输出总分 +awk -F, 'NR>1 { scores[$5] += $2+$3+$4 } END { for (name in scores) print name, scores[name] }' student_scores.csv +``` + +打印每项中数字最大的项: +```sh +# 打印每个班级中语文最高分 +awk -F, 'NR>1 { if (scores[$5] < $2) scores[$5] = $2 } END { for (name in scores) print name, scores[name] }' student_scores.csv + +# 打印每个班语文最高分姓名和分数 +awk -F, ' +NR == 1 { next } # Skip header line +{ + class = $5 + chinese_score = $2 + if (chinese_score > max_score[class]) { + max_score[class] = chinese_score + max_name[class] = $1 + } +} +END { + for (class in max_score) { + print class, max_name[class], max_score[class] + } +} +' student_scores.csv + +``` + +### 2.10 Awk 中的内建函数 + +常用内建函数: +- `length(s)`:返回字符串 `s` 的长度。 +- `substr(s, p, n)`:返回字符串 `s` 从位置 `p` 开始的 `n` 个字符。 +- `index(s, t)`:返回字符串 `t` 在字符串 `s` 中第一次出现的位置。 +- `toupper(s)`:将字符串 `s` 转换为大写。 +- `tolower(s)`:将字符串 `s` 转换为小写。 +- `sprintf(format, expr, ...)`:返回格式化字符串。 +- `system(cmd)`:执行系统命令 `cmd`。 + +示例: +```sh +awk '{ print length($1) }' student_scores.csv +awk '{ print substr($1, 1, 3) }' student_scores.csv +awk '{ print index($1, "A") }' student_scores.csv +awk '{ print toupper($1) }' student_scores.csv +awk '{ print tolower($1) }' student_scores.csv +awk '{ print sprintf("%.2f", $2 + $3 + $4) }' student_scores.csv +awk 'BEGIN { system("date") }' +``` + +### 2.11 常见使用场景 + +#### 删除空行: +```sh +# NF代表有列的行,即排除了空行 +awk 'NF' student_scores.csv +``` + +#### 查找和替换文本: +```sh +#所有的"1班"替换为"一班" +awk -F, ' { gsub(/1班/, "一班"); print }' student_scores.csv +``` + +#### 结合其他命令: +```sh +cat student_scores.csv | awk -F, '{ print $1 }' +grep "王" student_scores.csv | awk -F, '{ print $1,$2 }' +awk -F, '{ print $5 }' student_scores.csv | sort | uniq +``` + +## 3. 工作中的使用场景 + +在实际工作中,AWK 常用于处理文本文件和数据文件,特别是结构化数据的分析和处理。以下是几个常见的使用场景和具体示例: + +### 1. 数据提取与处理 + +#### 示例 1.1:从日志文件中提取特定信息 + +假设有一个访问日志文件 `access.log`,格式如下: + +``` +192.168.1.1 - - [10/Oct/2021:13:55:36] "GET /index.html HTTP/1.1" 200 1234 +192.168.1.2 - - [10/Oct/2021:13:56:12] "POST /login HTTP/1.1" 302 2345 +``` + +**需求:提取每个访问记录中的 IP 地址和请求的 URL** + +```sh +awk '{ print $1, $7 }' access.log +``` + +输出: + +``` +192.168.1.1 /index.html +192.168.1.2 /login +``` + +#### 示例 1.2:统计 CSV 文件中某一列的总和 + +假设有一个销售记录文件 `sales.csv`,内容如下: + +``` +日期,产品,数量,单价 +2023-05-01,产品A,10,5.00 +2023-05-01,产品B,5,8.00 +2023-05-02,产品A,7,5.00 +2023-05-02,产品C,3,15.00 +``` + +**需求:计算销售的总金额** + +```sh +awk -F, 'NR > 1 { total += $3 * $4 } END { print "Total Sales:", total }' sales.csv +``` + +输出: + +``` +Total Sales: 190 +``` + +### 2. 数据筛选与过滤 + +#### 示例 2.1:筛选出特定条件的数据行 + +假设有一个员工记录文件 `employees.csv`,内容如下: + +``` +姓名,职位,部门,工资 +张伟,经理,市场部,12000 +李娜,助理,财务部,8000 +王强,工程师,技术部,10000 +赵敏,秘书,市场部,7000 +``` + +**需求:筛选出工资超过9000的员工** + +```sh +awk -F, '$4 > 9000 { print $1, $4 }' employees.csv +``` + +输出: + +``` +张伟 12000 +王强 10000 +``` + +#### 示例 2.2:根据正则表达式匹配筛选数据 + +**需求:筛选出属于市场部的员工** + +```sh +awk -F, '$3 ~ /市场部/ { print $1, $3 }' employees.csv +``` + +输出: + +``` +张伟 市场部 +赵敏 市场部 +``` + +### 3. 数据格式转换 + +#### 示例 3.1:将数据从逗号分隔转换为制表符分隔 + +假设有一个 CSV 文件 `data.csv`,内容如下: + +``` +name,age,city +Alice,30,New York +Bob,25,Los Angeles +Charlie,35,Chicago +``` + +**需求:将数据从逗号分隔转换为制表符分隔** + +```sh +awk -F, '{ OFS="\t"; print $1, $2, $3 }' data.csv +``` + +输出: + +``` +name age city +Alice 30 New York +Bob 25 Los Angeles +Charlie 35 Chicago +``` + +### 4. 生成报告 + +#### 示例 4.1:生成学生成绩报告 + +假设有一个学生成绩文件 `student_scores.csv`,内容如下: + +``` +姓名,数学,语文,科学,班级 +张伟,85,92,88,1班 +李娜,78.5,81,79.5,2班 +王强,95,89,94.5,3班 +赵敏,90,72.5,70,2班 +刘洋,88,94,90,1班 +``` + +**需求:生成每个学生的总成绩报告** + +```sh +awk -F, 'NR > 1 { total = $2 + $3 + $4; print $1, total }' student_scores.csv +``` + +输出: + +``` +张伟 265 +李娜 239 +王强 278.5 +赵敏 232.5 +刘洋 272 +``` + +### 5. 系统管理与维护 + +#### 示例 5.1:处理系统配置文件 + +假设有一个系统配置文件 `config.txt`,内容如下: + +``` +# 系统配置 +hostname=myserver +ip_address=192.168.1.1 +netmask=255.255.255.0 +gateway=192.168.1.254 + +# This is a comment +email=john@example.com +location=USA +``` + +**需求:提取配置项的名称和对应的值** + +```sh +awk -F= '/^[^#]/ { print $1, $2 }' config.txt # [^#] 排除#开头的行 +sed "/#/d" 2.txt | awk -F= 'NF {print $1,$2}' +``` + +输出: + +``` +hostname myserver +ip_address 192.168.1.1 +netmask 255.255.255.0 +gateway 192.168.1.254 +email john@example.com +location USA +``` + +#### 示例 5.2:分析系统资源使用情况 + +假设有一个磁盘使用情况文件 `disk_usage.txt`,内容如下: + +``` +Filesystem Size Used Avail Use% Mounted on +/dev/sda1 50G 20G 30G 40% / +/dev/sda2 100G 50G 50G 50% /home +/dev/sda3 200G 150G 50G 75% /var +``` + +**需求:查找使用率超过50%的文件系统** + +```sh +awk '$5+0 > 50 { print $1, $5 }' disk_usage.txt +# $5+0 是将字符串车为数字的小技巧 +``` + +输出: + +``` +/dev/sda3 75% +``` + +这些示例展示了AWK在日常工作中的多种实际应用场景,从数据提取、筛选、格式转换到生成报告和系统管理。AWK强大的文本处理能力使其成为处理结构化文本数据的利器。 + +实际案例: + +```bash +/var/log/nginx/access.log +``` + +awk、grep、sed是linux操作文本的三大利器,合称*文本三剑客* + +**grep**:主要用于查找匹配特定模式的行。强大之处在正则匹配 + +**sed**:主要用于对文本进行替换、删除、插入等编辑操作。 + +**awk**:功能强大的文本处理语言,适用于复杂的数据处理和报告生成。强于对结构化数据的处理 + + + +作业: + +1. 只显示/etc/passwd的账户 + + ~~~bash + awk -F: '{print $1}' /etc/passwd + ~~~ + + + +2. 只显示/etc/passwd的账户和对应的shell,并在第一行上添加列名用户制表符shell,最后一行添加---------------- + + ~~~bash + awk -F: 'BEGIN {print "用户"} {print $1 "\t" $7} END {print "-----------"}' /etc/passwd + ~~~ + + + +3. 搜索/etc/passwd有关键字root的所有行 + + ~~~bash + awk -F: '/root/' /etc/passwd + ~~~ + + + +4. 统计/etc/passwd文件中,每行的行号,每列的列数,对应的完整行内容以制表符分隔 + + ~~~bash + awk -F: '{print NR "\t" NF "\t" $0}' /etc/passwd + ~~~ + + + +5. 输出/etc/passwd文件中以nologin结尾的行 + + ~~~bash + awk -F: '/nologin$/ {print $0}' /etc/passwd + ~~~ + + + +6. 输出/etc/passwd文件中uid字段小于100的行 + + ~~~bash + awk -F: '$3<100 {print $0}' /etc/passwd + ~~~ + + + +7. /etc/passwd文件中gid字段大于200的,输出该行第一、第四字段,第一,第四字段并以制表符分隔 + + ~~~bash + awk -F: '$4>200 {print $1 "\t" $4}' /etc/passwd + ~~~ + + + +8. 输出/etc/passwd文件中uid字段大于等于100的行 + + ~~~bash + awk -F: '$3>100 {print $0}' /etc/passwd + ~~~ + + + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240605 vim\347\274\226\350\276\221\345\231\250.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240605 vim\347\274\226\350\276\221\345\231\250.md" new file mode 100644 index 0000000000000000000000000000000000000000..3e67d588fdbcad9f2cc8d5dfb3b5f9b14aebf36d --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240605 vim\347\274\226\350\276\221\345\231\250.md" @@ -0,0 +1,213 @@ +1. vi 编辑器有几种模式? + + ~~~bash + vi 三种工作模式切换 + 终端命令行下,使用"vi 文件名",进入 编辑器。 + vi 编辑器分为三种工作模式:一般指令模式、编辑模式、命令行模式。(要点:无论处于那种工作模式,按 Esc键 都可进入一般指令模式。编辑模式和命令行模式的切换,必须要经过一般指令模式)一般指令模式:刚进入v 时的默认模式。这个模式下能够进行:移动光标、整行的复制粘贴、整行删除 等基本操作。。编辑模式:在一般指令模式下,按"a""""o"均可进入编辑模式。此模式下能够进行:文本的输入、删除。命令行模式(末行模式):在一般指令模式下,按":""""?"均可进入命令行模式。由于此模式的输入会显示在窗口的最后一行,也叫末行模式。此模式下能够进行:搜索、保存、离开 等操作。 + ~~~ + + + +2. 如何进入 vi 编辑器的插入模式 + + ~~~bash + 要进入vi编辑器的插入模式,您可以使用以下方法: + 按下i键,光标前插入。 + 按下a键,光标后插入。 + 按下o键,光标下一行插入。 + 要退出插入模式,按下Esc键,然后输入:q + ~~~ + + + +3. 如何进入 vi 编辑器的可视化模式 + + ~~~bash + v 或者 V 或者 ctrl v + 要进入Vim的可视化模式,可以通过按下v键来激活。在可视化模式下,可以通过移动光标来选择文本块。要退出可视化模式,只需再次按下v键即可。另外,还可以使用V进入行选择模式,或者使用 Ctrl+v进入块选择模式 + ~~~ + + + +4. 在 vi 编辑器中如何复制一行 + + ~~~bash + 按yy复制光标当前行 + p粘贴到下一行 + 在 v编辑器中复制一行的方法有以下几种: + 1.在光标的位置按"yy",复制当前行;然后再光标的行按"p”,粘贴到下一行,原来的往下顺移。 + 2.使用可视模式选定文本块,按“y"复制选定块到缓冲区,或按“yy"复制整行。 + 3.在命令模式下,将光标移动到将要复制的行处,按"yy"进行复制;或按“nyy"复制n行,其中n为1、2、3.... + 4.在命令模式下,将光标移动到将要粘贴的行处,按"p”粘贴已复制的数据到光标的下一行,或按“P”粘贴到光标的上一行。 + ~~~ + + + +5. 在 vi 编辑器中如何进行粘贴 + + ~~~bash + 按P粘贴 + 在 Vim 编辑器中,粘贴文本的方法如下: + 1.复制或剪切文本后,按p键即可粘贴 + 2.您可以多次按p键多次粘贴文本,或使用 np,其中n是您想要粘贴的次数12,3.在正常的操作模式下,将光标放在需要的位置,然后用p来粘贴文字。 + ~~~ + + + +6. 如何删除从 3 行到 15 行的所有数据 + + ~~~bash + 输入 :3,15d + ~~~ + +7. vim练习: + + - 光标移动练习,命令模式下: + + - 单位级 h j k l + - 单词级 w e b + - 块级 gg G 0 ^ $ H M L ngg nj nk + + 把下列句子按照第一句的正确顺序修改好并把多余的空行删除 + + ~~~bash + g/^$/d //删除空行 + ~~~ + + + + ``` + this is a simple easy vim tutorial + + tutorial simple a easy this vim is + is this tutorial vim simple a easy + + + tutorial vim this is a easy simple + tutorial easy vim simple a this is + simple a vim easy tutorial is this + + tutorial is easy vim a simple this + + + vim simple this tutorial a easy is + a vim tutorial simple easy is this + + + easy a simple vim is tutorial this + vim tutorial is a easy simple this + a this vim tutorial is easy simple + this tutorial simple easy a is vim + + + easy tutorial this simple a is vim + a tutorial easy is this simple vim + + a tutorial vim is easy this simple + simple this easy is vim tutorial a + + this tutorial is a easy simple vim + vim is tutorial simple this easy a + + vim is simple this tutorial easy a + easy a simple is vim this tutorial + vim is tutorial simple a easy this + this vim is tutorial simple easy a + ``` + + 先敲出以下代码,然后修正以下代码中的错误单词、重复单词、错误格式、多余行,修改函数名为 typing 并为定时器添加 300 毫秒延迟 + + ``` + const bbb = () => { + // this is is a description + // + // another descriptttion + const timer = setTimeout(( ) => { + console.log(that) alert('cool!') + // awosome man ! + }) + } + ``` + + 尝试在下面的文本中进行复制粘贴练习 + + ``` + 删除这一行 + dd + 粘贴到这一行下面 + p + 剪切 ABC 并把它粘贴到 XYZ 前面,使这部分内容看起来像 + 剪切 并把它粘贴到 ABC XYZ 前面。 + daw + p + ``` + + 尝试修改下列文本的大小写 + + ``` + Change this line to UPPERCASE, THEN TO lowercase. + 大写:光标移动到要修改的单词上,按下 gU 键将单词变为大写。 + 小写:光标移动到要修改的单词上,按下 gu 键将单词变为小写。 + ``` + + 按下面的说明进行操作 + + ``` + 按 dd 删除本行 + 按 . 重复删除操作 + 2. 再删除两行 + 这行也没了 + p 把刚才删掉的粘回来 + 3. 又多出 6 行 + ``` + + 左缩进、右缩进练习 + + ``` + 在这一行上依次按 3>>,<< 和 >添加缩行 +<<减少缩行 +,重复上次命令 + +常规查找 /str n查找下一个、N查找下一个 +单词快速匹配 *向前查找光标所在单词、#向后查找光标所在单词 +~~~ + diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240610 \350\256\251\347\275\221\347\253\231\344\275\277\347\224\250\344\270\212https\350\257\245\345\246\202\344\275\225\346\223\215\344\275\234.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240610 \350\256\251\347\275\221\347\253\231\344\275\277\347\224\250\344\270\212https\350\257\245\345\246\202\344\275\225\346\223\215\344\275\234.md" new file mode 100644 index 0000000000000000000000000000000000000000..e5a52cfe0b8f59954c5b90121bad54f6b343e185 --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240610 \350\256\251\347\275\221\347\253\231\344\275\277\347\224\250\344\270\212https\350\257\245\345\246\202\344\275\225\346\223\215\344\275\234.md" @@ -0,0 +1,96 @@ +让网站使用上https该如何操作: + +1. 有一个服务器:阿里云,华为云这些 +2. 有一个域名:自己买的域名,可以解析ip +3. SSL证书 + 1. 付费,按年支付 + 2. 免费,申请,90天 + 1. 有些申请SSL的网站 + 2. 在服务器所在平台,直接申请 + 1. 搜索SSL证书申请 + 2. 操作申请步骤 + 1. 填写申请的表格 www.taobao.com/a.txt + 2. 验证你的域名 :DNS验证,手动文件验证 a.txt + 3. 提交申请后,待签发,会有审核,几分钟就完成,已签发 + 4. 已签发,就可以下载证书 + 1. 一般会提供多种web服务器对应的证书 + 2. 选择自己Web服务器对应的文件下载(nginx证书) + 3. 是一个压缩包,解压后得到 + 1. www.taobao.com.key + 2. www.taobao.com.pem + 3. www.taobao.com.csr + 4. www.taobao.com.crt + 5. 将解压后的证书文件上传到nginx某个目录下(记得它的绝对路径/etc/nginx/cert/) +4. web服务器(nginx):apache,tomcat ,iis ,默认提供80端口,使用http访问 + +操作: + +1. 修改web服务器(nginx)的配置文件,加载SSL证书 + 1. 在服务器所在平台,直接搜索ssl证书部署,选择自己web服务版本对应的步骤 + 2. 打开你的nginx网站配置文件 /etc/nginx/conf.d/自己域名.conf + 3. 添加ssl对应的server +2. 开放443端口(华为云,阿里云,腾讯云,在安全组开放443) + +## 刚安装完Deiban系统 7步走: + +1. 设置国内软件源镜像 /etc/apt/sources.list +2. 更新软件包列表:apt update +3. 更新系统:apt upgrade -y +4. 安装vim: + 1. apt install vim -y + 2. locate 从数据库中找, find实时从系统中找 + +5. 编辑网卡配置,设置静态IP: +6. 只在虚拟机上操作,不要在云服务器操作 + +```bash +vim /etc/network/interfaces + +# 按如下设置 +# The primary network interface +allow-hotplug ens192 +iface ens192 inet dhcp + +#重新启动网络服务 +sudo systemctl restart networking +``` + +5. 修改SSHD配置,允许root用户远程登录 + +```bash +vim /etc/ssh/sshd_config + +# 取消如下代码的注释,并且将其值设置为yes,以允许root用户的远程登录 +22 +PermitRootLogin yes + + +``` + +6. 配置环境变量,简单化ls的用法 + + +/etc/profile.d /etc/nginx/conf.d/ + +```bash + export LS_OPTIONS='--color=auto' + alias ls='ls $LS_OPTIONS' + alias ll='ls $LS_OPTIONS -l' + alias l='ls $LS_OPTIONS -lA' + +``` + +7. 配置环境变量,设置当前系统字符集,以接受中文 + +/etc/profile.d/lang.sh + +```bash +export LC_ALL=C.utf8 +``` + +要确保设置生效,可以重新加载该文件并检查环境变量 + +```sh +source /etc/profile.d/lang.sh +echo $LC_ALL +``` \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240612 Deiban\347\263\273\347\273\237 7\346\255\245\350\265\260.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240612 Deiban\347\263\273\347\273\237 7\346\255\245\350\265\260.md" new file mode 100644 index 0000000000000000000000000000000000000000..2b86cbec2d7af4fb0b9bb0938e84b097a805c92b --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240612 Deiban\347\263\273\347\273\237 7\346\255\245\350\265\260.md" @@ -0,0 +1,479 @@ +## 刚安装完Deiban系统 7步走: + +1. 设置国内软件源镜像 /etc/apt/sources.list +2. 更新软件包列表:apt update +3. 更新系统:apt upgrade -y +4. 安装vim: + 1. apt install vim -y + 2. locate 从数据库中找, find实时从系统中找 + +5. 编辑网卡配置,设置静态IP: +6. 只在虚拟机上操作,不要在云服务器操作 + +```bash +vim /etc/network/interfaces + +# 按如下设置 +# The primary network interface +allow-hotplug ens192 +iface ens192 inet dhcp + +#重新启动网络服务 +sudo systemctl restart networking +``` + +5. 修改SSHD配置,允许root用户远程登录 + +```bash +vim /etc/ssh/sshd_config + +# 取消如下代码的注释,并且将其值设置为yes,以允许root用户的远程登录 +22 +PermitRootLogin yes + + +``` + +6. 配置环境变量,简单化ls的用法 + + +/etc/profile.d /etc/nginx/conf.d/ + +```bash + export LS_OPTIONS='--color=auto' + alias ls='ls $LS_OPTIONS' + alias ll='ls $LS_OPTIONS -l' + alias l='ls $LS_OPTIONS -lA' + +``` + +7. 配置环境变量,设置当前系统字符集,以接受中文 + +/etc/profile.d/lang.sh + +```bash +export LC_ALL=C.utf8 +``` + +要确保设置生效,可以重新加载该文件并检查环境变量 + +```sh +source /etc/profile.d/lang.sh +echo $LC_ALL +``` + + + +几个常用命令 + +以下是一些常见的 Linux 命令,包括它们的使用场景、核心术语讲解以及示例: + +### 1. `time` + +**使用场景**:用于测量命令的执行时间。 + +**核心术语**: + +- **real**:总的时间(墙上时钟时间)。 +- **user**:用户态 CPU 时间。 +- **sys**:内核态 CPU 时间。 + +**示例**: + +```bash +time ls +``` + +输出: + +```plaintext +real 0m0.003s +user 0m0.001s +sys 0m0.002s +``` + +### 2. `date` + +**使用场景**:显示或设置系统日期和时间。 + +**核心术语**: + +- **%Y**:四位数的年份。 +- **%m**:两位数的月份。 +- **%d**:两位数的日期。 + +**示例**: + +```bash +date "+%Y-%m-%d %H:%M:%S" +``` + +输出: + +```plaintext +2024-06-10 15:30:00 +``` + +### 3. `timedatectl` + +**使用场景**:查看和设置系统时间和日期,时区和 NTP(网络时间协议)设置。 + +**核心术语**: + +- **NTP**:网络时间协议,用于同步时间。 +- **RTC**:实时时钟。 + +**示例**: + +```bash +timedatectl status +``` + +输出: + +```plaintext +Local time: Mon 2024-06-10 15:30:00 UTC +Universal time: Mon 2024-06-10 15:30:00 UTC +RTC time: Mon 2024-06-10 15:30:00 +Time zone: Etc/UTC (UTC, +0000) +System clock synchronized: yes +NTP service: active +``` + +### 4. `reboot` + +**使用场景**:重新启动系统。 + +**核心术语**: + +- **systemd**:系统和服务管理器。 + +**示例**: + +```bash +sudo reboot +``` + +### 5. `poweroff` + +**使用场景**:关闭系统电源。 + +**核心术语**: + +- **halt**:停止系统所有的 CPU 功能。 + +**示例**: + +```bash +sudo poweroff +``` + +### 6. `wget` + +**使用场景**:从网络上下载文件。 + +**核心术语**: + +- **URL**:统一资源定位符。 +- **HTTP/HTTPS**:超文本传输协议。 + +**示例**: + +```bash +wget https://example.com/file.txt +``` + +### 7. `curl` + +**使用场景**:从网络上获取或发送数据。 + +**核心术语**: + +- **URL**:统一资源定位符。 +- **GET/POST**:HTTP 请求方法。 + +**示例**: + +```bash +curl -O https://example.com/file.txt +``` + +### 8. `ps` + +**使用场景**:查看当前运行的进程。 + +**核心术语**: + +- **PID**:进程标识符。 +- **TTY**:终端类型。 + +**示例**: + +```bash +ps aux # 显示所有用户的所有进程 一般会结合。grep,awk等过滤数据 +``` + +### 9. `kill` + +**使用场景**:向进程发送信号(通常用于终止进程)。 + +**核心术语**: + +- **SIGTERM**:请求中止进程。 +- **SIGKILL**:强制终止进程。 + +**示例**: + +```bash +kill 1234 # kill 进程号,用pidof 进程名。来查看具体的进程的进程号 +``` + +### 10. `killall` + +**使用场景**:向指定名称的所有进程发送信号。 + +`先安装psmisc` + +1. 安装psmisc 后,就会有pstree和killall + +**核心术语**: + +- **signal**:信号,通知进程执行某种操作。 + +**示例**: + +```bash +killall firefox +``` + +### 11. `ip` + +**使用场景**:显示和操作网络接口和路由。 + +**核心术语**: + +- **address**:IP 地址。 +- **route**:路由信息。 + +**示例**: + +```bash +ip addr show +``` + +### 12. `ss` + +**使用场景**:显示套接字统计信息。旧版是netstat + +**核心术语**: + +- **TCP**:传输控制协议。 +- **UDP**:用户数据报协议。 + +**示例**: + +```bash +ss -tuln # 可以查看哪些端口开放着 +``` + +### 13. `uname` + +**使用场景**:显示系统信息。 + +**核心术语**: + +- **kernel**:操作系统内核。 +- **OS**:操作系统。 + +**示例**: + +```bash +uname -a +``` + +### 14. `uptime` + +**使用场景**:显示系统运行时间和负载。 + +**核心术语**: + +- **load average**:系统平均负载。 + +**示例**: + +```bash +uptime +``` + +### 15. `who` + +**使用场景**:显示当前登录用户信息。 + +**核心术语**: + +- **login**:用户登录信息。 +- **TTY**:终端类型。 + +**示例**: + +```bash +who +``` + +### 16. `last` + +**使用场景**:显示系统上最近的登录信息。 + +**核心术语**: + +- **wtmp**:记录登录和注销事件的文件。 + +**示例**: + +```bash +last +``` + +### 17. `ping` + +**使用场景**:测试网络连通性。 + +- **ICMP**:互联网控制消息协议。 +- **echo request**:回显请求。 + +**示例**: + +```bash +ping example.com +``` + +### 18. `traceroute` + +**使用场景**:显示到达网络主机的路径。 + +**核心术语**: + +- **hop**:从一个网络节点到另一个的跳转。 +- **TTL**:生存时间。 + +**示例**: + +```bash +traceroute example.com +``` + +### 19. `history` + +**使用场景**:显示命令历史记录。 + +**核心术语**: + +- **bash history**:记录用户输入的命令历史。 + +**示例**: + +```bash +history +``` + +`top` 命令用于显示系统的运行进程信息,包括 CPU 占用情况、内存占用情况、进程列表等。通过 `top` 命令可以实时监控系统的运行状态,了解系统的负载情况。 + +`pidof` 命令用于根据进程名查找对应的进程ID(PID)。例如,如果你知道某个进程的名字,但不知道它的PID,你可以使用 `pidof` 命令来查找。语法通常是 `pidof <进程名>`,比如 `pidof python` 会返回所有名为 `python` 的进程的PID。 + + + +`free` 和 `df -h` 是两个用于查看系统资源利用情况的常用命令: + +1. **`free`**:该命令用于显示系统内存的使用情况,包括物理内存和交换空间(swap)。执行 `free` 命令时,会显示系统的内存信息,包括总内存、已使用内存、空闲内存以及缓冲区和缓存等情况。 + + 示例输出: + + ``` + total used free shared buff/cache available + Mem: 8081256 2133468 3458604 430300 2488184 5261632 + Swap: 0 0 0 + ``` + + 输出中的字段含义如下: + + - `total`: 总内存量 + - `used`: 已使用的内存量 + - `free`: 空闲的内存量 + - `shared`: 用于共享的内存量 + - `buff/cache`: 用于缓存的内存量 + - `available`: 可用的内存量 + +2. **`df -h`**:该命令用于显示文件系统的磁盘空间利用情况。执行 `df -h` 命令时,会显示系统中每个挂载的文件系统的磁盘使用情况,包括总容量、已使用空间、剩余空间以及挂载点等信息。 + + 示例输出: + + ``` + Filesystem Size Used Avail Use% Mounted on + /dev/sda1 20G 15G 3.6G 81% / + /dev/sda2 30G 20G 8.8G 70% /home + ``` + + 输出中的字段含义如下: + + - `Filesystem`: 文件系统设备 + - `Size`: 文件系统总容量 + - `Used`: 已使用的空间 + - `Avail`: 可用空间 + - `Use%`: 使用百分比 + - `Mounted on`: 挂载点 + +通过这两个命令,你可以快速了解系统的内存和磁盘空间使用情况,以便进行系统资源管理和监控。 + + + +`du` 命令用于估算文件或目录的磁盘使用情况。它可以显示指定文件或目录的磁盘使用量,以及每个子目录的磁盘使用量,帮助用户了解文件系统上的空间分布情况。以下是 `du` 命令的一些常见使用场景: + +1. **查看当前目录的磁盘使用情况**: + + ``` + 复制代码 + du -h + ``` + + 这将以人类可读的格式显示当前目录及其所有子目录的磁盘使用情况。 + +2. **查看特定目录的磁盘使用情况**: + + ``` + du -h /目录名 + ``` + + 这将显示指定目录及其所有子目录的磁盘使用情况。 + +3. **显示文件或目录的总磁盘使用量**: + + ``` + du -sh /path/to/file_or_directory + ``` + + 这将显示指定文件或目录的总磁盘使用量, `-s` 参数表示仅显示总和, `-h` 表示以人类可读的格式显示。 + +4. **显示目录中每个文件的磁盘使用量**: + + ``` + 复制代码 + du -ah /path/to/directory + ``` + + 这将显示指定目录中每个文件的磁盘使用量, `-a` 参数表示包括所有文件。 + +5. **按照磁盘使用量排序显示目录**: + + ``` + du -h | sort -h + ``` + + 这将按照磁盘使用量从小到大排序显示当前目录及其所有子目录的磁盘使用情况。 + +6. **限制显示的深度**: + + ``` + du -h --max-depth=1 /path/to/directory + ``` + + 这将仅显示指定目录的直接子目录的磁盘使用情况, `--max-depth` 参数用于指定显示的深度。 \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240615 \347\224\250\346\210\267\344\270\216\346\226\207\344\273\266\346\235\203\351\231\220\347\232\204\347\256\241\347\220\206.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240615 \347\224\250\346\210\267\344\270\216\346\226\207\344\273\266\346\235\203\351\231\220\347\232\204\347\256\241\347\220\206.md" new file mode 100644 index 0000000000000000000000000000000000000000..d4bdf4574ede954822fb37c1ad9e2e50b75e2efd --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240615 \347\224\250\346\210\267\344\270\216\346\226\207\344\273\266\346\235\203\351\231\220\347\232\204\347\256\241\347\220\206.md" @@ -0,0 +1,290 @@ +# 用户与文件权限的管理 + +课后作业: + +什么是linux 硬连接和软连接(快捷方式) + +​ 1.硬链接共享inode,而软链接不共享 + +​ 2.硬链接必须在同一文件系统中,而软链接可以跨文件系统 + +​ 3.删除硬链接不会影响原始文件,但删除软链接不影响目标文件 + +​ 4.软链接类似于快捷方式,存储着源文件的位置信息 + +1. 1. 分类 + - 超级用户 root ,最高权限,不受一般权限的限制,编号0 ,提示符是 # + - 内置用户 :由系统自动创建 ,编号1-999 + - 普通用户 :我们用root权限手动创建用户,受权限控制 ,编号从1000依次递增 + - 创建普通用户test会自动创建他的编号u ,他原生组g(和用户名同名test),附加组 G (test),初始化的时候一定是u 1000(test), 1000(test),1000(test) + - 普通不能创建普通用户,只有root + - 提示符是 $ + - u user 用户 uid + - group 组 gid + - Group + 2. 用户 + 1. 添加 + - useradd -m -d /home/YYY -s /bin/bash XXX + - adduser + 2. 删除 + - userdel XXX + - userdel -r xxx 删除用户和相关的目录 + 3. 修改 + - usermod -G 组号|组名 XXX : usermod -G stu u15 覆盖原来的附加组(扩展组) + - usermod -aG 组号|组名 XXX : usermod -aG stu u15 保留原有附加组前提下,追加新的附加组 + - usermod -s /bin/aaa u15 + 4. 密码 + - passwd 用户名 root修改指定用户的密码 + - passwd 修改当前登录用户的密码,即自己的密码 + 5. 查询 + - id 用户名 指定用户 + - /etc/passwd + 6. 切换 + - su 仅仅切换了身份,不切换目录和shell等环境 + - su - 完全切换,连环境变量和目录一起切换 + 3. 用户组:编号也是从1000开始 + 1. 添加 + - groupadd student 添加一个组,编号自动的 + - groupadd -g 8888 student2 添加一个组,编号自动的 + 2. 删除 groupdel 组号|名 + 3. 修改 groupmod + 4. 查询 + - /etc/group +2. 文件管理 + - 文件属性:10个字符,连接数或子目录数,文件拥有者,文件所属的用户组,文件大小,修改时间,文件|目录名 + - 10个字符: + - 第1位 文件类型 + - d 目录 + - -普通文件 + - l 连接文件 + - b c s p 等其它文件 + - 后9位分别代表了:三种角色的权限,每3位一组 + - 2-4 拥有者权限 + - 5-7 用户组的权限 + - 8-10 其它人的权限 + - 基本权限 + - 读 r (read) : 打开并显示文件内容,查看目录基本信息 + - 写 w (write) : 文件,可以写入,修改,删除内容,目录:创建,修改,删除文件|目录 + - 执行 x (execute) :文件如果是二进制或脚本文件就可以执行,目录表示可以进入 + - 特殊权限 + - SUID + - GUID + - 隐藏权限 + - lsattr 列出隐藏权限 + - chattr 修改隐藏权限 + - +i 增加,不得任意更动文件或目录的效果 + - -i 消除 + - + - 权限表示 + - 字符 + - 数字 + - r == 4 + - w == 2 + - x == 1 + - 身份表示 + - u 拥有者 (user) + - g 用户组(group) + - o 其它人 (other) + - a 所有人 (all) + - 修改权限 :root可以改任何文件,而拥有者可以改自己拥有文件 + - chmod 要的权限 文件|目录 + - chmod u+w,g-r,o=rw 1.txt + - chmod 755 1.txt + - 修改拥有者 + - chown 用户名 文件名 + - 修改文件所属的用户组 + - chgrp 组名|号 文件|目录 + - sudo + - 修改 /etc/sudoers 文件 + - 将 用户追加到sudo组 :sudo usermod -aG sudo u15 +3. Linux执行命令的过程 + 1. 如果这个命令是绝对路径,就直接执行 + 2. 如果不是, + 1. 查一下是不是别名,是执行对应的命令 + 2. 从环境变量中找这个命令 $PATH中的路径依次查找这个命令 + 3. 本地也没有,就报错了。 + + + +### 权限管理练习 + +1. 创建/guanli 目录,在/guanli下创建zonghe 和 jishu 两个目录(一条命令) + + ~~~bash + sudo mkdir -p /guanli/zonghe /guanli/jishu + ~~~ + + + +2. 添加组帐号zonghe、caiwu、jishu,GID号分别设置为2001、2002、2003 + + ~~~bash + sudo groupadd -g 2001 zonghe + sudo groupadd -g 2002 caiwu + sudo groupadd -g 2003 jishu + ~~~ + + + +3. 创建jerry、kylin、tsengia、obama用户,其中的kylin用户帐号在2020年12月30日后失效 + + ~~~bash + sudo useradd jerry kylin tsengia obama + sudo chage -E 2020-12-30 kylin + ~~~ + + + +4. 将jerry、kylin、tsengia、obama等用户添加到zonghe组内 + + ~~~bash + usermod -aG zonghe jerry + usermod -aG zonghe kylin + usermod -aG zonghe tsengia + usermod -aG zonghe obama + ~~~ + + + +5. 创建handy、cucci用户,其中cucci帐号的登录Shell设置为“/sbin/nologin” + + ~~~bash + sudo useradd -s /sbin/nologin cucci | sudo useradd handy + ~~~ + + + +6. 将handy、cucci等用户添加到jishu组内 + + ~~~bash + usermod -aG jishu handy + usermod -aG jishu cucci + ~~~ + + + +7. 将上述的所有用户均要求加入到guanli组内 + + ~~~bash + usermod -aG guanli handy + usermod -aG guanli cucci + usermod -aG guanli jerry + usermod -aG guanli kylin + usermod -aG guanli tsengia + usermod -aG guanli obama + ~~~ + + + +8. 将zonghe组内的obama用户删除 + + ~~~bash + sudo usermod -G zonghe obama + ~~~ + + + +9. 为jerry用户设置密码为“123456”(使用普通方法)为cucci用户设置密码为“redhat” + + ~~~bash + passwd jerry 然后输入新密码 123456 + passwd cucci 然后输入新密码 redhat + ~~~ + + + +10. 将jerry用户锁定,并查看锁定状态 + + ~~~bash + passwd -l jerry //锁定jerry + passwd -S jerry //查看锁定 + ~~~ + + + +11. 打开两个xshell窗口,通过(who 或者 w)命令查看连接状态,并通过fuser杀掉其中一个 + + ~~~bash + 先安装 apt-get install psmisc + fuser -k /dev/pts/3 + ~~~ + + + +12. 查看cucci用户,属于那些组,并查看其详细信息 + + ~~~bash + groups cucci + ~~~ + + + +13. 手工创建账号student(预留) + + ~~~bash + adduser stundet + ~~~ + + + +14. 设置权限及归属:/guanli目录属组设为guanli, /guanli/zonghe目录的属组设为zonghe /guanli/jishu目录的属组设为jishu,设置3个目录都是禁止其他用户访问的权限 + + ~~~bash + chgrp guanli /guanli | chgrp zonghe /guanli/zonghe | chgrp jishu /guanli/jishu + + chmod 770 /guanli + chmod 770 /guanli/zonghe + chmod 770 /guanli/jishu + ~~~ + + + +15. 建立公共目录/ceshi允许技术组内的所有用户读取、写入、执行文件, 禁止其他用户读、写、执行 + + ~~~bash + sudo mkdir -m 770 /ceshi + ~~~ + + + +16. 清除jerry用户密码 + + ~~~bash + passwd -d jerry + ~~~ + + + +17. 锁定cucci用户密码并查看状态 + + ~~~bash + passwd -l cucci //锁定 + passwd -S cucci //查看 + ~~~ + + + +18. 修改obama用户的UID为8888 + + ~~~bash + sudo usermod -u 8888 obama + ~~~ + + + +19. 通过passwd命令修改kylin用户的最长密码使用期限为60天 + + ~~~bash + sudo chage -M 60 kylin + ~~~ + + + +20. 通过id groups等命令查看用户handy信息 + + ~~~bash + id handy + groups handy + ~~~ + + \ No newline at end of file diff --git "a/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240617 \345\221\250\346\234\237\344\273\273\345\212\241.md" "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240617 \345\221\250\346\234\237\344\273\273\345\212\241.md" new file mode 100644 index 0000000000000000000000000000000000000000..ec0b78ea3783b98502b2a8307f70de44cda3fdad --- /dev/null +++ "b/05 \350\260\242\351\223\226\346\265\251\345\270\205\346\260\224\345\217\210\345\270\205\346\260\224/20240617 \345\221\250\346\234\237\344\273\273\345\212\241.md" @@ -0,0 +1,301 @@ +### 周期任务练习 + +执行在家目录touch a.txt + +1. 每天3:00执行一次 + + ~~~bash + 00 3 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +2. 每周六2:00执行 + + ~~~bash + 00 2 * * * 6 echo 111 >> /home/zpp/a.txt + ~~~ + + + +3. 每周六1:05执行 + + ~~~bash + 5 1 * * 5 echo 111 >> /home/zpp/a.txt + ~~~ + + + + + +4. 每周六1:25执行 + + ~~~ bash + 25 1 * * 6 echo 111 >> /home/zpp/a.txt + ~~~ + + + +5. 每天8:40执行 + + ~~~bash + 40 8 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +6. 每天3:50执行 + + ~~~bash + 50 3 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +7. 每周一到周五的3:40执行 + + ~~~bash + 40 3 * * 1-5 echo 111 >> /home/zpp/a.txt + ~~~ + + + +8. 每周一到周五的3:41开始,每10分钟执行一次 + + ~~~bash + 41/10 3 * * 1-5 echo 111 >> /home/zpp/a.txt + ~~~ + + + +9. 每天的10:31开始,每2小时执行一次 + + ~~~bash + 31 10/2 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +10. 每周一到周三的9:30执行一次 + + ~~~bash + 30 9 * * 1-3 echo 111 >> /home/zpp/a.txt + ~~~ + + + +11. 每周一到周五的8:00,每周一到周五的9:00执行一次 + + ~~~bash + 00 8 * * 1-5 echo 111 >> /home/zpp/a.txt + 00 9 * * 1-5 echo 111 >> /home/zpp/a.txt + ~~~ + + + +12. 每天的23:45分执行一次 + + ~~~ bash + 45 23 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +13. 每周三的23:45分执行一次 + + ~~~bash + 45 23 * * 3 echo 111 >> /home/zpp/a.txt + ~~~ + + + +14. 每周一到周五的9:25到11:35、13:00到15:00之间,每隔10分钟执行一次 + + ~~~bash + 25-59/10 9 * * 1-5 echo 111 >> /home/zpp/a.txt + */10 10 * * 1-5 echo 111 >> /home/zpp/a.txt + 00-35/10 11 * * 1-5 echo 111 >> /home/zpp/a.txt + + 00-59/10 13-15 * * 1-5 echo 111 >> /home/zpp/a.txt + ~~~ + + + +15. 每周一到周五的8:30、8:50、9:30、10:00、10:30、11:00、11:30、13:30、14:00、14:30、5:00分别执行一次 + + ~~~bash + 30,50 8 * * 1-5 echo 111 >> /home/zpp/a.txt + 30 9 * * 1-5 echo 111 >> /home/zpp/a.txt + 00,30 10-14 * * 1-5 echo 111 >> /home/zpp/a.txt + ~~~ + + + +16. 每天16:00、10:00执行一次 + + ~~~bash + 00 10,16 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +17. 每天8:10、16:00、21:00分别执行一次 + + ~~~bash + 10 8 * * * echo 111 >> /home/zpp/a.txt + 00 16,21 * * * echo 111 >> /home/zpp/a.txt + ~~~ + + + +18. 每天7:47、8:00分别执行一次 + +~~~bash +47 7 * * * echo 111 >> /home/zpp/a.txt +00 8 * * * echo 111 >> /home/zpp/a.txt +~~~ + + + +### 笔记 + +## Cron的配置文件 + +在Debian系统中,Cron任务的配置文件通常分为以下几类: + +1. **用户级Cron任务**:每个用户都有自己的Cron任务配置文件,位于`/var/spool/cron/crontabs/username`。 +2. **系统级Cron任务**:系统级的Cron任务配置文件位于`/etc/crontab`和`/etc/cron.d/`目录下。 +3. **周期性任务目录**:这些目录包含在特定时间间隔运行的脚本,例如: + - `/etc/cron.hourly/` + - `/etc/cron.daily/` + - `/etc/cron.weekly/` + - `/etc/cron.monthly/` + +## 3. 编辑Cron任务 + +### 3.1 使用`crontab`命令 + +用户可以使用`crontab`命令来编辑、查看或删除自己的Cron任务【用户级】。 + +cron table 时间周期表,计划任务表 + +- **编辑Cron任务**: + + ```sh + crontab -e # edit + ``` + + 这将打开用户的Cron配置文件进行编辑。 + +- **查看Cron任务**: + + ```sh + crontab -l # list + ``` + + 这将列出用户当前的Cron任务。 + +- **删除Cron任务**: + + ```sh + crontab -r # remove + ``` + + 这将删除用户的所有Cron任务。 + + ### 3.4 特殊符号 + + **常用的如下:** + + 1. **星号(`*`)** + + - **含义**:匹配任何值,,即每一。 + - **示例**:在分钟字段中使用 `*` 表示每一分钟都运行一次任务。 + + ```sh + * * * * * /path/to/command + ``` + + 2. **逗号(`,`)** + + - **含义**:指定一个列表值,列出所有指定值 a,b,c。 + - **示例**:在小时字段中使用 `0,6,12,18` 表示任务将在每天的0点、6点、12点和18点运行。 + + ```sh + 0 0,6,12,18 * * * /path/to/command + ``` + + 3. **短横线(`-`)** + + - **含义**:指定一个范围值,开始-结尾。 + - **示例**:在日期字段中使用 `1-5` 表示任务将在每个月的1号到5号之间运行。 + + ```sh + 0 0 1-5 * * /path/to/command + ``` + + 4. **斜杠(`/`)** + + - **含义**:指定步长值,即间隔。 + - **示例**:在分钟字段中使用 `*/15` 表示任务每15分钟运行一次。 + + ```sh + */15 * * * * /path/to/command + ``` + + 5. **L(Last)** + + - **含义**:表示最后一个。可以在月的天数或星期几中使用。 + - **示例**:在日期字段中使用 `L` 表示每个月的最后一天。 + + ```sh + 0 0 L * * /path/to/command + ``` + + - **示例**:在星期几字段中使用 `5L` 表示每个月的最后一个星期五。 + + ```sh + 0 0 * * 5L /path/to/command + ``` + + 1. **全局配置文件**:`/etc/crontab` 是一个全局配置文件,用于定义系统级的定时任务。 + + 2. **文件格式**:与用户级的 `crontab` 文件相比,`/etc/crontab` 多了一个字段,用于指定执行任务的用户。格式如下: + + ``` + m h dom mon dow user command + ``` + + 例如: + + ``` + 30 2 * * * root /usr/local/bin/backup.sh + ``` + + 这行表示每天凌晨2:30以root用户的身份执行 `/usr/local/bin/backup.sh`。 + + **使用场景:** + + - **统一管理系统任务**:适合定义一些系统级的任务,比如系统备份、日志轮替等。 + - **需要不同用户执行的任务**:如果需要在同一文件中定义由不同用户执行的任务,可以使用 `/etc/crontab`。 + + #### **4.1.2** **`/etc/cron.d/`** + + **特点:** + + 1. **目录结构**:`/etc/cron.d/` 目录中可以包含多个文件,每个文件可以定义多个任务。 + + 2. **文件格式**:与 `/etc/crontab` 文件的格式相同,需要包含一个用户字段。格式如下: + + ``` + m h dom mon dow user command + ``` + + 例如,在 `/etc/cron.d/mytasks` 文件中: + + ``` + 0 4 * * * root /usr/local/bin/daily_task.sh + 15 14 1 * * user /usr/local/bin/monthly_report.sh + ``` + +