diff --git "a/50\351\202\261\346\254\243\345\275\246/20240528\357\274\210touch\343\200\201find\343\200\201grep\344\275\277\347\224\250\357\274\211.md" "b/50\351\202\261\346\254\243\345\275\246/20240528\357\274\210touch\343\200\201find\343\200\201grep\344\275\277\347\224\250\357\274\211.md" new file mode 100644 index 0000000000000000000000000000000000000000..3c92c99293eb6e02064b7840d775712bac7c8dc5 --- /dev/null +++ "b/50\351\202\261\346\254\243\345\275\246/20240528\357\274\210touch\343\200\201find\343\200\201grep\344\275\277\347\224\250\357\274\211.md" @@ -0,0 +1,253 @@ +#### touch、find、grep使用 + +##### **touch**:主要用于创建新文件和更新文件的时间 + +1. 更新文件时间 + + ```bash + #如1.txt文件已存在,则会修改创建时间,不会修改内容 + touch 1.txt + ``` + +2. 创建多个文件 + + ```bash + #创建1到3的文件,如1.txt,2.txt,3.txt + touch {1..3}.txt + ``` + + ```bash + #创建1到6的文件,间隔为2 ,如1.txt,3.txt,5.txt + touch {1..6..2}.txt + ``` + + + +#### 查找文件和目录 + +1. ##### find命令 + + - `find` 命令主要用于查找文件和目录。它根据文件名、类型、修改时间等属性进行查找,并不会检查文件内容 + + - 语法:find 要查找的目录路径 条件(类型,名称,大小,时间) + + - eg: + + ```bash + find /path -name "filename" # 按名称查找文件包含了目录 + find /path -type d -name "dirname" # 按名称查找目录 + find /path -type f -name "*.txt" # 查找所有 .txt 文件 + find /path -type f -exec command {} \; # 查找文件并对其执行命令 + + find /path -type f -size +1M # 查找大于 1MB 的文件 + find /path -type f -mtime -7 # 查找最近7天内修改过的文件 + ``` + +2. ##### which命令 + + - `which` 命令查找可执行文件的位置 + + - 用于以下场景: + + 1. **查找命令的完整路径**:如果你想知道某个命令(如ls、cd等)在系统中的完整路径,可以使用which命令。例如,`which ls`会返回ls命令的完整路径,如`/bin/ls`。 + 2. **验证命令是否存在**:通过检查which命令的输出,你可以验证系统中是否存在某个命令。如果which命令没有输出或返回错误信息,那么说明该命令不存在。 + + - 用法: + + ```bash + which command # 查找命令的路径 + # 例子 + which ls # 查找 ls 命令的路径 + ``` + +3. ##### whereis 命令 + + - `whereis` 命令查找可执行文件、配置文件、源代码文件和手册页的位置。 + + - 用法: + + ```bash + whereis command # 查找命令的可执行文件、源代码文件和手册页 + #例子 + whereis ls # 查找 ls 命令的可执行文件、源代码文件和手册页 + ``` + +4. ##### grep 命令 + + - `grep` 命令用于在文件内容中搜索匹配的字符串。虽然它通常用于搜索文件内容,但也可以结合其他命令一起使用来查找文件 + + - 用法: + + ```bash + grep "pattern" filename # 在文件中搜索字符串 + grep -r "pattern" 查找的路径 # 递归地在目录中搜索字符串 + # 示例: + grep "error" /var/log/syslog # 在 /var/log/syslog 文件中搜索包含 "error" 的行 + grep -r "TODO" /home/user/projects # 在 /home/user/projects 目录及其子目录中搜索包含 "TODO" 的文件 + + + # 忽略大小写查找 + grep -i "error" /var/log/syslog + + # 显示不包含关键字的行 + grep -v "success" output.txt + + # 递归查找目录 + grep -r "main" /home/user/projects + + # 显示包含关键字的文件名 + grep -l "TODO" *.py + + # 计数匹配的行数 + grep -c "ERROR" error.log + + # 显示匹配行的行号 + grep -n "def" script.py + + # 仅显示匹配部分 + grep -o "pattern" file.txt + + # 显示匹配行及后面 2 行 + grep -A 2 "START" data.txt + + # 显示匹配行及前面 2 行 + grep -B 2 "END" data.txt + + # 显示匹配行及前后 2 行 + grep -C 2 "marker" document.txt + ``` + +5. ##### find 与 grep 结合使用 + + ```bash + find 查找文件的路径 -type f -name "*.txt" -exec grep "pattern" {} + # 查找包含特定字符串pattern的所有 .txt 文件 + ``` + + + +##### ---------------------------------作业------------------------------------ + +### 操作题 + +1. **查找当前目录及其子目录中所有扩展名为 `.log` 的文件**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ touch {1..3}.log + qq@iZf8zfcpducv0kkmbkbzioZ:~$ mkdir a + qq@iZf8zfcpducv0kkmbkbzioZ:~$ touch a/aa.log + qq@iZf8zfcpducv0kkmbkbzioZ:~$ find -name '*.log' + ``` + +2. **在 `/var/logs` 目录及其子目录中查找所有包含关键字 `error` 的文件,并显示匹配的行**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ mkdir -p var/logs + qq@iZf8zfcpducv0kkmbkbzioZ:~$ touch var/logs/error.txt + qq@iZf8zfcpducv0kkmbkbzioZ:~$ vim var/logs/error.txt + qq@iZf8zfcpducv0kkmbkbzioZ:~$ grep -r -n "error" var/logs/ + var/logs/error.txt:1:啦啦啦error ,啦啦啦error + ``` + +3. **在 `/home/user/docs` 目录中查找文件名包含 `report` 的所有文件**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ touch ./docs/d.report + qq@iZf8zfcpducv0kkmbkbzioZ:~$ touch ./docs/report.txt + qq@iZf8zfcpducv0kkmbkbzioZ:~$ find ./docs/ -type f -name "*report*" + ./docs/d.report + ./docs/report.txt + + ``` + +4. **查找 `/etc` 目录中最近7天内修改过的文件**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ mkdir etc + qq@iZf8zfcpducv0kkmbkbzioZ:~$ touch etc/1.txt + qq@iZf8zfcpducv0kkmbkbzioZ:~$ find etc/ -type f -mtime -7 + ``` + +5. **显示 `/usr/bin` 目录中名为 `python` 的可执行文件的路径**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ whereis python3 + python3: /usr/bin/python3 /usr/lib/python3 /etc/python3 /usr/share/python3 /usr/share/man/man1/python3.1.gz + ``` + +6. **查找系统中名为 `ls` 的命令及其手册页位置**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ whereis ls + ls: /usr/bin/ls /usr/share/man/man1/ls.1.gz + ``` + +7. **查找当前目录中包含关键字 `TODO` 的所有文件,并显示匹配的行和文件名**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ vim 1.txt + qq@iZf8zfcpducv0kkmbkbzioZ:~$ grep -r -n "TODO" ./ + ./1.txt:1:我有TODO + ./1.txt:2:TODO + ``` + +8. **在 `/home/user/projects` 目录中查找所有包含关键字 `function` 的 `.js` 文件**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ mkdir projects + qq@iZf8zfcpducv0kkmbkbzioZ:~/projects$ touch pp.js + qq@iZf8zfcpducv0kkmbkbzioZ:~/projects$ vim pp.js + qq@iZf8zfcpducv0kkmbkbzioZ:~/projects$ grep -l "function" *.js + + ``` + +9. **查找并显示当前目录及其子目录中所有空文件**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ find ~ -type f -empty + ``` + +10. **在 `/var/www` 目录中查找包含关键字 `database` 的所有文件,并只显示文件名**: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ grep -l "database" ./var/www/* + ``` + +### 综合操作题 + +**综合操作题:** + +假设你在一个名为 `/home/user/workspace` 的目录中工作。你需要完成以下任务: + +1. 查找该目录中所有扩展名为 `.conf` 的文件。 +2. 在这些 `.conf` 文件中查找包含关键字 `server` 的行。 +3. 将包含关键字 `server` 的文件名和匹配的行保存到一个名为 `server_lines.txt` 的文件中。 + +**预期命令步骤:** + +1. 查找所有扩展名为 `.conf` 的文件: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ mkdir workspace + qq@iZf8zfcpducv0kkmbkbzioZ:~/workspace$ touch a.conf b.conf c.conf + qq@iZf8zfcpducv0kkmbkbzioZ:~$ find ./workspace/ -type f -name "*.conf" + ``` + +2. 在这些 `.conf` 文件中查找包含关键字 `server` 的行: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ vim workspace/a.conf + qq@iZf8zfcpducv0kkmbkbzioZ:~$ vim workspace/c.conf + qq@iZf8zfcpducv0kkmbkbzioZ:~$ grep -n -r "server" ./workspace/ + ``` + +3. 将结果保存到 `server_lines.txt` 文件中: + + ```bash + qq@iZf8zfcpducv0kkmbkbzioZ:~$ grep -n -r "server" ./workspace/ > server_lines.txt + qq@iZf8zfcpducv0kkmbkbzioZ:~$ cat server_lines.txt + ./workspace/a.conf:1:拉拉 server + ./workspace/a.conf:3:server + ./workspace/c.conf:1:server + ./workspace/c.conf:2:server server22 + ``` +