02_目录与文件的基本操作
vi是 Linux/Unix 系统**内置的文本编辑器(类似于windows中的记事本功能),功能强大,轻量高效,是很多运维**和开发人员的“必备工具”。无需安装,几乎在所有 Linux 系统中都内置键盘驱动、无鼠标依赖,适合远程终端操作**Vim**是 Vi 的增强版,有代码高亮,日常工作中推荐使用vimvim并非系统自带,如果没有需要安装后才能使用,安装带有图形化服务器默认已安装。
一、Linux目录结构
Linux 系统的目录结构采用层次化设计,它不像windows系统有盘符概念,它没有盘符这个概念,一切从根目录 / 开始逐级扩展,了解和掌握这些目录的作用和内容有助于我们更好地管理和维护系统。
Linux中万物即文件
Linux常见目录结构
|
目录 |
作用 |
|
|
常用命令二进制文件(命令文件),如 |
|
/boot |
系统引导程序所需要的文件目录,相当于Windows中的C盘 |
|
/dev |
/device缩写,设备文件,磁盘,光驱,网卡 |
|
|
系统配置文件,如 |
|
|
普通用户的家目录,默认用户数据存放目录,itheima账号 => /home/itheima文件夹 |
|
/lib |
共享库文件和内核模块存放目录,软件安装、运行依赖库文件.a、.so文件 |
|
/mnt |
临时挂载储存设备的挂载点,插入u盘、移动硬盘 |
|
/opt |
额外的应用软件包, 安装qq、游戏、wps办公软件 (二进制安装) |
|
/proc |
process进程目录,操作系统运行时,进程信息和内核信息存放在这里 查看 |
|
|
Linux超级权限用户root的家目录,超级管理员root => /root |
|
|
系统管理员命令,如 |
|
|
临时文件目录,这个目录被当作回收站使用 |
|
/usr/local |
用户或系统软件应用程序目录,一般为源码安装软件,默认都指向到此 |
|
|
存放可变数据,如日志、缓存、数据库数据 |
bin装工具(命令),sbin装管理,etc配配置,home住用户,usr装应用,var变不停,boot来启动,tmp暂时存
二、目录文件相关命令
在 Linux 中,“目录”就像文件夹,是组织和存放文件的基础结构。
常见操作包括:
- 创建、移动、重命名、删除目录
- 切换当前目录
- 查看目录结构
2.1、定位、查看与切换
2.1.1、pwd定位[我在哪]
pwd(print working directory):显示当前工作路径
用途:调试脚本时确认当前目录、登录远程系统后快速定位位置(路径)。
语法:pwd
示例:
# pwd得到的路径为绝对路径
# 查看当前所在的位置,返回位置的路径
[root@node01 ~]# pwd
# 返回的路径 -- 绝对路径
/root
# 普通用户 ~ 家目录就在 /home下面
[itwu@node1 ~]$ pwd
/home/itwu
路径分割符:Linux中路径分割符为 /
window中路径分割符为 \
路径:
相对路径
绝对路径
## 绝对路径
### 在Linux中它是以/来开始就是绝对路径, 第1个位置一定为 /
### 好处:路径清晰,查找快速,不关心你当前所在的位置。
### 坏处:书写时可能因为层级较多,书写过程中有错
### 建议:在Linux建议如果以后大家要用到路径时,对你新手全用绝对路径。
### 例:/root /a/b/c/d
## 相对路径
### 相对于某个参照路径来进行的
### . 当前路径 ./a => 当前目录下面a
### .. 上一级路径 ../a => 上一级路径下面的a
2.1.2、cd切换目录路径[我要去哪]
cd(change directory):切换目录路径
cd命令它不是shell命令,它是内置命令,在今后的shell脚本中只能用**cd**去用。
- 格式:
cd 路径
-
- 路径
-
-
- 相对
-
-
-
- 绝对
-
|
命令 |
含义 |
|
cd |
切换到用户家目录(root用户主目录是/root,其他用户是/home/用户名)等价于 |
|
cd 目录 |
切换到指定目录下 => cd /etc |
|
cd .. |
切换到上级目录 |
|
cd - |
返回上一次所在目录 |
# 切换到/home目录中
[root@node1 ~]# cd /home
[root@node1 home]# pwd
/home
# 切换到home目录下面的子目录中(itwu)
[root@node1 home]# cd /home/itwu
# 返回到home目录中, 绝对路径
[root@node1 itwu]# cd /home
[root@node1 home]# pwd
/home
# 相对路径来完成cd使用
[root@node1 home]# cd itwu
# 返回到上一级目录中
[root@node1 itwu]# cd ..
# 切换到root家目录
#[root@node1 home]# cd /root
#[root@node1 home]# cd ~
# 直接cd后面不加路径,它就会切换到当前用户的家目录中
[root@node1 home]# cd
# 返回到刚刚来源目录中
[root@node1 ~]# cd -
/home
# 切换到一个有兄弟目录的目录中
[root@node1 ~]# cd /etc/cockpit/machines.d
# 切换到machines.d目录它的兄弟目录(ws-certs.d)中去,一定要在..后面加路径分割符
[root@node1 machines.d]# cd ../ws-certs.d/
[root@node1 ws-certs.d]# pwd
/etc/cockpit/ws-certs.d
2.1.3、ls列出目录的内容[我下面有谁]
ls(list show):列出目录的内容,是用户最常用的命令之一
ls常用选项:
|
选项 |
含义 |
|
-a/-A |
all所有, 显示指定目录下所有子目录与文件, 包含隐藏文件-a 它会显示 . 和 ..-A 不会显示 . 和 .. |
|
-l |
list,以列表方式来显示目录下面的文件或子目录 ls -l 可以使用别名 |
|
-h |
配合 -l 以人性化的方式显示文件大小(文件大小 + 单位) |
|
-R |
递归列出所有子目录 |
Linux中,文件名或目录名只要是以 .开头,它就是隐藏文件或目录
**ls -a**执行后,出现隐藏文件或目录同时还有两个特殊目录
# 显示当前root家目录下面内容
[root@node1 ~]# pwd
/root
# ls它只是显示非隐藏文件,在linux中只要以.开头的文件或目录都为隐藏文件或目录
[root@node1 ~]# ls
anaconda-ks.cfg
# 显示所有的文件包含隐藏文件
# -a 它会在显示时,显示.和..,而-A不会
[root@node1 ~]# ls -a
. anaconda-ks.cfg .bash_profile .cache .ssh .Xauthority
.. .bash_logout .bashrc .cshrc .tcshrc
[root@node1 ~]# ls -A
anaconda-ks.cfg .bash_profile .cache .ssh .Xauthority
.bash_logout .bashrc .cshrc .tcshrc
# 以详情列表的方式展结果 -l
# 第1位,标红的,为文件类型
## - 普通文件
## d 目录
# 1368 文件大小,它默认为字节 1024byte = 1kb 1024kb = 1mb 1024mb = 1gb 1024gb = 1tb
[root@node1 ~]# ls -lA
总用量 28
-rw-------. 1 root root 1368 1月 16 17:21 anaconda-ks.cfg
drwx------. 2 root root 6 1月 16 17:24 .cache
# 列表展示时,文件大小以可视化单位来展示 -h
[root@node1 ~]# ls -lAh
总用量 28K
-rw-------. 1 root root 1.4K 1月 16 17:21 anaconda-ks.cfg
-rw-r--r--. 1 root root 18 8月 10 2021 .bash_logout
# ls -l 别名使用方式 ll,此方式只能在命令中使用,不能在别的命令中如果有ls场景,则不能用ll
[root@node1 ~]# ll
总用量 4
-rw-------. 1 root root 1368 1月 16 17:21 anaconda-ks.cfg
[root@node1 ~]# ll -hA
总用量 28K
-rw-------. 1 root root 1.4K 1月 16 17:21 anaconda-ks.cfg
# ls后面也可以跟路径,默认只展示目录下面的第1层
[root@node1 ~]# ls /boot
config-5.14.0-511.el9.x86_64
efi
grub2
initramfs-0-rescue-5ef24dbca44d459480af1246331a84e6.img
initramfs-5.14.0-511.el9.x86_64.img
initramfs-5.14.0-511.el9.x86_64kdump.img
loader
symvers-5.14.0-511.el9.x86_64.gz
# 递归展示指定目录下面所有的子目录列表
[root@node1 ~]# ls -R /boot
/boot:
config-5.14.0-511.el9.x86_64
efi
grub2
# 以树状形式来展示目录结构和文件
[root@node1 ~]# tree /boot
/boot
├── config-5.14.0-511.el9.x86_64
├── efi
│ └── EFI
│ ├── BOOT
│ │ ├── BOOTX64.EFI
│ │ └── fbx64.efi
2.2、目录管理命令
2.2.1、创建目录(mkdir)
mkdir(make directory):创建目录
# 语法
mkdir [-p] 路径
参数说明:
-p:parents一次创建多级目录
# 在系统的根目录下面创建一个data目录
[root@node1 ~]# mkdir /data
# 查看是否创建data目录成功
[root@node1 ~]# ls /
afs boot dev home lib64 mnt proc run srv tmp var
bin data etc lib media opt root sbin sys usr
# 进入到/data目录中
[root@node1 ~]# cd /data
[root@node1 data]# pwd
/data
# 手动创建多层级空目录
[root@node1 data]# mkdir a
[root@node1 data]# cd a
[root@node1 a]# mkdir b
[root@node1 a]# cd b
[root@node1 b]# mkdir c
[root@node1 b]# cd /data
[root@node1 data]# tree
.
└── a
└── b
└── c
# 一次创建多级目录 -p
[root@node1 data]# mkdir -p aa/bb/cc
[root@node1 data]# tree
.
├── a
│ └── b
│ └── c
└── aa
└── bb
└── cc
# app目录里面有两个子目录 分别叫 logs 和 src 技巧,使用{}
[root@node1 data]# mkdir -p app/{logs,src}
[root@node1 data]# tree app
app
├── logs
└── src
# 空格可以创建多个同级目录
[root@node1 data]# mkdir web1 web2
[root@node1 data]# ls
a aa app web1 web2
2.3.2、删除空目录(rmdir)【了解】
作用:rmdir命令用于删除空目录
# 语法
rm [-p] 目录或路径
# 参数说明
-p 递归删除空目录
# 删除指定的空目录
[root@node1 data]# ls
a aa app web1 web2
# web1它一定是一个空目录
[root@node1 data]# rmdir web1
[root@node1 data]# ls
a aa app web2
# rmdir无法删除一个非空目录
[root@node1 data]# ls web2
时间表.png
[root@node1 data]# rmdir web2
rmdir: 删除 'web2' 失败: 目录非空
# 递归删除多级空目录,每级只能是它自己且为空
# a下面只有b,b下面只有c,而且c是一个空的
[root@node1 data]# rmdir -p a/b/c
# 删除app目录及它的子目录 src,但app目录下面还有一个logs子目录,所以此方案删除就会出现app无法被删除掉,因为还有一个logs目录
[root@node1 data]# rmdir -p app/src
rmdir: 删除目录 'app' 失败: 目录非空
[root@node1 data]# ls app
logs
2.3、综合练习
搭建一个【游戏存档】目录
任务:
- 在用户家目录创建
game_saves目录,进入它
- 创建子目录
level1、level2、backup
- 在
backup中创建100和200目录
- 删除
backup/100,再尝试删除整个game_saves(观察错误)
# cd回车就会到家目录中
[root@node1 ~]# cd
# 创建空目录
[root@node1 ~]# mkdir game_saves
[root@node1 ~]# cd game_saves/
[root@node1 game_saves]# mkdir leve1 leve2 backup
[root@node1 game_saves]# ls
backup leve1 leve2
[root@node1 game_saves]# mkdir backup/{100,200}
[root@node1 game_saves]# ls backup/
100 200
[root@node1 game_saves]# rmdir backup/100
[root@node1 game_saves]# ls backup/
200
[root@node1 game_saves]# cd ..
[root@node1 ~]# rmdir game_saves/
rmdir: 删除 'game_saves/' 失败: 目录非空
# rmdir它只能删除空目录,而此时game_saves它是一个非空的目录,所以删除不成功
[root@node1 ~]# tree game_saves/
game_saves/
├── backup
│ └── 200
├── leve1
└── leve2
2.4、文件管理命令
2.4.1、创建空文件 touch
作用:touch命令创建新空文件
# 语法:
touch [选项] 新文件名称
# 选项说明
-d "字符串" 指定文件的时间戳(日期和时间),而不是使用当前时间[创建时间系统自动维护]
# 指定具体的日期
# touch -d "2025-01-01 10:00:00" test.txt
# 昨天
# touch -d "yesterday" a.log
# 今天
# touch -d "today" a.log
# 前两天
# touch -d "2 days ago" b.log
# 切换到 /data 目录中去操作
[root@node1 data]# cd /data
# 在 /data 目录下面创建两个空文件
[root@node1 data]# touch 1.txt
[root@node1 data]# touch 2.txt
[root@node1 data]# ll
总用量 0
-rw-r--r--. 1 root root 0 1月 17 15:42 1.txt
-rw-r--r--. 1 root root 0 1月 17 15:42 2.txt
# touch 指定日期来创建文件,修改的是文件修改日期和访问日期,而文件的创建日期还是当前时间,不能更改的
[root@node1 data]# touch -d '2026-01-10 12:12:12' 4.txt
[root@node1 data]# ll
总用量 0
-rw-r--r--. 1 root root 0 1月 17 15:42 1.txt
-rw-r--r--. 1 root root 0 1月 17 15:42 2.txt
-rw-r--r--. 1 root root 0 1月 17 15:43 3.txt
-rw-r--r--. 1 root root 0 1月 10 12:12 4.txt
# stat 查看指定文件的详情信息
[root@node1 data]# stat 5.txt
文件:5.txt
大小:0 块:0 IO 块:4096 普通空文件
设备:fd00h/64768d Inode:1396648 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:default_t:s0
最近访问:2025-02-10 12:12:12.000000000 +0800
最近更改:2025-02-10 12:12:12.000000000 +0800
最近改动:2026-01-17 15:45:06.822905124 +0800
创建时间:2026-01-17 15:45:06.822905124 +0800
# 指定修改文件的日期为1天前
[root@node1 data]# ll
总用量 0
-rw-r--r--. 1 root root 0 1月 17 15:42 1.txt
-rw-r--r--. 1 root root 0 1月 17 15:42 2.txt
-rw-r--r--. 1 root root 0 1月 17 15:43 3.txt
-rw-r--r--. 1 root root 0 1月 10 12:12 4.txt
-rw-r--r--. 1 root root 0 2月 10 2025 5.txt
# 推荐此方案
[root@node1 data]# touch -d '1 days ago' 2.txt
[root@node1 data]# ll 2.txt
-rw-r--r--. 1 root root 0 1月 16 15:49 2.txt
[root@node1 data]# touch -d 'yesterday' 1.txt
[root@node1 data]# ll 1.txt
-rw-r--r--. 1 root root 0 1月 16 15:50 1.txt
# 修改日期为当天时间
[root@node1 data]# touch -d 'today' 5.txt
[root@node1 data]# ll 5.txt
-rw-r--r--. 1 root root 0 1月 17 15:51 5.txt
2.4.2、输出 echo
作用:把指定的内容“打印”到屏幕上(或重定向到文件)
# 语法
## 字符串 只要内容有空格,就用引号包起来
echo [选项] 字符串
# 选项
-e 启用转义字符(如 \n 换行、\t 制表符) echo -e "Line1\nLine2"
### 重点
# echo + 输出重定向 = 快速创建并写入内容到文件中
## 输出重定向: 它允许你改变命令的输出去向,而不是默认的屏幕输出。
# 输出重定向符号
> 覆盖写入 stdout 到文件(原文件内容被清空) echo "hi" > file.txt
>> 追加写入 stdout 到文件(内容加到文件末尾) echo "bye" >> file.txt
## 常用的 3 个文件描述符 配合输出重定向来使用的
### 文件描述符 名称 含义 默认指向
### 0 stdin 标准输入 键盘
### 1 stdout 标准输出 终端
### 2 stderr 标准错误输出 终端
### 3 及以上是“用户自定义文件描述符”
# 在屏幕中输出 hello
[root@node1 data]# echo hello
hello
# 如果你的输出语句中有空格,则建议用,引号括起来,单双引号都可以
[root@node1 data]# echo "hello world"
hello world
[root@node1 data]# echo 'hello world'
hello world
# 如果一个输出语句中,需要换行显示,则要用到换行符\n,但\n它一定要求echo 必须要加一选项-e,且一定要用引号把输出语句括起来,则生效
[root@node1 data]# echo -e 'hello\nworld'
hello
world
# 制表符 \t
[root@node1 data]# echo -e 'hello\tworld'
hello world
################################## 输出重定向新文件写入内容
# 如果2.txt文件不存在,先创建2.txt文件,并把hello字符串,写入到此文件中,如果2.txt存在则直接覆盖原数据
[root@node1 data]# echo hello >2.txt
[root@node1 data]# ls
1.txt 2.txt
# 追加到指定的文件中
# 追加前提是文件存在我才追加,如果2.txt文件不存在则它先创建再写入,后续才进行追加
[root@node1 data]# echo bbb >>2.txt
# 重定向中文件描述符 1 和 2
#[root@node1 data]# echo hello 1>2.txt
# >2.txt 前面的1> 可以不用写的,不写就是1,表示把正确的输出进行重定向
[root@node1 data]# echo hello >2.txt
# 根据不同的输出状态来分别接进行重定向到指定的文件中
[root@node1 data]# echo1 hello >2.txt 2>err.txt
[root@node1 data]# echo1 hello >>2.txt 2>>err.txt
# 把 正确的输出和错误的输出合到一个文件中呢?
[root@node1 data]# echo1 hello >>2.txt 2>>2.txt
# 2>&1 把错误的输出,指定和正确的输出中
[root@node1 data]# echo1 hello >>a.txt 2>&1
2.4.3、复制 cp
作用:cp(copy)命令用来实现文件或者目录的复制
# 语法
# 说明:默认 cp 就会覆盖(不提示)
cp [选项] 源文件路径 目标路径
# 选项说明
-i 覆盖既有文件之前先询问用户,超级管理员(root)默认会在别名中给加 -i alias查看得知
-r 递归,复制目录必须添加
-f 强制覆盖,当目标文件存在且无法正常覆盖时,先删除目标文件,再复制,针对于普通用户(权限不足情况)
# 环境准备
[root@node1 data]# mkdir backup
[root@node1 data]# ls
1.txt 2.txt a.txt backup err.txt
# 把1.txt文件复制到backup目录中
# backup/ 后面的 / 一定要记得加上,不能少了
[root@node1 data]# cp 1.txt backup/
[root@node1 data]# ls backup
1.txt
# 复制并重命名
# 把1.txt文件复制到backup目录下面,并给重命名为1_bak.txt文件
[root@node1 data]# cp 1.txt backup/1_bak.txt
[root@node1 data]# ls backup/
1_bak.txt 1.txt
# root账号下,复制1.txt到backup目录下面,且backup目录下面已有1.txt文件,此时会有询问,选择 y | n
[root@node1 data]# cp 1.txt backup/
cp:是否覆盖'backup/1.txt'? y
# 在root账号中,可以通过 \cp 来完成让此命令不走别名机制,进行使用原生cp命令功能,就不会有询问
[root@node1 data]# \cp 1.txt backup/
# 以普通用户来操作
[itwu@node1 ~]$ pwd
/home/itwu
[itwu@node1 ~]$ mkdir data
[itwu@node1 ~]$ cd data
[itwu@node1 data]$ pwd
/home/itwu/data
[itwu@node1 data]$ echo hello >1.txt
[itwu@node1 data]$ mkdir backup
[itwu@node1 data]$ ls
1.txt backup
# 在普通用户中cp同名文件到指定目录中不会有提示
[itwu@node1 data]$ cp 1.txt backup/
[itwu@node1 data]$ cp 1.txt backup/
#################### 复制目录
[root@node1 data]# mkdir web
[root@node1 data]# cd web
[root@node1 web]# echo 111 >1.txt
[root@node1 web]# echo 222 >2.txt
[root@node1 web]# ls
1.txt 2.txt
[root@node1 web]# cd ..
# 把 web目录,复制到backup目录下面 -r
[root@node1 data]# cp -r web backup/
[root@node1 data]# ls backup
1_bak.txt 1.txt web
# 复制web目录到backup中,并重命名
[root@node1 data]# cp -r web backup/web2026
[root@node1 data]# ls backup/
1_bak.txt 1.txt web web2026
# 复制同名的目录,尽量加一个 \cp 来完成,这样就没有了询问
[root@node1 data]# \cp -r web backup/
2.4.4、移动和重命名 mv
作用:mv(move)命令用于文件、目录的移动和重命名
# 语法
mv [选项] 源文件路径 目标路径
# 选项说明
-i 覆盖既有文件之前先询问用户
-f 强制覆盖
# 环境准备
[root@node1 data]# ls
backup web
# 把web目录下面的1.txt文件移动到backup目录下面
[root@node1 data]# ls
backup web
# backup/ 后面的路径分割符,一定不能少了
[root@node1 data]# mv web/1.txt backup/
[root@node1 data]# ls web
2.txt
[root@node1 data]# ls backup/
1.txt
# 移动并重命名
[root@node1 data]# mv web/2.txt backup/2.html
[root@node1 data]# ls web
[root@node1 data]# ls backup/
1.txt 2.html
# 移动目录 web目录 移动到backup中
[root@node1 data]# mv web backup/
[root@node1 data]# ls
backup
[root@node1 data]# ls backup/
1.txt 2.html web
# 强制移动
[root@node1 data]# touch 1.txt
[root@node1 data]# mv -f 1.txt backup/
# 重命名
[root@node1 data]# mkdir aaa
[root@node1 data]# ls
aaa backup
# mv 原目录名称 新名称
[root@node1 data]# mv aaa web
[root@node1 data]# ls
backup web
# 文件进行重命名
[root@node1 data]# cd backup/
[root@node1 backup]# ls
1.txt 2.html web
[root@node1 backup]# mv 2.html 2.txt
[root@node1 backup]# ls
1.txt 2.txt web
2.4.5、删除文件或目录 rm
# 语法
rm [选项] 目标或文件路径
# 选项说明
-i 询问是否要删除,root账号默认是要询问的,普通用户不询问
-r 是否启动递归删除方案(适用于删除目录的时候)
-f 是否需要强制删除,如果不添加, 会有一个询问的操作
# 删除指定的文件
# 删除并进行询问 y | n y同意删除 n后悔了
#[root@node1 backup]# rm 2.txt
#rm:是否删除普通文件 '2.txt'?n
# 强制删除指定的文件,不要提示 -f
[root@node1 backup]# rm -f 2.txt
# 删除指定的目录
# 返回上一级,不能在删除的目录里面去删除自己
[root@node1 backup]# cd ..
[root@node1 data]# ls
backup web
# 删除指定的目录 -r , backup后面不要加 /,如果写了也没有问题,就怕误触
[root@node1 data]# rm -rf backup
[root@node1 data]# ls
web
# 删除目录下面所有的文件,并保留目录存在
[root@node1 data]# mkdir web
[root@node1 data]# echo 111 >web/1.html
[root@node1 data]# echo 222 >web/2.html
# 通配符 * 0或n个字符
# web目录下面所有的文字或子目录
[root@node1 data]# rm -rf web/*
[root@node1 data]# ls
web
# 验证 * 它的范围
[root@node1 data]# echo 222 >web/a.
[root@node1 data]# ls web
1.html a.
[root@node1 data]# echo 222 >web/a.txt
# 删除了所有的a开头的
[root@node1 data]# rm -rf web/a.*
[root@node1 data]# ls web
1.html
注:日后在工作中如果用到了rm,请心中默念3遍我要真的去删除它吗?使用cp给我先备份,然后再删除,你会很快乐!
2.4.6、文本查找相关命令 find【重点】
作用: 用于查找文档
# 语法
find 搜索路径 搜索条件 [处理动作]
搜索路径:从哪个目录开始查找(如: /home)
搜索条件:按什么标准找(如文件名、大小、时间、类型等)
处理动作:查到之后干什么(如打印、删除、执行命令)
# 搜索条件参数说明
-name 按照文档名称进行搜索(支持模糊搜索)通配符(*),匹配任意个任意字符 -name "*.log"
-type 按照文档的类型进行搜索,文档类型的值,f(file)表示文件,d(directory)表示目录(文件夹) -type f
-size 用于根据文件大小查找文件。 -size +100M
格式为 [+/-]n[单位]
+n:查找大于 n单位 的文件
-n:查找小于 n单位 的文件
单位说明(注意单位字母大小写):
c:字节(默认单位)
k:千字节(KB)
M:兆字节(MB)
G:吉字节(GB)
-mtime 根据文件的修改时间来筛选文件,参数值是一个整数,表示天数 -mtime +30
-mtime +n:查找修改时间超过 n 天前的文件
-mtime -n:查找修改时间在 n 天以内的文件
-mtime n:查找修改时间正好是 n 天前的文件
-exec 用于对 find 查找到的文件执行指定的命令.
它的语法比较特殊,需要用 {} 表示查找到的文件,并用 \; 表示 -exec 命令的结束。
例如: 查找所有 .log 文件并删除find /var/log -name "*.log" -exec rm -f {} \;
示例:
# 在 /etc下面去找 issue文件
[root@node1 data]# find /etc/ -name 'issue' -type f
/etc/issue
# 使用通配符 然后再结合 类型完成过滤查找 只要匹配的目录
[root@node1 data]# find /etc/ -name '*conf*' -type d
/etc/X11/xorg.conf.d
/etc/krb5.conf.d
/etc/ld.so.conf.d
/etc/security/pwquality.conf.d
/etc/polkit-1/localauthority.conf.d
/etc/dracut.conf.d
/etc/containers/registries.conf.d
# 通配符,只要你记住一点,就可以去查找文件是否存在
[root@node1 data]# find /etc/ -name 'is*' -type f
/etc/logrotate.d/iscsiuiolog
/etc/issue
/etc/issue.net
/etc/iscsi/iscsid.conf
/etc/brltty/Text/is.ttb
# 根据文件大小来查找
## 查找大于10Mb的文件
[root@node1 data]# find /boot -size +10M -type f
/boot/vmlinuz-5.14.0-511.el9.x86_64
/boot/initramfs-5.14.0-511.el9.x86_64.img
/boot/vmlinuz-0-rescue-5ef24dbca44d459480af1246331a84e6
/boot/initramfs-0-rescue-5ef24dbca44d459480af1246331a84e6.img
/boot/initramfs-5.14.0-511.el9.x86_64kdump.img
## 查找小于10mb的文件
[root@node1 data]# find /boot -size -10M -type f
/boot/efi/EFI/BOOT/fbx64.efi
/boot/efi/EFI/BOOT/BOOTX64.EFI
/boot/efi/EFI/centos/mmx64.efi
# 查找大于30天之外的文件
[root@node1 data]# touch -d '2025-10-01 12:12:12' a.txt
[root@node1 data]# ll
总用量 0
-rw-r--r--. 1 root root 0 10月 1 12:12 a.txt
-rw-r--r--. 1 root root 0 1月 17 17:56 b.txt
drwxr-xr-x. 2 root root 20 1月 17 17:29 web
[root@node1 data]# find /data -mtime +30 -type f
/data/a.txt
# 查找当天的
[root@node1 data]# find /data -mtime 0 -type f
/data/web/1.html
/data/b.txt
# 查找到后的后续动作 -exec
[root@node1 data]# find /data -mtime +30 -type f -exec ls -l {} \;
-rw-r--r--. 1 root root 0 10月 1 12:12 /data/a.txt
# 查找到后进行删除操作
[root@node1 data]# find /data -mtime +30 -type f -exec rm -rf {} \;
[root@node1 data]# ls
b.txt web
# 查找到后进行cp
[root@node1 data]# mkdir /backup
[root@node1 data]# find /data -type f -exec cp {} /backup/ \;
[root@node1 data]# ls /backup/
1.html b.txt
[root@node1 data]# ls /data/
b.txt web
2.5、文件操作练习
2.5.1、日志文件管理与备份
某服务器日志目录 /data/nginx 需要定期清理和备份。要求:
- 创建 6 个不同日期的日志文件(如 access_1.log、access_2.log ...)
- 修改文件的最后时间为当天时间
- 将 3 天前的日志文件复制到 /backup/old_logs 目录
- 删除 5 天前的日志文件
2.5.2、清理临时文件
某临时目录 /tmp/userdata 中存在大量临时文件(文件名包含 tmp_ 前缀),要求:
- 查找所有 24 小时内修改过的 tmp_* 文件并移动到 /tmp/recent
- 删除超过 30 天未修改的 tmp_* 文件
2.5.3、查找特定文件并归档
某服务器 /usr/lib 目录下可能存在遗留的大文件(超过 100MB),要求:
- 查找所有大小超过 100MB 的文件。
- 将这些文件的路径记录到 /data/nginx/large_files.list文件中。
- 将这些文件复制到 /archive/large_files 目录
三、vi 编辑器
3.1、什么是 vi
vi 是 Linux/Unix 系统**内置的文本编辑器(类似于windows中的记事本功能),功能强大,轻量高效,是很多运维**和开发人员的“必备工具”。
- 无需安装,几乎在所有 Linux 系统中都内置
- 键盘驱动、
无鼠标依赖,适合远程终端操作
- **
Vim**是 Vi 的增强版,有代码高亮,日常工作中推荐使用vim
-
- vim并非系统自带,如果没有需要安装后才能使用,安装带有图形化服务器默认已安装。
3.2、vi 的三种模式
|
模式 |
作用 |
进入方式 |
|
命令模式 |
默认进入,执行操作命令(删除、复制、粘贴等) |
启动后默认 |
|
插入(编辑)模式 |
输入文本 |
按 |
|
末行模式 |
保存、退出、查找、替换等 |
在命令模式下按 |
模式切换图解
+-------------+ i/a/o +--------------+
| 命令模式 | ------------------> | 插入模式 |
| 默认 | <------------------ | 编辑文字 |
| | Esc | |
+-------------+ +--------------+
|
| :
v
+--------------+
| 末行模式 | :w保存 / :q退出 / :x保存退出 / :wq保存退出 ! 强制 :/ 查找或替换
+--------------+
3.3、vi 打开文件
语法:vi 文件名
- 文件存在 → 打开就可以进行查看和编辑
- 文件不存在 → 先在内存在创建一个新文件,只有你有写入内容并保存才会在磁盘中有文件
# 在指定的目录下面进行,vi打开文件
[root@node1 ~]# cd /data
[root@node1 data]# pwd
/data
# vi 文件名 注:如果你没有对打开的不存在的文件进行保存操作,则不会创建此文件
[root@node1 data]# vi hello.txt
# 复制/etc/passwd到当前/data目录下面
[root@node1 data]# cp /etc/passwd .
[root@node1 data]# ls
passwd
# 查看passwd文件, 退出按:q 退出
[root@node1 data]# vi passwd
3.4、命令模式(按 Esc 进入)
当我们通过vi/vim命令打开文件时,默认就处于命令模式
|
操作 |
命令 |
说明 |
|
删除字符 |
|
删除光标所在字符 |
|
删除整行 |
|
删除整行/删除2整行 |
|
删除光标所在位置到行尾 |
|
删除光标所在位置到行尾 |
|
复制行 |
|
复制当前行/复制2行 |
|
粘贴 |
|
在当前行下方粘贴 |
|
撤销 |
|
撤销上一步操作 |
|
光标移动 |
|
左 下 上 右 此按键可以不记 |
|
移动到首行 |
|
跳到文件第1行/跳转到指定的行 |
|
移动到末行 |
|
跳到文件最后一行 |
|
移动光标所在行首 |
|
移动光标所在行首 |
|
移动光标所在行尾 |
|
移动光标所在行尾 |
3.5、插入模式(用于编辑文本)
按以下任意键可进入插入模式:
插入模式中直接输入文字,按 Esc 返回命令模式。
|
键 |
说明 |
|
|
在光标前插入 |
|
|
在光标后插入 |
|
|
在下一行新建并插入 |
vi hello.txt
3.6、末行模式(在命令模式下按 : 进入)
|
命令 |
作用 |
|
|
保存文件 |
|
|
退出不保存(你只是打开了文件没有编辑,如果有编辑则一定要强退出) |
|
|
保存并退出 |
|
|
强制退出不保存 |
|
|
保存并退出(和 |
|
|
显示行号 |
|
|
取消行号显示 |
注 :wq和:x区别?
如果文件内容有改变,两者的效果是一样的。
如果文件内容没有改变,:x不会改变文件的最后修改时间,但是:wq会更新文件的最后修改时间。
运维工程师,强烈推荐使用:x
注:x一定为小写不能为大写
3.7、查找与替换(在末行模式)
3.7.1、查找字符串
语法::/关键词
n:查找下一个
N:查找上一个
:/hello
2.7.2、替换字符串
语法::%s/旧词/新词/g
%:表示全文件
g:表示一行中全部替换(否则只替换每行第一个)
# 将所有 "old" 替换为 "new"
:%s/old/new/g
四、查看ip和ping
4.1、查看 IP
- ifconfig
此命令是早期centos用来查看ip地址的命令,但现在已经不是默认,但公司中还是使用此命令用来查看ip地址为首选,因此需要安装一个**net-tools**软件,如果你安装的是图形无需要安装,默认已安装。
# 查看本机所的ip地址
[root@node01 data]# ifconfig
# 查看指定网卡ip地址
[root@node01 data]# ifconfig ens160
ens160: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.88.10 netmask 255.255.255.0 broadcast 192.168.88.255
- ip address
此命令是现在centos默认就支持的命令,无需安装即可使用
# 语法:
# 查看本机所有的ip地址
[root@node01 data]# ip a
# 查看指定的网卡ip
[root@node01 data]# ip a show ens160
2: ens160: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
link/ether 00:0c:29:c5:bf:2c brd ff:ff:ff:ff:ff:ff
altname enp3s0
inet 192.168.88.10/24 brd 192.168.88.255 scope global noprefixroute ens160
4.2、ping 命令
ping命令 用来测试主机之间网络的连通性。执行ping指令会使用ICMP传输协议,发出要求回应的信息,若远端主机的网络功能没有问题,就会回应该信息,因而得知该主机运作正常。
Linux中ping它会一直执行,所以你需要通过参数来让它执行多少次
如果你没有指定,你可以通过**ctrl+c**来中断它
如果你现在ping一个服务器,发现你无法ping通,可能的情况对方把 ping给禁用了。
有些系统默认没装,如果没有则需要安装**iputils-ping**软件才能正常使用
|
参数 |
作用 |
|
|
指定发送次数(默认无限) |
|
|
超时秒数 |
# ping 4 次然后退出 测试服务器的连通性,有没有丢包
ping -c4 www.baidu.com
# 输出结果 : 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=0.244 ms 表示本机和目标主机互通
# icmp_seq:ICMP 包序号
# ttl:生存时间(跳数)
# time:响应时间(延迟)
# ping 1次,等待1s 测试服务器是否还存活
ping -c1 -w1 10.23.21.12
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)