Linux文件与目录管理

文章目录

Linux文件与目录管理

关于路径

相对路径与绝对路径

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

Linux文件路径的变量:$PATH

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

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

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

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

文件与目录管理

文件与目录查看:ls

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

用法

shell 复制代码
ls [选项]   [文件]

选项

选项 作用
-a 列出所有文件,包括以.开头的隐藏文件
-A 类似于-a,但不包括...
-d 显示目录自身的信息,而不是显示目录中的内容
-f 直接列出结果,而不进行排序(ls默认会以文件名排序)
-F 在文件名后面加上一个斜杠/,表示该文件是一个目录; 加上*表示可执行文件; 加上=代表socket文件 加上`
-h 以人类可读的格式显示文件大小
-i 显示文件的 inode 号码,即唯一标识文件系统上文件或目录的索引节点号
-l 使用长格式显示,包括文件类型、权限、链接数、所有者、组、大小、修改日期
-n 类似于-l,但以数字形式显示用户名和组
-r 以相反的顺序显示文件和目录
-R 递归地列出所有子目录及其内容
-S 按文件大小排序
-t 按照修改时间排序,最新修改的文件会显示在前面

示例

shell 复制代码
# 将家目录下所有文件列出来(含属性和隐藏文件)
[root@chenshiren ~]# ls -al ~
总用量 48
dr-xr-x---.  7 root root 4096  2月 26 21:15 .
dr-xr-xr-x. 18 root root  235  2月 24 15:56 ..
-rwx------.  1 root root 1437  2月 24 16:00 anaconda-ks.cfg
-rw-------.  1 root root 2837  2月 26 17:15 .bash_history
-rw-r--r--.  1 root root   18  8月 11  2021 .bash_logout
-rw-r--r--.  1 root root  141  8月 11  2021 .bash_profile
-rw-r--r--.  1 root root  429  8月 11  2021 .bashrc
drwx------.  7 root root  103  2月 24 16:07 .cache
drwx------. 10 root root 4096  2月 26 15:01 .config
-rw-r--r--.  1 root root  100  8月 11  2021 .cshrc
drwxr-xr-x.  2 zhw  root   21  2月 25 20:19 csq
-rw-------.  1 root root   20  2月 26 21:15 .lesshst
drwx------.  3 root root   19  2月 24 16:07 .local
drwx------.  2 root root    6  2月 24 15:57 .ssh
-rw-r--r--.  1 root root  129  8月 11  2021 .tcshrc
-rw-------.  1 root root 6257  2月 26 14:59 .viminfo

# 将家目录下所有文件列出来(含属性和隐藏文件)不显示颜色
[root@chenshiren ~]# ls -alF --color=never ~
总用量 48
dr-xr-x---.  7 root root 4096  2月 26 21:15 ./
dr-xr-xr-x. 18 root root  235  2月 24 15:56 ../
-rwx------.  1 root root 1437  2月 24 16:00 anaconda-ks.cfg*
-rw-------.  1 root root 2837  2月 26 17:15 .bash_history
-rw-r--r--.  1 root root   18  8月 11  2021 .bash_logout
-rw-r--r--.  1 root root  141  8月 11  2021 .bash_profile
-rw-r--r--.  1 root root  429  8月 11  2021 .bashrc
drwx------.  7 root root  103  2月 24 16:07 .cache/
drwx------. 10 root root 4096  2月 26 15:01 .config/
-rw-r--r--.  1 root root  100  8月 11  2021 .cshrc
drwxr-xr-x.  2 zhw  root   21  2月 25 20:19 csq/
-rw-------.  1 root root   20  2月 26 21:15 .lesshst
drwx------.  3 root root   19  2月 24 16:07 .local/
drwx------.  2 root root    6  2月 24 15:57 .ssh/
-rw-r--r--.  1 root root  129  8月 11  2021 .tcshrc
-rw-------.  1 root root 6257  2月 26 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

目录的相关操作:cd、pwd、mkdir、rmdir

特殊的目录

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

cd:切换目录

cd是Change Directory的缩写

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

shell 复制代码
[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 命令用于显示当前工作目录的完整路径

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

mkdir:创建目录

mkdir是Make Directory的缩写

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

shell 复制代码
[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  2月 26 22:29 abc

rmdir:删除空目录

rmdir是remove directory缩写

rmdir 命令用于删除空目录的

shell 复制代码
[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、rm、mv、touch

cp:复制文件或目录

cp是copy的缩写

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

用法:

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

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

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

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

shell 复制代码
# 示例:
# 将/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  2月 26 23:58 anaconda-ks.cfg
-rw----r--. 2 root root 1437  2月 26 23:58 anaconda-ks-hardlink.cfg
lrwxrwxrwx. 1 root root   15  2月 27 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命令是用于删除文件或目录

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

shell 复制代码
[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命令用于移动文件或目录,同时也可以用来重命名文件或目录

shell 复制代码
[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文件的修改时间,状态时间,读取时间

shell 复制代码
[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  9月 21  2022 /etc/man_db.conf # 在什么时间段建立的该内容
-rw-r--r--. 1 root root 5235  2月 27 18:26 /etc/man_db.conf # 在什么时间段读取过该内容
-rw-r--r--. 1 root root 5235  2月 24 15:58 /etc/man_db.conf # 在什么时间段更新过状态

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

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

比如:

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

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

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

shell 复制代码
[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  2月 27 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  2月 25 19:36 csq.txt
-rw-r--r--. 1 root root 0  2月 25 19:36 csq.txt
-rw-r--r--. 1 root root 0  2月 27 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  2月  1  2018 csq.txt
-rw-r--r--. 1 root root 0  2月  1  2018 csq.txt
-rw-r--r--. 1 root root 0  2月 27 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  2月  1  2018 csq.txt
-rw-r--r--. 1 zhw zhw 0  2月  1  2018 csq.txt
-rw-r--r--. 1 zhw zhw 0  2月 27 19:48 csq.txt

获取路径的文件名与目录名称:basename、dirname

获取文件名:basename

shell 复制代码
[root@chenshiren ~]# basename /etc/NetworkManager/system-connections/ens160.nmconnection 
ens160.nmconnection

获取路径名:dirname

shell 复制代码
[root@chenshiren ~]# dirname /etc/NetworkManager/system-connections/ens160.nmconnection 
/etc/NetworkManager/system-connections

文件内容查看

直接查看:cat、tac、nl

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

cat是Concatenate的缩写

shell 复制代码
[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会从最后一行开始显示内容,逐行向前显示,直到第一行。

shell 复制代码
[root@chenshiren ~]# tac /etc/issue

Kernel \r on an \m
\S

nl:添加行号输出内容

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

shell 复制代码
[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:一页一页翻动

shell 复制代码
[root@chenshiren ~]# more /etc/man_db.conf 

more按键说明

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

less:一页一页翻动

shell 复制代码
[root@chenshiren ~]# less /etc/man_db.conf 

less按键说明

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

数据截取:head、tail

head:取出前面几行

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

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

tail:取出后面几行

shell 复制代码
[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命令通常用于查看二进制文件或非文本文件的内容

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

文件与目录的默认权限与隐藏权限

文件默认权限:umask

umask用来设定新建文件的默认权限。它指定了在创建文件或目录时所要屏蔽的权限位

shell 复制代码
# 查看文件默认权限
[root@chenshiren ~]# umask 
0022   
# 查看文件默认权限 使用权限符号表示
[root@chenshiren ~]# umask -S
u=rwx,g=rx,o=rx

umask默认输出4组数字,第一组数字是特殊权限用的,后面三组代表文件权限

这里先解释后三组数字

在Linux系统中,目录最大的权限是777,文件最大的权限是666,因为基于安全原因,新建的文件不允许有执行权限,所以从文件的权限位来看,文件比目录少了执行(x)权限

umask的取值范围是0到777,每一位代表一种权限,分别为读、写和执行。umask的值会从默认的权限中减去,得到新创建文件/目录的权限

umask为022,文件拥有者并没有被拿掉任何权限,用户组和其他人的权限拿掉了2(就是写的权限)

  • 建立文件时:(-rw- rw- rw-)减(--- --w --w)=(-rw- r-- r--)
  • 建立目录时:(drwxrwxrwx)减(d--- -w- -w-)=(drwx r-x r-x)
shell 复制代码
[root@chenshiren ~]# umask 
0022
[root@chenshiren ~]# touch test
[root@chenshiren ~]# mkdir test
[root@chenshiren ~]# ll -d test*
-rw-r--r--. 1 root root 0  2月 27 21:19 test
drwxr-xr-x. 2 root root 6  2月 27 21:19 test1

例如:修改umask的值,创建文件时默认为(文件拥有者可读可写,用户组和其他人没有任何权限)

shell 复制代码
[root@chenshiren ~]# umask 066
[root@chenshiren ~]# touch csq.txt
[root@chenshiren ~]# ll csq.txt 
-rw-------. 1 root root 0  2月 27 21:24 csq.txt

文件隐藏权限:chattr、lsattr

chattr命令只能在 ext2、ext3、ext4的Linux传统文件系统上面完整生效,其他文件系统可能就无法完整的支持这个命令了,例如xfs仅支持部分参数而已

chatter:配置文件隐藏属性

shell 复制代码
chattr [+-=] [ASacdistu]  [文件名或目录名]

选项参数:

+              # 添加属性
-              # 删除属性
=              # 设置属性(覆盖原有属性)
-A             # 避免atime更新
-S(大写)       # 一般文件是非同步写入磁盘的,如果加上S这个属性时,当你进行任何文件的修改,该修改会【同步】写入磁盘中
-a             # 只能添加文件,不能删除或修改文件,适用于需要保留文件的情况,如日志文件
-c             # 这个属性设置之后,将会自动的将此文件【压缩】,在读取的时候将自动解压缩,但是在存储的时候,将会先进行压缩然后再存储
-d             # 当dump程序被执行的时候,设置d属性将可是该文件(目录)不会被dump备份
-i             # 表示不可更改,即该文件或目录不能被修改、删除、重命名或链接
-s(小写)        # 当文件设置了s属性时,如该文件被删除,他将会被完全的从硬盘删除,所以如果误删,完全无法恢复
-u              # 与s相反的,当使用u来配置文件时,如果该文件被删除,则数据内容其实还存在磁盘中,可以使用来恢复该文件

注意①:属性设置常见的是a与i的设置值,而且很多设置值必须要是root才能设置

注意②:xfs文件系统仅支持AadiS而已

shell 复制代码
# 示例
# 在/tmp目录下创建文件test.txt 属性设置为a和i
[root@chenshiren ~]# cd /tmp/
[root@chenshiren tmp]# touch test.txt
[root@chenshiren tmp]# chattr +ia test.txt 
[root@chenshiren tmp]# rm -rf test.txt 
rm: 无法删除 'test.txt': 不允许的操作
[root@chenshiren tmp]# chattr -ai test.txt
[root@chenshiren tmp]# rm -rf test.txt 

lsattr:显示文件隐藏属性

shell 复制代码
lsattr [-adR] [文件名或目录名]
选项参数
-a        # 显示所有文件和目录的属性
-d        # 如果参数是一个目录名,则仅显示该目录本身的属性,而不显示其子目录的属性
-R        # 递归显示目录及其中所有子目录的属性

# 示例
# 我们添加一些隐藏属性参数然后使用lsattr查询他
[root@chenshiren ~]# touch test
[root@chenshiren ~]# chattr +i test 
[root@chenshiren ~]# lsattr test 
----i----------------- test

文件特殊权限:SUID、SGID、SBIT

SUID(Set UID)

Set UID简称SUID的特殊权限,SUID有这样的限制和功能

  • SUID权限仅对二进制程序有效,不适用于非二进制文件。

  • 执行者对于该程序需要具有执行权限(x)。

  • SUID权限仅在执行该程序的过程中有效,执行完毕后权限自动恢复。

  • 执行者在执行该程序时,将具有该程序拥有者的权限,而不是执行者自己的权限

这样可以让普通用户执行具有特权权限的程序,避免了直接给予用户超出其权限范围的权限

SGID(Set GID)

Set GID简称SGID的特殊权限,SGID有这样的限制和功能

  • 对于文件:

    • 当SGID权限应用于二进制程序时,执行此程序的用户会获得程序所属组的支持

    • 执行程序者需要具备对该程序的执行权限

    • 这样做有助于确保程序在执行时以特定的用户组权限运行,提高了安全性和权限管理效率

  • 对于目录:

    • 用户如果对目录具有读取和执行权限,就可以进入该目录

    • 进入目录后,用户的有效用户组将会变为该目录的用户组

    • 当用户在具有写入权限的目录中创建新文件时,新文件将继承该目录的用户组,确保新文件与目录的用户组相匹配

常用于多个用户需要共享文件的情况下

SBIT(Sticky Bit)

Sticky Bit简称SBIT,SBIT有这样的限制和功能

  • 当用户对于此目录具有w、x权限,即具有写入的权限
  • 当用户在该目录下建立文件或目录时,仅有自己与root才有权力除该文件

有助于防止其他用户意外删除或修改彼此的文件

SUID、SGID和SBIT权限对应数字

  • 4为SUID
  • 2为SGID
  • 1为SBIT

注意:SUID不是用在目录上,SBIT不是用在文件上

shell 复制代码
# 示例1 下面仅仅是示例 SBIT不是用在文件上
[root@chenshiren tmp]# touch test
[root@chenshiren tmp]# chmod 4755 test ;ls -l test 
-rwsr-xr-x. 1 root root 0  2月 27 22:57 test   <==具有SUID的特殊权限
[root@chenshiren tmp]# chmod 6755 test ; ls -l test
-rwsr-sr-x. 1 root root 0  2月 27 22:57 test   <==具有SGID的特殊权限
[root@chenshiren tmp]# chmod 7755 test ; ls -l test 
-rwsr-sr-t. 1 root root 0  2月 27 22:57 test   <==具有SBIT的特殊权限
[root@chenshiren tmp]# chmod 7666 test ; ls -l test    
-rwSrwSrwT. 1 root root 0  2月 27 22:57 test   <==具有空的SUID和SGID的权限
# 当文件在执行时具有SUID、SGID和SBIT权限时,并且对应的可执行权限位(x)没有被设置时,就会显示为大写的S或T
# 这代表虽然SUID、SGID和SBIT权限被设置了,但实际上并没有可执行权限

# 示例2
# 查看passwd文件属性,将其的SUID特殊权限去掉,切换到普通用户看看能不能使用passwd修改密码
[root@chenshiren ~]# ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 32648  8月 10  2021 /usr/bin/passwd
[root@chenshiren ~]# chmod 0755 /usr/bin/passwd 
[root@chenshiren ~]# ll /usr/bin/passwd
-rwxr-xr-x. 1 root root 32648  8月 10  2021 /usr/bin/passwd
[zhw@chenshiren ~]$ passwd
更改用户 zhw 的密码 。
当前的密码: 
新的密码: 
重新输入新的密码: 
passwd: 鉴定令牌操作错误
[root@chenshiren ~]# chmod 4755 /usr/bin/passwd 
[zhw@chenshiren ~]$ passwd
更改用户 zhw 的密码 。
当前的密码: 
新的密码: 
重新输入新的密码: 
passwd:所有的身份验证令牌已经成功更新。

# 示例3
# 创建一个目录设置SGID特殊权限
[root@chenshiren ~]# mkdir -m 6755 /sharedir
[root@chenshiren ~]# ll -d /sharedir/
drwsr-sr-x. 2 root root 6  2月 27 23:22 /sharedir/
[zhw@chenshiren sharedir]$ touch mytest
[zhw@chenshiren sharedir]$ ls
mytest
[zhw@chenshiren ~]$ cd /sharedir/
[zhw@chenshiren sharedir]$ ls -l
-rw-r--r--. 1 zhw root 0  2月 27 23:24 mytest

# 示例4
# 查看tmp文件属性,使用普通用户创建一个文件,再使用另一个普通用户看看是否能删除另外一个普通用户创建的文件
[root@chenshiren tmp]# ll -dl /tmp/
drwxrwxrwt. 22 root root 4096  2月 27 23:28 /tmp/
[zhw@chenshiren tmp]$ touch aaa
[csq@chenshiren tmp]$ rm -rf aaa 
rm: 无法删除 'aaa': 不允许的操作

观察文件类型:file

file命令用于确定文件的类型。通过在终端中输入file命令,后面跟上要检查的文件名或路径,系统会返回文件的详细信息,包括文件类型、编码等。

shell 复制代码
[root@chenshiren ~]# file anaconda-ks.cfg 
anaconda-ks.cfg: ASCII text  # 纯文本文件
[root@chenshiren ~]# file /usr/bin/ls
/usr/bin/ls: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=bdfe7bf382f12e8361d590aa148cb3e591f83d30, for GNU/Linux 3.2.0, stripped

# 文件类型:ELF 64-bit LSB pie executable
# 架构:x86-64
# 版本:version 1 (SYSV)
# 链接方式:dynamically linked
# 解释器:/lib64/ld-linux-x86-64.so.2
# 构建ID的SHA1哈希值:bdfe7bf382f12e8361d590aa148cb3e591f83d30
# 适用于GNU/Linux 3.2.0

命令与文件的查找

脚本文件的查找:which

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

shell 复制代码
[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、locate、find

whereis

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

shell 复制代码
[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命令定期更新的。

shell 复制代码
[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更新文件索引数据库就可以了

shell 复制代码
[root@chenshiren ~]# updatedb
[root@chenshiren ~]# locate  abcdefg
/root/abcdefg

find

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

shell 复制代码
[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)的文件列出

shell 复制代码
[root@chenshiren ~]# find / -mtime 0  
# 那个0是重点,0代表目前的时间,所以,从现在开始到24小时前
# 如果想找出4天内被修改的文件,可以使用【find / -mtime -4】

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

选项参数:

选项参数 作用
-uid n 按照文件或目录的拥有者用户ID(UID)来搜索。n为用户ID的数字表示。
-gid n 按照文件或目录的拥有者组ID(GID)来搜索。n为组ID的数字表示。
-user name 按照文件或目录的拥有者用户名来搜索。
-group name 按照文件或目录的拥有者组名来搜索。
-nouser 搜索那些拥有者用户不存在于 /etc/passwd 文件中的文件或目录
-nogroup 搜索那些拥有者组不存在于 /etc/group 文件中的文件或目录

示例:

查找系统中不属于任何人的文件

shell 复制代码
[root@chenshiren ~]# find / -nouser

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

shell 复制代码
-name 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 就找到该文件

shell 复制代码
[root@chenshiren ~]# find /usr/bin /usr/sbin / -perm /6000

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

选项 作用
-exec command {} \; 用于在找到的文件上执行特定的命令
-print 将结果打印到屏幕上,这个操作是默认操作

示例:

将选项三的示例找到的文件 使用【ls -l】展现出来

shell 复制代码
[root@chenshiren ~]# find /usr/bin /usr/sbin / -perm /6000 -exec ls -l {} \;
# {}代表find命令找到的文件
# \;用于表示命令的结束
# 因为在bash环境下,;是有特殊意义的
# 所以我们需要使用反斜杠\来转义;,确保它被正确解释为-exec操作的结束符号
# 而不是shell中的命令结束符号。
相关推荐
Chennnng2 小时前
Ubuntu 安装过程的 6 大常见问题类型
linux·运维·ubuntu
阿干tkl3 小时前
传统网络与NetworkManager对比
linux·网络
Evan芙3 小时前
Linux 进程状态与进程管理命令
linux·运维·服务器
doris6104 小时前
2025年设备管理系统:智能运维成新标杆
运维
qsjming4 小时前
EXT4文件系统特性说明
运维
码农12138号4 小时前
Bugku HackINI 2022 Whois 详解
linux·web安全·ctf·命令执行·bugku·换行符
Joren的学习记录4 小时前
【Linux运维进阶知识】Nginx负载均衡
linux·运维·nginx
用户2190326527355 小时前
Java后端必须的Docker 部署 Redis 集群完整指南
linux·后端
胡先生不姓胡5 小时前
如何获取跨系统调用的函数调用栈
linux
Jtti5 小时前
服务器防御SYN Flood攻击的方法
运维·服务器