目录与路径
目录的相关操作
切换目录
cd [相对路径或绝对路径]
显示当前目录
pwd [-P]
-P: 显示当前路径, 而非使用连接的路径
新建目录
mkdir [-mp] 目录名称
-m: 设置文件权限
-p: 递归创建目录(包含上层目录)
删除目录
rmdir [-p] 目录名称
-p: 连同上层空的目录也一起删除
但注意, 该命令只能删除空的目录
关于执行路径的变量: $PATH
当执行一个命令如ls时, 系统会按照环境变量PATH的设置去每个PATH定义的目录下查询文件名为ls的可执行文件, 如果在PATH定义的目录中含有多个文件名为ls的可执行文件, 那么先查询到的同名命令会先被执行
root@DESKTOP-LMORNNS:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/usr/lib/wsl/lib:/mnt/c/ProgramData/Oracle/Java/javapath:/mnt/c/Java/jdk1.8.0_40/bin:/mnt/c/Java/jdk1.8.0_40/jre/bin:/mnt/c/apache-maven-3.6.1/bin:/mnt/c/WINDOWS/system32:/mnt/c/WINDOWS:/mnt/c/WINDOWS/System32/Wbem:/mnt/c/WINDOWS/System32/WindowsPowerShell/v1.0/:/mnt/c/WINDOWS/System32/OpenSSH/:/mnt/c/Program Files/nodejs/:/mnt/d/soft/mysql-8.0.20-winx64/bin:/mnt/c/Program Files (x86)/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Intel/Intel(R) Management Engine Components/DAL:/mnt/c/Program Files/Git/cmd:/mnt/c/Program Files/Docker/Docker/resources/bin:/mnt/c/ProgramData/DockerDesktop/version-bin:/mnt/c/Users/Administrator/AppData/Local/Microsoft/WindowsApps:/mnt/c/Users/Administrator/AppData/Local/Programs/Microsoft VS Code/bin:/mnt/d/DEVELOP/node_global:/mnt/c/Users/Administrator/AppData/Local/Programs/oh-my-posh/bin:/snap/bin
PATH变量的内容由一堆目录组成, 每个目录中间以:隔开, 目录有顺序之分
- 添加PATH
文件与目录管理
查看文件与目录: ls
ls [-aAdfFhilnrRSt] 目录名称
ls [--color={never,auto,always}] 目录名称
ls [--full-time] 目录名称
-a: 列出全部文件, 包括隐藏文件
-A: 列出全部文件, 包括隐藏文件, 但不包括. 与 ..
-d: 仅列出目录本身, 而不是列出目录内的文件数据
-f: 直接列出结果, 而不进行排序(默认会以文件名排序)
-F: 根据文件, 目录等信息给予附加数据结构,
如:*代表可执行文件; /代表目录; =代表socket文件; l代表FIFO文件
-h: 将文件容量以人类易读的方式列出来
-i: 列出inode号码
-l: 列出长数据串, 包含文件的属性与权限等数据
-n: 列出UID与GID, 而非用户与用户组的名称
-r: 将排序结果反向输出, 如原本文件名由小到大, 反向则为由大到小
-R: 连通及目录内容一起列出来, 等于该目录下所有文件都会显示出来
-S: 以文件容量大小排序, 而不是用文件名排序
-t: 以时间排序, 而不是用文件名
--color=never: 不要依据文件特性给予颜色显示
--color=always: 显示颜色
--color=auto: 让系统自行依据设置来判断是否给予颜色
--full-time: 以完成时间格式, 包含年, 月, 日, 时, 分输出
--time={atime, ctime}: 输出访问时间或改变权限属性时间(ctime)而非内容更改时间
复制, 删除与移动: cp, rm , mv
复制文件或目录
cp [-adfilprsu] 源文件 目标文件
cp [options] source1 source2.... directory
-a: 相当于-pdr
-d: 若源文件为连接文件的属性(link file), 则复制连接文件属性而非文件本身
-f: 强制, 若目标文件已经存在且无法开启, 则删除后再尝试一次
-i: 若目标文件已经存在, 在覆盖时会先询问操作的进行
-l: 进行硬连接的链接文件创建, 而非复制文件本身
-p: 连同文件的属性一起复制过去, 而非使用默认属性(备份常用)
-r: 递归持续复制
-s: 复制称为符号连接文件, 即快捷方式文件
-u: 若目标比源旧才更新目标
最后注意, 如果源文件有两个以上, 那最后的目的文件一定要为目录才行
- 在默认条件中, cp的源文件与目的文件中的权限是不同的, 目的文件的所有者通常会是命令操作者本身, 因此在备份时, 要注意特殊权限文件, 必须加上-a或-p等完整复制文件权限的参数才行, 以及将文件复制给到其他用户, 也需注意文件的权限
- 复制文件创建连接例子如下
- 上例子补充, 默认情况cp复制的是源文件, 而非连接的属性, 要复制连接文件的属性, 需要加-d
移除文件或目录
rm [-fir] 文件或目录
-f: 强制, 忽略不存在的文件
-i: 互动模式
-r: 递归删除
移动文件与目录, 或更名
mv [-fiu] 源 目标
mv [-options] source1 source2 .... directory
-f: 强制, 若目标文件存在, 会直接覆盖
-i: 交互模式
-u: 若目标文件已经存在, 且source比较新, 才会更新
取得路径的文件名与目录名称
文件内容查阅
cat: 由第一行开始显示文件内容
tac: 从最后一行开始显示, tac是tac的倒写形式
nl: 显示的时候, 顺便输出行号
more: 一页一页的显示文件内容
less: 与more类似, 但是比more更好的是, 可以往前翻页
head: 只看头几行
tail: 只看结尾几行
od: 以二进制的方式读取文件内容
直接查看文件内容
- cat ```shell cat [-AbEnTv]
-A: 相当于-vET的整合参数, 可列出一些特殊字符, 而不是空白而已 -b: 列出行号, 仅针对非空白行做行号显示, 空白行不标行号 -E: 将结尾的断行字符$显示出来 -n: 打印出行号, 连同空白行也会有行号 -T: 将[Tab]按键以^I显示出来 -v: 列出一些看不出来的特殊字符
- tac反向列示: 先展示最后一行
- nl添加行号打印: 可以将行号做较多的显示设计, 包括位数与是否自动补0等功能
```shell
nl [-bnw] 文件
-b: 指定行号指定的方式, -b a 表示不论空行同样列出行号, -b t 空行不列出行号, 也是默认值
-n: 指定列出行号的表示方法, 有ln, rn, rz三种选项
-w: 行号字段占用的位数, 默认6位
可翻页查看
- more(一页一页翻动)
- less(一页一页翻动)
数据选取
- head: 取出前几行 ```shell head [-n number] 文件
-n: 后接数字, 代表显示几行, 默认10行, 也可以接负数 示例: head -n -100 /etc/man.config 假设man.config有141行, 则会列出前41行, 后100行不会打印
- tail(取出后面几行)
```shell
tail [-n number] 文件
-n: 后接数字, 表示显示几行
-f: 表示持续检测
非纯文本文件: od
由于执行文件通常是二进制文件, 使用上述命令会乱码, 可以利用od来读取
修改文件时间或创建新文件: touch
touch [-acdmt] 文件
-a: 仅修改访问时间
-c: 仅修改文件的时间, 若该文件不存在则不创建新文件
-d: 后面可以接欲修改的日期而不用目前的时间, 也可以使用--date="日期或时间"
-m: 仅修改mtime
-t: 后面可以接欲修改的时间而不用当前的时间, 格式为[YYYYMMDDhhmm]
常用于创建一个空文件或者将文件日期修改为当前日期(mtime和atime)
文件与目录的默认权限与隐藏权限
文件默认权限: umask
文件隐藏属性chattr, lsattr
文件特殊权限: SUID, SGID, SBIT
查看文件类型: file
命令与文件的查询
脚本文件名的查询
- which(寻找执行文件) ```shell which [-a] command
-a: 将所有由PATH目录中可以找到的命令均列出, 而不只是第一个被找到的命令名称 注意: which 是根据用户设置的环境变量PATH内的目录去查找可执行文件的, 不是root用户可能没有找不到
<a name="vdQ6x"></a>
### 文件名的查找
通常先使用whereis 或locate 来检查, 还找不到才使用find<br />find会查找硬盘比较慢, whereis和locate会查询数据库, linux会将系统内的所有文件都记录在一个数据库文件中
- whereis(寻找特定文件)
```shell
whereis [-bmsu] 文件或目录名
-b: 只找二进制格式的文件
-m: 只找在说明文件manual路径下的文件
-s: 只找source源文件
-u: 会查找不在上述3个选项当中的其他特殊文件
示例:
root@DESKTOP-LMORNNS:/etc# whereis -b java
java: /usr/share/java /mnt/c/ProgramData/Oracle/Java/javapath/java.exe /mnt/c/Java/jdk1.8.0_40/bin/java.exe /mnt/c/Java/jdk1.8.0_40/jre/bin/java.dll /mnt/c/Java/jdk1.8.0_40/jre/bin/java.exe
- locate: 依据/var/lib/mlocate内的数据库记载, 找出用户输入的关键字文件名, 由于数据库一天更新一次, 可以手动执行 updatedb 更新 ```shell locate [-ir] keyword
-i: 忽略大小写的差异 -r: 后面可接正则表达式的显示方式
- find
```shell
find [PATH] [option] [action]