关于路径

相对路径与绝对路径

  • 绝对路径:绝对路径是从根目录(/)开始指定文件或目录的路径。
  • 相对路径:相对路径则是相对于当前工作目录来指定文件或目录的路径。

Linux文件路径的变量:$PATH

在Linux系统中,$PATH 是一个重要的环境变量,用来指定系统在哪些目录中查找可执行文件

当用户在终端中输入一个命令时,系统会在列出的路径中逐一查找是否有与该命令同名的可执行文件,如果找到则执行该可执行文件

可以通过在终端中输入 echo $PATH 命令来查看当前配置的 $PATH 环境变量的值

[root@chenshiren ~]# echo $PATH
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
  • $PATH 环境变量中的路径是用冒号 : 分隔的,每个路径代表一个存储可执行程序的目录
  • 当用户输入一个命令时,系统会按照 $PATH 中列出的顺序逐个查找对应的可执行文件,直到找到为止。
  • 用户可以通过修改 $PATH 环境变量来添加新的目录,以便系统能够搜索更多的可执行文件

文件与目录管理

文件与目录查看

ls:命令用于查看文件和目录列表

ls [选项]   [文件]
选项 作用
-a 列出所有文件,包括以.开头的隐藏文件
-A 类似于-a,但不包括...
-d 显示目录自身的信息,而不是显示目录中的内容
-f 直接列出结果,而不进行排序(ls默认会以文件名排序)
-F 在文件名后面加上一个斜杠/,表示该文件是一个目录;
加上*表示可执行文件;
加上=代表socket文件
加上|代表FIFO文件
-h 以人类可读的格式显示文件大小
-i 显示文件的 inode 号码,即唯一标识文件系统上文件或目录的索引节点号
-l 使用长格式显示,包括文件类型、权限、链接数、所有者、组、大小、修改日期
-n 类似于-l,但以数字形式显示用户名和组
-r 以相反的顺序显示文件和目录
-R 递归地列出所有子目录及其内容
-S 按文件大小排序
-t 按照修改时间排序,最新修改的文件会显示在前面
–time 查看文件修改时间:atime访问时间、ctime状态时间(权限、重命名、改大小)、
ls -l 默认查看的是mtime修改时间
# 将家目录下所有文件列出来(含属性和隐藏文件)
[root@kylin-csq-v10-sp3 ~]# ls -al ~
总用量 48
drwx------   5 root root  256  97 17:02 .
dr-xr-xr-x. 19 root root  265  97 10:59 ..
-rwxr-xr-x   1 root root    0  97 15:41 a
-rw-r--r--   1 root root    0  97 17:02 abc
-rw-------   1 root root 2671  97 15:37 anaconda-ks.cfg
drwx------   3 root root   17  95 16:02 .ansible
-rw-------   1 root root  335  96 21:22 .bash_history
-rw-r--r--   1 root root   18  313  2020 .bash_logout
-rw-r--r--   1 root root  176  313  2020 .bash_profile
-rw-r--r--   1 root root  176  313  2020 .bashrc
-rw-r--r--   1 root root  100  313  2020 .cshrc
drwxr-xr-x   2 root root    6  96 11:33 csq
drwx------   3 root root  108  97 15:18 .gnupg
-rw-r--r--   1 root root 3050  831 15:30 initial-setup-ks.cfg
-rw-------   1 root root   20  97 15:19 .lesshst
-rw-r--r--   1 root root  129  313  2020 .tcshrc
-rw-------   1 root root 9817  97 15:49 .viminfo

# 查看指定目录的属性[root@kylin-csq-v10-sp3 ~]# ls -dl /etc/
drwxr-xr-x 117 root root 8192  97 16:28 /etc/

[root@chenshiren ~]# ls -alF --color=never ~
总用量 48
dr-xr-x---.  7 root root 4096  226 21:15 ./
dr-xr-xr-x. 18 root root  235  224 15:56 ../
-rwx------.  1 root root 1437  224 16:00 anaconda-ks.cfg*
-rw-------.  1 root root 2837  226 17:15 .bash_history
-rw-r--r--.  1 root root   18  811  2021 .bash_logout
-rw-r--r--.  1 root root  141  811  2021 .bash_profile
-rw-r--r--.  1 root root  429  811  2021 .bashrc
drwx------.  7 root root  103  224 16:07 .cache/
drwx------. 10 root root 4096  226 15:01 .config/
-rw-r--r--.  1 root root  100  811  2021 .cshrc
drwxr-xr-x.  2 zhw  root   21  225 20:19 csq/
-rw-------.  1 root root   20  226 21:15 .lesshst
drwx------.  3 root root   19  224 16:07 .local/
drwx------.  2 root root    6  224 15:57 .ssh/
-rw-r--r--.  1 root root  129  811  2021 .tcshrc
-rw-------.  1 root root 6257  226 14:59 .viminfo

# 将家目录下所有文件列出来(含属性和隐藏文件) 显示完整的文件修改时间
[root@chenshiren ~]# ls -al --full-time ~
总用量 48
dr-xr-x---.  7 root root 4096 2024-02-26 21:15:35.621167119 +0800 .
dr-xr-xr-x. 18 root root  235 2024-02-24 15:56:21.809820460 +0800 ..
-rwx------.  1 root root 1437 2024-02-24 16:00:58.813336337 +0800 anaconda-ks.cfg
-rw-------.  1 root root 2837 2024-02-26 17:15:31.653745941 +0800 .bash_history
-rw-r--r--.  1 root root   18 2021-08-11 00:15:38.000000000 +0800 .bash_logout
-rw-r--r--.  1 root root  141 2021-08-11 00:15:38.000000000 +0800 .bash_profile
-rw-r--r--.  1 root root  429 2021-08-11 00:15:38.000000000 +0800 .bashrc
drwx------.  7 root root  103 2024-02-24 16:07:11.180387538 +0800 .cache
drwx------. 10 root root 4096 2024-02-26 15:01:43.008238320 +0800 .config
-rw-r--r--.  1 root root  100 2021-08-11 00:15:38.000000000 +0800 .cshrc
drwxr-xr-x.  2 zhw  root   21 2024-02-25 20:19:42.616149114 +0800 csq
-rw-------.  1 root root   20 2024-02-26 21:15:35.621167119 +0800 .lesshst
drwx------.  3 root root   19 2024-02-24 16:07:09.573116561 +0800 .local
drwx------.  2 root root    6 2024-02-24 15:57:10.683820671 +0800 .ssh
-rw-r--r--.  1 root root  129 2021-08-11 00:15:38.000000000 +0800 .tcshrc
-rw-------.  1 root root 6257 2024-02-26 14:59:18.498857325 +0800 .viminfo

stat:显示文件或文件系统详细状态信息

其功能远超 ls -l(仅显示部分元数据),可输出文件的 inode 信息、权限、所有者、大小、时间戳(访问 / 修改 / 状态变更时间)等关键数据

stat [选项] [文件/目录/符号链接]
选项 功能说明
-f 显示文件系统的状态信息(而非文件本身),如 inode 总数、空闲块数、块大小等
-t 简洁输出(一行显示所有信息),适合脚本中提取数据(避免多行解析)
-c 自定义输出格式(按指定格式符提取特定字段),支持多个格式符组合

关键格式符(配合 -c 选项使用)

格式符 含义 示例输出
%n 文件名 / 目录名 test.txt
%s 文件大小(字节) 1024(表示 1KB)
%a 访问权限(八进制,如 644、755) 644
%A 访问权限(人类可读格式,如 -rw-r--r-- -rw-r--r--
%u 文件所有者 UID(用户 ID) 1000(普通用户默认 UID)
%g 文件所属组 GID(组 ID) 1000
%U 文件所有者用户名(对应 UID) user
%G 文件所属组名(对应 GID) user
%i 文件 inode 号 123456
%h 硬链接数 1(普通文件默认硬链接数)
%x 最后访问时间(atime,人类可读) 2024-05-20 14:30:00.123456789 +0800
%y 最后修改时间(mtime,人类可读) 2024-05-20 14:25:00.123456789 +0800
%z 最后状态变更时间(ctime,人类可读) 2024-05-20 14:25:00.123456789 +0800
%w 文件创建时间(birthtime,需文件系统支持) 2024-05-20 14:20:00.123456789 +0800
#1.查看文件基本信息
[root@kylin-v10-sp3-csq ~]# stat /etc/passwd
  文件:“/etc/passwd”
  大小:1948      	块:8          IO 块:4096   普通文件
设备:fd00h/64768d	Inode:33741538    硬链接:1
权限:(0644/-rw-r--r--)  Uid:(    0/    root)   Gid:(    0/    root)
最近访问:2025-09-13 11:00:01.179193457 +0800
最近更改:2025-09-11 10:57:38.676629571 +0800
最近改动:2025-09-11 10:57:38.677629626 +0800
创建时间:-

#2.查看文件系统信息
[root@kylin-v10-sp3-csq ~]# stat -f /etc/passwd
  文件:"/etc/passwd"
    ID:fd0000000000 文件名长度:255     类型:xfs
块大小:4096       基本块大小:4096
    块:总计:12303494   空闲:10541026   可用:10541026
Inodes: 总计:24619008   空闲:24487714

#3.自定义输出(提取文件名、大小、权限)
[root@kylin-v10-sp3-csq ~]# stat -c "%n %s %a" /etc/passwd
/etc/passwd 1948 644

目录的相关操作

特殊的目录

.  :代表当前目录
.. :代表上一级目录
-  :代表前一个工作目录
~  :代表目前使用者身份所在的家目录
~account :代表account这个使用者的家目录

cd:切换目录

cd是Change Directory的缩写

通过使用cd命令,用户可以快速切换到不同的目录

[root@chenshiren ~]# cd [绝对路径或相对路径]

[root@chenshiren ~]# cd ~zhw  # 代表进入zhw的家目录
[root@chenshiren zhw]# cd ~   # 表示回到自己的家目录
[root@chenshiren ~]# cd       # 没有加任何路径也是回到自己的家目录
[root@chenshiren ~]# cd ..    # 表示去到上一层目录
[root@chenshiren /]# cd -     # 表示回到上一次cd的目录
/root

[root@chenshiren ~]# cd /var/spool/mail/  # 去到/var/spool/mail/目录下这个是绝对路径的写法
[root@chenshiren mail]# cd ../at          # 去到/var/spool/at   目录下这个是相对路径的写法
[root@chenshiren at]# 

pwd:显示目前所在目录

pwd是Print Working Directory 的缩写

pwd 命令用于显示当前工作目录的完整路径

[root@chenshiren ~]# pwd
/root
# 选项
-L:打印 $PWD 变量的值,如果它包含了当前的工作目录
-P:打印当前的物理路径,不带有任何的符号链接

mkdir:创建目录

mkdir是Make Directory的缩写

mkdir命令用于创建新目录(文件夹)

[root@chenshiren ~]# mkdir [-mp] 名称
选项:
-m:设置文件的权限,直接设置,不使用默认权限
-p:帮助你直接将所需要目录(包含上层目录)递归创建

# 示例:
# 在/tmp下面创建一个目录
[root@chenshiren ~]# cd /tmp/
[root@chenshiren tmp]# mkdir test

# 在所创建的test里面创建test1,在test1里面创建test2
[root@chenshiren tmp]# mkdir -p test/test1/test2
[root@chenshiren tmp]# cd test/test1/test2/
[root@chenshiren test2]# pwd
/tmp/test/test1/test2

# 在/tmp下面创建目录,设置权限为 rwxr-xr-x
[root@chenshiren tmp]# mkdir -m 755   abc 
[root@chenshiren tmp]# ls -ld abc
drwxr-xr-x. 2 root root 6  226 22:29 abc

rmdir:删除空目录

rmdir是remove directory缩写

rmdir 命令用于删除空目录的

[root@chenshiren ~]# rmdir [-vp] 名称
选项:
-v:出每个被处理目录的详情
-p:删除指定目录及其各个上级文件夹

# 示例:
# 删除之前用mkdir创建的test/test1/test2空目录
[root@chenshiren tmp]# rmdir -vp test/test1/test2/
rmdir: 正在删除目录,'test/test1/test2/'
rmdir: 正在删除目录,'test/test1'
rmdir: 正在删除目录,'test'

复制、删除、移动与创建

cp:复制文件或目录

cp是copy的缩写

cp 命令在系统中用于复制文件或目录

用法:

[root@chenshiren ~]# cp [-adfilprsu] 源文件...  目标文件
选项 作用
-a 相当于使用-dpr选项的组合,保留所有文件属性,递归地复制目录,并保持链接关系。(备份常用)
-l 创建硬链接而不复制文件
-r 递归复制
-f 覆盖目标文件而不提示用户确认
-p 保留源文件的访问时间和修改时间以及权限模式
-s 复制成为符号链接文件,就是"快捷方式"
-u 仅在目标文件不存在或比源文件旧的情况下才复制文件
-d 复制时保留链接(符号链接)
-i 在复制前提示用户,如果目标文件已存在则询问是否覆盖
# 示例
# 将家目录的anaconda-ks.cfg复制到/tmp目录下
[root@chenshiren ~]# cp -i anaconda-ks.cfg /tmp  # 重复两次
cp:是否覆盖'/tmp/anaconda-ks.cfg'? y

# 将家目录的anaconda-ks.cfg权限修改为777,将文件复制到/tmp下保留所有文件属性
[root@chenshiren ~]# cp -af anaconda-ks.cfg /tmp
cp:是否覆盖'/tmp/anaconda-ks.cfg'? y 
[root@chenshiren ~]# ls -ld /tmp/anaconda-ks.cfg 
-rwxrwxrwx. 1 root root 1437  224 16:00 /tmp/anaconda-ks.cfg

# 登陆zhw账户,复制/tmp下的anaconda-ks.cfg文件
[root@chenshiren ~]# chmod 600 /tmp/anaconda-ks.cfg 
[zhw@chenshiren ~]$ cp -f /tmp/anaconda-ks.cfg .
cp: 无法打开'/tmp/anaconda-ks.cfg' 读取数据: 权限不够
[root@chenshiren ~]# chmod 604 /tmp/anaconda-ks.cfg 
[zhw@chenshiren ~]$ cp -f /tmp/anaconda-ks.cfg .
[zhw@chenshiren ~]$ ls -l anaconda-ks.cfg 
-rw----r--. 1 zhw zhw 1437  226 23:56 anaconda-ks.cfg

如果我们要复制其他人的数据,该文件你必须要有read的权限才行

默认情况下,复制操作会将目标文件的拥有者设置为执行cp操作的用户,这样确保复制过来的文件最终归属于当前用户

另外,如果您想要保留源文件的权限和属性,您可以使用-p选项,这样在复制文件时源文件的权限、拥有者和用户组会被保留到目标文件中,而不会被更改

# 示例:
# 将/etc/ 目录下的所有文件复制到/tmp下面
[root@chenshiren ~]# cp -rf /etc/ /tmp/

# 将/etc/ 目录备份到/tmp下面
[root@chenshiren ~]# cp -a /etc/ /tmp/

# 复制root目录下的anaconda-ks.cfg 建立硬链接和软链接
[root@chenshiren ~]# cp -l anaconda-ks.cfg anaconda-ks-hardlink.cfg    
[root@chenshiren ~]# cp -s anaconda-ks.cfg anaconda-ks-softlink.cfg
[root@chenshiren ~]# ls -l
总用量 8
-rw----r--. 2 root root 1437  226 23:58 anaconda-ks.cfg
-rw----r--. 2 root root 1437  226 23:58 anaconda-ks-hardlink.cfg
lrwxrwxrwx. 1 root root   15  227 17:40 anaconda-ks-softlink.cfg -> anaconda-ks.cfg

# 将.bashrc文件复制到/tmp下,使用-u参数,看看将旧的.bashrc能不能复制过来
[root@chenshiren ~]# ls -l .bashrc --full-time
-rw-r--r--. 1 root root 429 2021-08-11 00:15:38.000000000 +0800 .bashrc
[root@chenshiren ~]# cp -f .bashrc  /tmp/
[root@chenshiren ~]# ls -l /tmp/.bashrc --full-time
-rw-r--r--. 1 root root 429 2024-02-27 17:45:37.376066369 +0800 /tmp/.bashrc
[root@chenshiren ~]# cp -uf .bashrc /tmp/
[root@chenshiren ~]# ls -l /tmp/.bashrc --full-time
-rw-r--r--. 1 root root 429 2024-02-27 17:45:37.376066369 +0800 /tmp/.bashrc

# 将/etc 所有文件 和/opt 所有文件复制到/tmp目录下
[root@chenshiren ~]# cp -rf /etc/ /opt/  /tmp/

rm:删除文件或目录

rm是remove的缩写

rm命令是用于删除文件或目录

特别注意,删除后的文件无法恢复,请谨慎使用

[root@chenshiren ~]# rm [-fir] 文件或目录
选项:
-f:强制删除文件或目录,不进行任何提示
-i:交互式删除,删除前会进行提示确认
-r:递归删除目录及其内容

# 示例:
# 将刚刚cp示例中复制在/tmp目录下的/etc/ /opt/ 目录删掉
[root@chenshiren ~]# rm -rf /tmp/etc/ /tmp/opt/

# 将/tmp 目录下的abc开头的目录删掉
[root@chenshiren ~]# mkdir /tmp/abc1 /tmp/abc2 /tmp/abc3
[root@chenshiren ~]# ls /tmp/
abc1
abc2
abc3
...
[root@chenshiren ~]# rm -rf /tmp/abc*

# 当我们使用-r参数删除目录 还是会出现提示,这是因为alias的问题,只要在命令行前面加上\就会忽略alias
[root@chenshiren ~]# cp -rf /etc/ /tmp/
[root@chenshiren ~]# rm -r /tmp/etc/
rm:是否进入目录'/tmp/etc/'? y
rm:是否进入目录'/tmp/etc/dnf'? ^C
[root@chenshiren ~]# \rm -r /tmp/etc/

# 删除带有特殊字符的文件
[root@chenshiren ~]# echo "aaa" > -aa-a
[root@chenshiren ~]# ls
-aa-a  
[root@chenshiren ~]# rm -rf -aa-a
rm: 不适用的选项 -- a
尝试使用"rm ./-aa-a"删除文件 '-aa-a'。
请尝试执行 "rm --help" 来获取更多信息。
[root@chenshiren ~]# rm -rf ./-aa-a 

mv:移动文件与目录,或重命名

mv是move的缩写

mv命令用于移动文件或目录,同时也可以用来重命名文件或目录

[root@chenshiren ~]# mv [-fiu] 源文件...  目标文件
选项:
-f:即使目标文件存在时,不提示直接覆盖
-i:若目标文件已经存在时,会进行提示确认是否覆盖
-u:只有当源文件比目标文件新,或者目标文件不存在时,才会移动文件

# 示例:
# 复制一文件,建立一个目录,将文件移动到目录
[root@chenshiren ~]# cp -f .bashrc  bashrc
[root@chenshiren ~]# mkdir dir
[root@chenshiren ~]# mv bashrc dir/
[root@chenshiren ~]# ls dir/
bashrc

# 将刚刚创建的目录改名为 dir2
[root@chenshiren ~]# mv dir/ dir2/

# 在复制两个文件并移动到 dir2/ 目录下
[root@chenshiren ~]# cp .bashrc bashrc2
[root@chenshiren ~]# cp .bashrc bashrc3
[root@chenshiren ~]# mv bashrc2 bashrc3 dir2/
[root@chenshiren ~]# ls dir2/
bashrc  bashrc2  bashrc3
[root@chenshiren ~]# rm -rf dir2/

touch:修改时间或创建新文件

  • 修改时间(modification time ,mtime)

    当文件的【内容数据】变更时,就会更新这个时间,内容数据指的是文件的内容,而不是文件权限属性

  • 状态时间(status time,ctime)

    当文件的【状态】改变时,后就会更新这个时间,举例:就是文件属性权限更改了就会更新这个时间

  • 读取时间(access time,atime)

    当【该文件内容被读取】时,就会更新这个读取时间,举例:使用cat去读取/etc/man_db.conf,就会更新该文件的atime

纸上得来终觉浅,绝知此事要躬行

查看/etc/man_db.conf文件的修改时间,状态时间,读取时间

[root@chenshiren ~]# date; ls -l /etc/man_db.conf  ;ls -l --time=atime /etc/man_db.conf ; ls -l --time=ctime /etc/man_db.conf 
2024年 02月 27日 星期二 18:33:06 CST  # 目前时间
-rw-r--r--. 1 root root 5235  921  2022 /etc/man_db.conf # 在什么时间段建立的该内容
-rw-r--r--. 1 root root 5235  227 18:26 /etc/man_db.conf # 在什么时间段读取过该内容
-rw-r--r--. 1 root root 5235  224 15:58 /etc/man_db.conf # 在什么时间段更新过状态

# ls -l /etc/man_db.conf显示的是该文件的mtime,也就是文件上一次修改的时间

在某些情况下,系统时间出现异常的情况,可能导致文件的时间戳看起来“来自未来”

比如:

  • 时区设置错误:如将系统时区设置为不正确的时区会导致时间偏差

  • 硬件时钟问题:BIOS 中的实时时钟出现问题,会导致系统在重启后时间不准确或跑到未来时间

  • 网络时间同步问题:如果系统依赖网络时间服务器同步时间,网络连接问题也可能导致时间不准确

[root@chenshiren ~]# touch [-acdmt] 文件...
选项
-a:仅更新文件的访问时间(atime)
-c:如果指定的文件不存在,则不创建新文件,也不报错
-d:后面可以自定义修改时而不用目前的时间,也可以使用--date="日期或时间"
-m:仅更新文件的修改时间(mtime)
-t:后面可以自定义修改时而不用目前的时间,格式为[YYYYMMDDhhmmm]

# 示例
# 创建一个文件观察创建时间
[root@chenshiren ~]# touch csq.txt
[root@chenshiren ~]# ls -l csq.txt 
-rw-r--r--. 1 root root 0  227 19:30 csq.txt

# 修改csq.txt文件,将日期调整为两天前
[root@chenshiren ~]# touch -d "2 day ago" csq.txt      
[root@chenshiren ~]# date; ls -l csq.txt ;ls -l --time=atime csq.txt  ;ls -l --time=ctime csq.txt 
2024年 02月 27日 星期二 19:37:52 CST
-rw-r--r--. 1 root root 0  225 19:36 csq.txt
-rw-r--r--. 1 root root 0  225 19:36 csq.txt
-rw-r--r--. 1 root root 0  227 19:36 csq.txt

# 修改csq.txt文件,将日期改为2018/2/1/18:00
[root@chenshiren ~]# touch -t 201802011800 csq.txt     
[root@chenshiren ~]# ls -l --full-time csq.txt    
-rw-r--r--. 1 root root 0 2018-02-01 18:00:00.000000000 +0800 csq.txt
[root@chenshiren ~]#  date; ls -l csq.txt ;ls -l --time=atime csq.txt  ;ls -l --time=ctime csq.txt          2024年 02月 27日 星期二 19:44:34 CST
-rw-r--r--. 1 root root 0  21  2018 csq.txt
-rw-r--r--. 1 root root 0  21  2018 csq.txt
-rw-r--r--. 1 root root 0  227 19:43 csq.txt

# 修改csq.txt文件权限,查看ctime是否改变
[root@chenshiren ~]# chown zhw:zhw csq.txt 
[root@chenshiren ~]#  date; ls -l csq.txt ;ls -l --time=atime csq.txt  ;ls -l --time=ctime csq.txt 
2024年 02月 27日 星期二 19:48:22 CST
-rw-r--r--. 1 zhw zhw 0  21  2018 csq.txt
-rw-r--r--. 1 zhw zhw 0  21  2018 csq.txt
-rw-r--r--. 1 zhw zhw 0  227 19:48 csq.txt

获取路径的文件名与目录名称

获取文件名:basename

[root@chenshiren ~]# basename /etc/NetworkManager/system-connections/ens160.nmconnection 
ens160.nmconnection

获取路径名:dirname

[root@chenshiren ~]# dirname /etc/NetworkManager/system-connections/ens160.nmconnection 
/etc/NetworkManager/system-connections

文件内容查看

直接查看:cat、tac、nl

cat:由第一行开始显示文件内容

cat是Concatenate的缩写

[root@chenshiren ~]# cat [-AbEnTv] [文件]...
-A:显示所有字符,包括特殊字符,相当于-vET
-b:对非空输出行编号,空输出行不编号
-E:在每行末尾显示美元符号($)
-n:对输出的每一行编号
-T:将制表符[Tab]将其替换为^I
-v:列出一些看不出来的特殊字符

# 示例
# 查看/etc/issue 的这个文件内容
[root@chenshiren ~]# cat /etc/issue
\S
Kernel \r on an \m

# 查看/etc/issue 有几行
[root@chenshiren ~]# cat -n /etc/issue
     1  \S
     2  Kernel \r on an \m
     3
# 不显示空行看有几行
[root@chenshiren ~]# cat -b /etc/issue
     1  \S
     2  Kernel \r on an \m
# 显示/etc/man_db.conf 的完整内容
[root@chenshiren ~]# cat -A /etc/man_db.conf 
...
MANPATH_MAP^I/bin^I^I^I/usr/share/man$   # tab由^I表示  换行由$表示
MANPATH_MAP^I/usr/bin^I^I/usr/share/man$
MANPATH_MAP^I/sbin^I^I^I/usr/share/man$
MANPATH_MAP^I/usr/sbin^I^I/usr/share/man$
MANPATH_MAP^I/usr/local/bin^I^I/usr/local/man$
MANPATH_MAP^I/usr/local/bin^I^I/usr/local/share/man$
MANPATH_MAP^I/usr/local/sbin^I^I/usr/local/man$
MANPATH_MAP^I/usr/local/sbin^I^I/usr/local/share/man$
MANPATH_MAP^I/usr/X11R6/bin^I^I/usr/X11R6/man$
MANPATH_MAP^I/usr/bin/X11^I^I/usr/X11R6/man$
MANPATH_MAP^I/usr/games^I^I/usr/share/man$
...

tac:反向显示

cat命令不同的是,tac会从最后一行开始显示内容,逐行向前显示,直到第一行。

[root@chenshiren ~]# tac /etc/issue

Kernel \r on an \m
\S

nl:添加行号输出内容

nl命令用于在文本文件中添加行号,并将带有行号的文本输出到标准输出

[root@chenshiren ~]# nl [-bnw] 文件
选项:
-b:指定行号的方式,有两种 -b a:表示不论是否空行都列出行号 -b t:有空行则不列出行号
-n:列出行号的表示方法,有三种 -n ln:行号在屏幕的最左方显示 -n rn:行号在自己栏位最右方显示,不加0 -n rz:行号在自己栏位最右方显示,加0
-w:行号栏位占用的字符

# 用nl列出/etc/issue的内容
[root@chenshiren ~]# nl /etc/issue
     1  \S
     2  Kernel \r on an \m

# 列出/etc/issue的内容空白行也加上行号
[root@chenshiren ~]# nl -b a /etc/issue
     1  \S
     2  Kernel \r on an \m
     3
# 列出/etc/issue的内容空白行不列出行号
[root@chenshiren ~]# nl -b t /etc/issue
     1  \S
     2  Kernel \r on an \m

# 列出/etc/issue的内容 行号前面自动补零
[root@chenshiren ~]# nl -n rz /etc/issue
000001  \S
000002  Kernel \r on an \m
       
# 列出/etc/issue内容 前面行号占用2个字符
[root@chenshiren ~]# nl -b a -n rz -w 2 /etc/issue
01      \S
02      Kernel \r on an \m
03

翻页查看:more、less

more:一页一页翻动

[root@chenshiren ~]# more /etc/man_db.conf 

more按键说明

按键 说明
空格键 显示下一页内容
Enter 显示下一行内容
/字符串 向后搜索指定字符串,按下n键可以继续向后查找下一个匹配的字符串
:f 显示当前文件名和行号
q 退出more命令
b或ctrl +b 回滚一屏,显示前一屏内容

less:一页一页翻动

[root@chenshiren ~]# less /etc/man_db.conf 

less按键说明

按键 说明
空格键 向下翻页一页
[pagedown] 向下翻页一页
[pageup] 向上翻页一页
/字符串 向下搜索指定字符串
?字符串 向上搜索指定字符串
n 查找下一个匹配的字符串
N 查找上一个匹配的字符串
g 移动到文本开头
G 移动到文本末尾
q 退出less命令

数据截取:head、tail

head:取出前面几行

[root@chenshiren ~]# head [-n number] [文件]
选项:
-n:指定要显示的行数(-10表示不包括文件后10行)

# 示例
# 显示man_db.conf前十行
[root@chenshiren ~]# head -n 10 /etc/man_db.conf 

tail:取出后面几行

[root@chenshiren ~]# tail [-n number] [文件]
选项
-n:指定要显示的行数
-f:续显示文件新增的内容,适用于需要实时查看文件变化的情况(按下ctrl+c结束)

# 示例
# 显示man_db.conf后十行
[root@chenshiren ~]# tail -n 10 /etc/man_db.conf

# 持续检测 /var/log/messages内容
[root@chenshiren ~]# tail -f /var/log/messages

非纯文本文件:od

od命令通常用于查看二进制文件或非文本文件的内容

[root@chenshiren ~]# od [-t TYPE] [文件]
选项:
-t:后面可以接各种【类型】的试过一次关于,例如:
    a      :利用默认的字符集来输出
    c      :以ASCII字符的形式输出
    d[size]:显示有符号十进制整数
    f[size]:显示浮点数
    o[size]:显示有符号的八进制整数
    x[size]:显示有符号的十六进制整数

命令与文件的查找

脚本文件的查找:which

which命令用于在系统的路径中查找指定命令的位置。当您在终端中执行which <command>时,系统会搜索环境变量PATH中列出的目录,找到并显示第一个匹配的命令的完整路径。

[root@chenshiren ~]# which [-a] command
选项:
-a:显示所有匹配的命令的路径,而不仅仅是第一个匹配的命令路径

# 示例
# 找ifconfig命令的具体位置,如有多个一起列出来
[root@chenshiren ~]# which -a ifconfig
/usr/sbin/ifconfig
# 找history命令的具体位置
ifconfig: /usr/sbin/ifconfig /usr/share/man/man8/ifconfig.8.gz
[root@chenshiren ~]# which history
/usr/bin/which: no history in (/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
# 找不到,是因为history是bash的内置命令,which默认在系统的路径中查找指定命令的位置

文件的查找

whereis

whereis命令是用于查找特定命令的可执行文件、源代码文件和帮助文档文件的位置。。它可以帮助用户找到有关特定命令的更多信息,包括其可执行文件、man文档和源代码文件。

[root@chenshiren ~]# whereis [-bmsu] 文件或目录名
选项:
-b:只查找可执行文件
-m:只查找帮助手册文件
-s:只查找源代码文件

# 示例
# 找出cat的可执行文件路径
[root@chenshiren ~]# whereis -b cat 
cat: /usr/bin/cat
# 找出cat的帮助手册文件
[root@chenshiren ~]# whereis -m cat
cat: /usr/share/man/man1/cat.1.gz /usr/share/man/man1p/cat.1p.gz

locate/updatedb

locate命令用于快速定位文件系统中与指定模式匹配的文件名。locate命令通过搜索数据库来实现快速搜索,而这个数据库是通过updatedb命令定期更新的。

[root@chenshiren ~]# locate [-iclSr] keyword
选项:
-i:忽略大小写
-c:不输出文件名,仅计算找到的文件数量
-l:仅输入几行的意思,例如输出5行 就是-l 5
-S:输入locate所使用的数据库文件的相关信息,包括该数据库记录的文件/目录数量等
-r:使用正则表达式进行匹配

# 示例:
# 找到系统中所有与passwd相关的文件名,只列出5个
[root@chenshiren ~]# locate -l 5 passwd
/etc/passwd
/etc/passwd-
/etc/pam.d/passwd
/etc/security/opasswd
/usr/bin/gpasswd
# 查询所使用的数据库文件和文件名以及各数数据数量
[root@chenshiren ~]# locate -S
数据库 /var/lib/mlocate/mlocate.db:
        10,397 文件夹
        132,201 文件
        6,747,736 文件名中的字节数
        3,215,802 字节用于存储数据库
        
# 创建一个文件,然后再使用 locate搜索看看
[root@chenshiren ~]# touch abcdefg
[root@chenshiren ~]# locate  abcdefg
[root@chenshiren ~]#  #找不到

因为他是经过数据库来查找的,而数据库的建立默认是在每天执行一次,所以当你新建立起来的文件,却还在数据库更新之前查找该文件,那么locate会告诉你找不到,这时候只要执行updatedb更新文件索引数据库就可以了

[root@chenshiren ~]# updatedb
[root@chenshiren ~]# locate  abcdefg
/root/abcdefg

find

find命令用于查找文件和目录,find命令的功能非常丰富,可以根据各种条件来搜索文件

[root@chenshiren ~]# find [搜索的起始路径] [选项] [匹配的文件名模式或其他条件]

选项一:与时间有关的选项

共有-atime,-ctime与-mtime,以mtime说明

选项 作用
-mtime n n为数字,意义为在n天之前的【一天之内】被修改过内容的文件
-mtime +n 列出在n天前(不含n天本身)被修改过内容的文件
-mtime -n 列出在n天内(含n天本身)被修改过内容的文件
-newer file file为一个存在的文件,列出比file还要新的文件

示例:

  • 将过去系统上面24小时内有修改过内容(mtime)的文件列出
[root@chenshiren ~]# find / -mtime 0  
# 那个0是重点,0代表目前的时间,所以,从现在开始到24小时前
# 如果想找出4天内被修改的文件,可以使用【find / -mtime -4】
  • 找出/var/log/下面以.log结尾的文件7天前的文件
[root@kylin-v10-sp3-csq ~]# find /var/log/ -type f -name "*.log" -mtime +7
/var/log/.kylin-post-actions-nochroot.log
/var/log/anaconda/anaconda.log
/var/log/anaconda/X.log
/var/log/anaconda/program.log
/var/log/anaconda/packaging.log
/var/log/anaconda/storage.log
/var/log/anaconda/lvm.log
/var/log/anaconda/dnf.librepo.log
/var/log/anaconda/hawkey.log
/var/log/anaconda/dbus.log
/var/log/anaconda/ks-script-06afsx8t.log
/var/log/anaconda/ks-script-irzum_3u.log
/var/log/anaconda/ks-script-u1xtb85e.log
/var/log/anaconda/ks-script-xb0qv_x8.log
/var/log/anaconda/journal.log
/var/log/ky_kms_activation.log
/var/log/kylin-security.log

选项二:与使用者或用户组名称有关的选项

选项参数 作用
-uid n 按照文件或目录的拥有者用户ID(UID)来搜索。n为用户ID的数字表示。
-gid n 按照文件或目录的拥有者组ID(GID)来搜索。n为组ID的数字表示。
-user name 按照文件或目录的拥有者用户名来搜索。
-group name 按照文件或目录的拥有者组名来搜索。
-nouser 搜索那些拥有者用户不存在于 /etc/passwd 文件中的文件或目录
-nogroup 搜索那些拥有者组不存在于 /etc/group 文件中的文件或目录
  • 查找系统中不属于任何人的文件
[root@chenshiren ~]# find / -nouser

选项三:与文件权限有关的选项

-name filename :根据文件名进行搜索,可以使用通配符进行模式匹配
-iname filename : 不区分大小写文件名进行搜索,可以使用通配符进行模式匹配

-size [+|-]SIZE:根据文件的大小进行搜索。可以使用+表示大于,-表示小于,然后跟上大小值
                 例如,+100M表示大于100兆字节的文件

-type TYPE     :根据文件类型进行搜索,常见的类型包括:
                f:普通文件
                d:目录
				l:符号链接
				c:字符设备文件
				b:块设备文件
				s:套接字文件
				p:命名管道(FIFO)
				
-perm mode     :表示精确匹配文件权限位
                文件的权限必须严格等于指定的权限才会被匹配
                
-perm -mode    :表示寻找的文件必须至少有所有指定权限位
                文件的权限必须至少包含指定的权限,才会被匹配
                例如:查找【-rwxr-xr-x】时,【-rwx --- ---】属性也会被列出来
                
-perm /mode    :表示匹配【任何一组权限位】
                 例如:查找【-rwxr-xr-x】时,【-rw- --- ---】属性也会被列出来,因为他有rw
  • 假设我想要找出来 /usr/bin、usr/sbin 这两个目录下,只要具有 SUID 或 SGID 就找到该文件
[root@chenshiren ~]# find /usr/bin /usr/sbin / -perm /6000
  • 查找文件不区分大小写(文件名)
[root@kylin-v10-sp3-csq ~]# touch /backup/HEHE{1..5}.txt
[root@kylin-v10-sp3-csq ~]# find / -iname hehe*.txt
/backup/HEHE1.txt
/backup/HEHE2.txt
/backup/HEHE3.txt
/backup/HEHE4.txt
/backup/HEHE5.txt
  • 找出/etc/下大于100k文件
[root@kylin-v10-sp3-csq ~]# find /etc/ -size +100k
/etc/pki/ca-trust/extracted/edk2/cacerts.bin
/etc/pki/ca-trust/extracted/java/cacerts
/etc/pki/ca-trust/extracted/openssl/ca-bundle.trust.crt
/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem
/etc/yum.repos.d/zabbix-get-6.0.40-release1.el7.x86_64.rpm
/etc/services
/etc/selinux/targeted/contexts/files/file_contexts
/etc/selinux/targeted/contexts/files/file_contexts.bin
/etc/selinux/targeted/policy/policy.32
/etc/lvm/lvm.conf
/etc/udev/hwdb.bin
/etc/java/java-11-openjdk/java-11-openjdk-11.0.27.6-1.p01.ky10.x86_64/lib/security/public_suffix_list.dat

选项四:额外可进行的操作

选项 作用
-exec command {} \; 用于在找到的文件执行特定的命令
-print 将结果打印到屏幕上,这个操作是默认操作
xargs 用于在找到的文件执行特定的命令
  • 将选项三的示例找到的文件 使用【ls -l】展现出来
[root@chenshiren ~]# find /usr/bin /usr/sbin / -perm /6000 -exec ls -l {} \;
# {}代表find命令找到的文件
# \;用于表示命令的结束
# 因为在bash环境下,;是有特殊意义的
# 所以我们需要使用反斜杠\来转义;,确保它被正确解释为-exec操作的结束符号
# 而不是shell中的命令结束符号。
  • 在/etc/下找出.conf结尾的文件,找出这些文件中过滤包含root或csq的行
find /etc/ -type f -name "*.conf" | xargs grep -E 'root|csq'
  • find找出来交给tar打包压缩/backup/etc-conf.tar.gz
#两种方法
find /etc/ -type f -name "*.conf" -exec tar -zcf /backup/etc1-conf.tar.gz {} +
find /etc/ -type f -name "*.conf" | xargs tar -zcf /backup/etc2-conf.tar.gz
  • find找出文件通过cp复制走
#找出/var/log/下以.log结尾的文件复制到/backup/logs/目录
#两种方法
find /var/log/ -type f -name "*.log" |xargs cp -t /backup/logs/
find /var/log/ -type f -name "*.log" -exec  cp -f {} /backup/logs/ \;
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐