目录
- Linux 的命名规则
- file & stat 命令查看文件详细信息
- 文件管理基础 之 “增”
- mkdir 创建文件夹
- touch 命令创建普通文件
- ln 命令创建链接
- cp 命令复制文件
- 文件管理基础 之 “删”
- rmdir 命令删除空文件夹
- rm 命令删除一切
- trash 命令:第三方回收站
- 文件管理基础 之 “改”
- mv 命令修改路径 & 重命名
- 文件管理基础 之 “查”
- ls 命令及其常用选项,更多参数选项使用 --help 查看
- cd 命令及其常用选项等
- pwd 命令
- find 命令查找一切
- cat 命令查看文件内容
- more 命令查看文件内容
- less 命令查看文件内容
- head 命令查看文件内容的开头
- tail 命令查看文件内容的结尾
- nl 命令查看文件内容
- xxd 命令查看二进制文件数据
Linux 的命名规则
相对于其他操作系统(如 Windows )来说,Linux 的命名规则并没有那么多条条框框,还算是比较自由的。在 Linux 中,它的命名规则有如下几点要求:
- 首先是大小写敏感:例如在 Linux 中,文件 demo 和文件 Demo 不是一个文件,然而这在 Windows 中却是相同的文件。
- 其次是 Linux 除了不允许 / 字符出现在名称中,其他任何字符都可以,这一点很宽松。
- 然后是文件名称长度不要超过 255 个字符。
- 最后是在 Linux 中没有文件后缀的说法,Linux 中一切皆是文件,你想用啥后缀都行,但还是建议遵循共识规范来命名。
那么问题来了,我如何识别一个文件是什么类型的文件呢???
第一种方式:看前缀,这大致识别文件是什么类型,也是我们最常用的方式,虽然有时候不靠谱,但能用就行
- 文件类型: - 普通文件; d 文件夹; l 链接文件; b 块设备文件; c 字符设备文件; p 管道文件; s 套接字文件
[test@demo ~]$ ls -l # 使用 ls 选项加 -l 选项,通过每一行的第一个字符来判定文件类型
总用量 0
drwxrwxr-x. 2 test test 6 10月 21 23:01 dir1 # 文件夹
-rw-rw-r--. 1 test test 0 10月 21 23:02 file1 # 普通文件
lrwxrwxrwx. 1 test test 5 10月 21 23:04 file2 -> file1 # 链接文件
file & stat 命令查看文件详细信息
[test@demo ~]$ file file1 # 通过 file 命令查看,这也是最常见的辨别一个文件的类型的方式
file1: ASCII text # 当前文件为一个普通的 ascii 码字符文件
[test@demo ~]$ file dir1
dir1: directory[test@demo ~]$ stat file1 # 使用 stat 命令查看文件的 inode 块信息,也可以知道当前文件类型文件:file1大小:4 块:8 IO 块:4096 普通文件 # 当前文件类型时普通文件
设备:fd02h/64770d Inode:136 硬链接:1
......
在 Linux 中,请不要通过文件后缀来辨别文件类型,除非你信任文件命名者采用了大家约定俗成的命名规范
文件管理基础 之 “增”
mkdir 创建文件夹
[test@demo ~]$ mkdir dir1 # 创建一个目录
[test@demo ~]$ mkdir dir2 dir3 # 创建多个目录,或使用大括号 mkdir {dir2,dir3}
[test@demo ~]$ mkdir -p dir4/a/b/c # 使用 -p 参数递归创建多个目录
[test@demo ~]$ tree dir4
dir4
└── a└── b└── c
[test@demo ~]$ mkdir -m 700 dir5 # 使用 -m 参数在创建目录的同时设置权限,关于权限的问题后面再说
[test@demo dir5]$ cd dir5 && ll -a
总用量 0
drwx------. 2 test test 6 10月 21 23:28 . # 当前文件夹的权限创建时给的权限为 700
touch 命令创建普通文件
[test@demo ~]$ touch file1 # 创建一个普通空文件
[test@demo ~]$ touch file2 file3 # 创建多个普通空文件,或使用大括号 touch {file2,file3}[test@demo ~]$ ll --time=atime file1
-rw-rw-r--. 1 test test 0 10月 21 23:37 file1
[test@demo ~]$ touch file1 # 当文件存在时,使用 touch 创建文件只会修改文件的访问时间
[test@demo ~]$ ll --time=atime file1
-rw-rw-r--. 1 test test 0 10月 21 23:40 file1[test@demo ~]$ touch -d "1999-12-12 04:23" file1 # touch 一般用于修改文件的时间,更多参数使用 --help 查看
[test@demo ~]$ ll --time=atime file1
-rw-rw-r--. 1 test test 0 12月 12 1999 file1
ln 命令创建链接
关于链接文件的 ”增“,链接文件分为 软链接 和 硬链接 两种类型,关于软硬链接的底层原理则需要了解 ext 文件系统的存储原理,则都是后话了。
- 软链接:类似于 Windows 中的快捷方式,链接文件指向源文件,如果源文件发生改变则链接文件也会发生相同改变。
- 硬链接:每个文件都有一个 inode 块来记录相关信息,当创建硬链接时就是为一个已存在的 inode 又在其中建立了一个新的目录项,也就是说多个文件名指向同一个 inode。不理解很正常,说人话就是 硬链接指向的源文件如果发生任何变化,链接文件都会发生相应变化,即使源文件被删了,也只是少了一个文件记录项而已,只要 inode 块还在,硬链接就还是可用的。
[test@demo ~]$ ln -s f1 ln1 # 使用 -s 参数创建一个软链接,指向源文件 f1
[test@demo ~]$ ll
-rw-rw-r--. 1 test test 0 10月 22 00:08 f1
lrwxrwxrwx. 1 test test 2 10月 22 00:08 ln1 -> f1 # 建立的软链接 ln1 指向了 f1,如果源文件被删除,则当前链接不可用[test@demo ~]$ ln f1 ln2 # 建立一个硬链接,指向源文件 f1
[test@demo ~]$ ll
-rw-rw-r--. 2 test test 0 10月 22 00:08 f1
-rw-rw-r--. 2 test test 0 10月 22 00:08 ln2 # 硬链接,当 f1 被删除,则 ln2 还是可用,因为 inode 块还在
[test@demo ~]$ stat f1 # 查看 f1 文件的 inode 块信息文件:f1大小:0 块:0 IO 块:4096 普通空文件
设备:fd02h/64770d Inode:136 硬链接:2 # 当前硬链接数为 2,即包含 f1 和 ln2 两个
cp 命令复制文件
[test@demo ~]$ cp file1 copy1 # 将文件 file1 复制为文件 copy1
[test@demo ~]$ cp -d ln1 ln2 # 使用 -d 参数,复制符号链接文件本身,而不是它所指向的源文件
[test@demo ~]$ cp -p file1 file2 # 使用 -p 参数,复制的文件将会保留源文件的所有属性,如权限、时间、属主等
[test@demo ~]$ cp --preserve=mode f1 ffff # 使用完整选项可以指定具体保留哪些属性,如权限(mode)、时间戳(timestamps)等
[test@demo ~]$ cp -r dir dircopy # 使用 -r 参数,将递归复制 dir 中所有文件和目录
[test@demo ~]$ cp -a file1 copy2 # 使用 -a 参数,等于同时使用 -d -p -r
[test@demo ~]$ cp -l file1 copy3 # 使用 -l 参数,以复制的形式创建 file1 的硬链接
[test@demo ~]$ cp -s file1 copy4 # 使用 -s 参数,以复制的形式创建指向 file1 的软链接
[test@demo ~]$ cp -n file1 file3 # 使用 -n 参数,在复制文件 file1 时,如果 file3 已存在,则取消本次复制
[test@demo ~]$ cp -i file1 file2 # 使用 -i 参数,交互式复制,若文件 file2 存在,则给出提示
cp:是否覆盖'file2'? y # file2 存在,给出提示,输入 n 拒绝,输入 y 允许
[test@demo ~]$ cp -f file1 file2 # 使用 -f 参数,强制复制,若目标文件已存在,则将其覆盖
[test@demo ~]$ cp -u f1 f2 # 使用 -u 参数,若 f1 的最近改动时间被 f2 新,则将 f1 复制到 f2,否则忽略本次复制
[test@demo ~]$ cp -b f1 f3 && ls # 使用 -b 参数,当 f3 存在且于 f1 内容不同时,则先备份 f3 ,再将 f1 复制为 f3
f1 f2 f3 f3~ # f3~ 创建的为备份文件
文件管理基础 之 “删”
rmdir 命令删除空文件夹
[test@demo ~]$ rmdir dir1 # 使用 rmdir 删除空目录,若目录非空,则删除失败
[test@demo ~]$ tree a
a # 虽然每个目录都为空,但是目录树存在多个分支,所以不能删除
├── b
│ └── c
└── d
[test@demo ~]$ rmdir -p a/b/c # 使用 -p 参数,递归从最底层开始依次删除所有空目录,前提是目录树只能是一条线
rmdir: 删除目录 'a' 失败: 目录非空
上面的命令虽然很鸡肋,但是在一些应用场景下它是安全的,可以防止手贱贸然删除一些文件
rm 命令删除一切
[test@demo ~]$ rm file1 # 使用 rm 命令,可以删除一切文件,没有回收站的那种删除
[test@demo ~]$ rm -r dir1 # 使用 -r 参数,可以删除一切目录
[test@demo ~]$ rm -i file1 # 使用 -i 参数,在删除之前进行询问,可以防止手贱意外删除
[test@demo ~]$ rm -f file1 # 使用 -f 参数,强制删除文件,和 -r 搭配成 -rf 可以强制删除目录
[test@demo ~]$ rm -rf dir1 file1 # 终极命令,可以删除任何文件目录
为什么你在使用 rm 不加 -i 时还是存在删除提示??? 因为系统使用了 alias rm=“rm -i” 命令给你做了别名,等于是防呆设计。在没有完全把握之前,请不要使用终极命令大力出奇迹,虽然系统尽力防止你手贱,但是防呆不防傻。
trash 命令:第三方回收站
# 当你没有安装 RHEL 系列的额外软件仓库 epel 时,请先安装此仓库;如果你没有条件,可以忽略这一步
[root@demo ~]$ sudo dnf install epel-release # 安装 epel 软件仓库# 注意:此软件需要你的系统中已存在 python 环境
# 如果你没有安装 epel 仓库,则可以通过 https://pkgs.org 网站搜索和下载对应发行版的 trash-cli 软件包和依赖
[root@demo ~]$ sudo dnf install -y trash-cli # 从 epel 仓库中安装 trash-cli 软件包# 对于离线安装此软件包的用户,执行如下命令来离线安装
[test@demo ~]$ ls # 首先确定你已经拥有了如下两个软件包,其中第一个为依赖包,第二个为软件包
python3-unipath-1.1-16.el8.noarch.rpm trash-cli-0.21.4.18-2.el8.noarch.rpm
[test@demo ~]$ sudo rpm -ivh * # 执行命令安装软件包,其中 * 表示当前文件夹下所有文件
[sudo] test 的密码:
......[test@demo ~]$ trash file1 # 使用 trash 命令删除文件到回收站中
[test@demo ~]$ trash-list # 使用 tsash-list 命令查看回收站
2024-10-22 18:21:15 /home/test/file1
[test@demo ~]$ trash-restore file1 # 使用 trash-restore 来恢复文件,(请切换到需要恢复的文件夹中执行)0 2024-10-22 18:21:15 /home/test/file1
What file to restore [0..0]: 0 # 查询当前文件夹下可以恢复的同名文件个数,通过对应编号来选取需要恢复的文件
[test@demo ~]$ trash-rm file1 # 使用 trash-rm 来删除回收站中对应文件,(会删除所有同名文件)
[test@demo ~]$ trash-empty 20 # 使用 trash-empty 来清空回收站,20 表示删除过去 20 天的文件,不加天数则删除所有
注意:trash 删除文件并不是真正的删除,而是将文件移入了 ~/.local/share/Trash 的文件夹中,在 ~/.local/share/Trash 文件夹中,files 文件夹中记录了你删除的所有文件,info 文件夹中记录了所删除文件的所有信息(如 何时删除,路径是哪里等)。
建议:如果你觉得命令太长用起来麻烦,那么可以使用前面章节提到得 alias 命令来为其设置别名。
文件管理基础 之 “改”
文本文件内容的改动请参照 “vi 和 vim 怎么玩” 和 “Linux 文本处理三剑客” 章节的内容。
mv 命令修改路径 & 重命名
[test@demo ~]$ ls
dir1 file1
[test@demo ~]$ mv file1 dir1/ # 使用 mv 命令移动文件,将文件 file1 移动到 dir1 目录下,
# 注意:若目标区域存在和当前需移动文件名相同的文件,采用如上方式将会覆盖目标区域的同名文件[test@demo ~]$ mv -i file1 dir1/ # 使用 -i 参数,如果出现意料之外的情况将会提示,和 -f 完全相反
mv:是否覆盖'dir1/file1'? n # 使用 n 或 y 来选择是否覆盖
[test@demo ~]$ mv -f file1 dir1/ # 将会强制覆盖 dir1/ 下的同名文件,和 -i 完全相反
[test@demo ~]$ mv -n file1 dir1/ # 使用 -n 参数,若 dir1/ 下存在同名文件,将终止此次操作,不会覆盖
[test@demo ~]$ mv -u file1 dir1/ # 使用 -u 参数,和上面的 cp 命令 -u 参数功能一样
[test@demo ~]$ mv -b file1 dir1/ # 使用 -b 参数,和上面的 cp 命令 -b 参数功能一样# mv 命令除了用来移动文件位置,由于其不加任何参数时会覆盖相同位置的同名文件的特性,因此也经常用来重命名文件
[test@demo ~]$ ls
a
[test@demo ~]$ mv a b # 将文件 a 重命名为 b
[test@demo ~]$ ls
b
文件管理基础 之 “查”
ls 命令及其常用选项,更多参数选项使用 --help 查看
[test@demo ~]$ ls # 使用 ls 命令查看目录中所有文件,不包含隐藏( 以 . 开头 )文件
b
[test@demo ~]$ ls -a # 使用 -a 参数,查看所有文件,包含隐藏的,(其中 . 表示本级目录,.. 表示上级目录)
. .. b .bash_history .bash_logout .bash_profile .bashrc .local .viminfo
# 注意: 如果你不想看到 . 和 .. 两个目录,则可以使用 -A 选项[test@demo ~]$ ls -l # 使用 -l 参数,查看所有文件的长格式
-rw-rw-r--. 1 test test 0 10月 22 19:13 b
-rw-rw-r--. 1 test test 0 10月 22 19:13 c
[test@demo boot]$ ls -lh # 使用 -h 参数,以人类能读懂的方式查看文件的长格式,如文件大小
总用量 166M
-rw-r--r--. 1 root root 192K 5月 10 2022 config-4.18.0-372.9.1.el8.x86_64
drwxr-xr-x. 3 root root 17 10月 21 15:55 efi
drwx------. 4 root root 83 10月 21 15:59 grub2
-rw-------. 1 root root 85M 10月 21 15:58 initramfs-0-rescue-a6af9cee7de24b79a602774b242f2e89.img
[test@demo ~]$ ls -lt # 使用 -t 参数,将所有文件按照时间排序,(联合 -r 选项可以反转顺序)
drwxrwxr-x. 2 test test 6 10月 22 19:18 d1
-rw-rw-r--. 1 test test 0 10月 22 19:13 b
-rw-rw-r--. 1 test test 0 10月 22 19:13 c
[test@demo boot]$ ls -lSh # 使用 -S 参数,将所有文件按照大小排序,(联合 -r 选项可以反转顺序)
总用量 166M
-rw-------. 1 root root 85M 10月 21 15:58 initramfs-0-rescue-a6af9cee7de24b79a602774b242f2e89.img
-rw-------. 1 root root 31M 10月 21 16:00 initramfs-4.18.0-372.9.1.el8.x86_64.img
-rw-------. 1 root root 26M 10月 21 16:01 initramfs-4.18.0-372.9.1.el8.x86_64kdump.img
[test@demo boot]$ ls -ld # 使用 -d 参数,只查看当前目录情况
dr-xr-xr-x. 5 root root 4096 10月 21 16:01 .
cd 命令及其常用选项等
[test@demo ~]$ cd dir1/ # cd 命令没有选项可选,直接跟路径即可,无论绝对路径还是相对路径# cd 可以跟着几个特殊路径符号
[test@demo dir1]$ cd . # . 表示当前目录,表示进入到当前目录
[test@demo dir1]$ cd .. # .. 表示上一级目录,表示进入到上一级目录
[test@demo dir1]$ cd ~ # ~ 表示当前用户家目录,表示进入到用户家目录
[test@demo dir1]$ cd ~tom # 表示进入到用户 tom 的家目录
[test@demo dir1]$ cd - # 表示回退到上次所在的目录
pwd 命令
[test@demo ~]$ pwd # 查看当前所在的绝对路径位置
/home/test
# pwd 存在两个参数 -L 、-P不过没啥用,结果都一样
find 命令查找一切
[test@demo ~]$ sudo find /etc -name "sudoers" # 使用 -name 参数,指定在路径下需要查找的文件名称
/etc/sudoers # 命中到的结果
[test@demo ~]$ sudo find /etc -iname "sUdoErs" # 使用 -iname 参数,不区分名称大小写
/etc/sudoers
[test@demo ~]$ find /dev -maxdepth 1 -type c # 使用 -type 参数,查找指定类型的文件(普通文件为 f,其他和上面一样)
/dev/vcsa6
/dev/vcs6
......
# 使用 -maxdepth [数字] 可以指定最大查找深度,使用 -mindepth [数字] 可以指定从第几层开始查找
[test@demo ~]$ sudo find /boot -size +10M # 使用 -size 参数,查找文件 >10M 的文件( -10M 就是 <10M 的文件)
[sudo] test 的密码:
/boot/initramfs-4.18.0-372.9.1.el8.x86_64.img
/boot/initramfs-0-rescue-a6af9cee7de24b79a602774b242f2e89.img
/boot/initramfs-4.18.0-372.9.1.el8.x86_64kdump.img
[test@demo ~]$ find ./ -mtime -1 # 使用 -mtime 参数,查找在 1 天以内修改过的文件( +1 表示在 1 天前修改过的文件;1 表示刚好 1 天前修改过的文件 )
[test@demo ~]$ find ./ -perm 664 # 使用 -perm 参数,查找权限为 664 的文件
./text
./f
[test@demo ~]$ find ./ -perm /u+rw # 支持字符串,查找用户有读写权限的文件
./text
./f
[test@demo ~]$ find ./ -user test # 使用 -user 参数,查找指定用户的文件
[test@demo ~]$ find ./ -group test # 使用 -group 参数,查找指定组的文件
[test@demo dir1]$ find ./ -name file1 -exec cat {} \; # 使用 -exec 参数,对查找到的文件执行 cat 命令
# -exec 后面根需要执行的命令,{} 占位符表示 find 查到的文件, \; 是结束标记
[test@demo dir1]$ find ./ -name file -ok cat {} \; # 使用 -ok 参数,功能和 -exec 一样,唯一的区别就是自行命令前会提示
< cat ... ./file > ? y # 使用 y 、n 来确定和否定执行命令 cat
111# 使用多条件查找,条件优先级请看下面的警告部分
[test@demo dir1]$ find . -name "*.txt" -size +1M # 使用 and 查找以 .txt 结尾且大小 <1M 的文件( -and 可以省略 )
[test@demo dir1]$ find . -name "*.txt" -o -name "*.log" # 使用 or 查找名称以 .txt 或 .log 结尾的文件
[test@demo dir1]$ find . -not -name "*.txt" # 使用 not 查找不以 .txt 结尾的文件
警告:使用多条件查找时的条件优先级顺序是:(依次递减) [()] 、[ !; -not ] 、[ -a ; -and ] 、[ -o ; -or ]
若未指定条件运算符号,则默认使用 -and 连接,这也是 -and 可以省略的原因
cat 命令查看文件内容
[test@demo ~]$ echo hello,world > text
[test@demo ~]$ cat text # 查看文件内容
hello,world
[test@demo ~]$ cat -n text # 使用 -n 参数,查看内容时显示行号1 hello,world
[test@demo ~]$ cat -A text # 使用 -A 参数,显示所有内容,包含回车($)、、制表符(^|)等
hello,world$
# 没啥参数常用的,其他参数使用 --help 查看用法
cat 命令的缺点就是一次性打印所有内容,当文件过大时,翻页都难受,这时就需要下面的交互式查看命令了
more 命令查看文件内容
[test@demo etc]$ sudo more /etc/sudoers # 选择一个长文件,通过 more 打开(因为查看的是受限的文件,所以使用了 sudo)
# 用的少,基本不用,需要其他参数使用 --help 查看用法
more 中常用的交互式命令:
q 或 Q : 退出交互模式
Enter :向下翻页一行内容
Space: 向下翻页一页内容
= : 显示当先所处位置的行号
/ : 搜索指定字符
v : 进入编辑模式,要退出按 :q 退出,按 :q! 强制退出 (不推荐使用,因为几乎没用过)
:f :在 v 模式里,按下 :f 显示当前光标位置和文件名称
h 或 ?: 查看帮助
注意:more 命令只能从前向后翻页,居然不能反过来,这就是个鸡肋命令,不如下面的 less 命令
less 命令查看文件内容
[test@demo etc]$ sudo less /etc/sudoers # 查看文件
[test@demo etc]$ sudo less -N /etc/sudoers # 使用 -N 参数,显示行号
[test@demo etc]$ sudo less -e /etc/sudoers # 使用 -e 参数,在文件翻页完继续翻页后自动退出
[test@demo etc]$ sudo less -i /etc/sudoers # 使用 -i 参数,打开的文件搜索字符串时将忽略大小写
[test@demo etc]$ sudo less -f /etc/sudoers # 使用 -f 参数,强制打开某个文件,如设备文件等
[test@demo etc]$ sudo less -o /etc/sudoers # 使用 -o 参数,将 less 输出的内容追加到指定文件中,(使用 -O 则是覆写)
less 常用的一些交互命令:
上下键:上下滚动一行内容
左右键:左右滚动一个页面的内容
Space:下滚动一个页面
Enter :下滚动一行
Home:滚动到顶部,其他键(End、PgUp等)功能对应键的含义
/ : 搜索指定字符串
N : 搜索字符串时切换到前一个匹配项
n : 搜索字符串时切换到下一个匹配项
q 或 Q :退出交互界面
h 或 H :显示帮助
注意:在滚动页面时还可以通过字母来滚动(如 j 向下滚动一行),但是由于很多字母都具有滚动效果,很繁琐记不住,所以一般就不推荐通过字符滚动
head 命令查看文件内容的开头
[test@demo ~]$ sudo head /etc/sudoers # 默认查看文件开头的 10 行内容
[test@demo ~]$ sudo head -3 /etc/sudoers # 以行模式查看文件开头的 3 行内容,( 等于使用 -n3 )
[test@demo ~]$ sudo head -c3 /etc/sudoers # 以字符模式查看文件开头 3 个字符
tail 命令查看文件内容的结尾
[test@demo ~]$ sudo tail /etc/sudoers # 默认查看文件结尾的 10 行内容
[test@demo ~]$ sudo tail -3 /etc/sudoers # 以行模式查看文件结尾的 3 行内容,( 等于使用 -n3 )
[test@demo ~]$ sudo tail -c3 /etc/sudoers # 以字符模式查看文件结尾 3 个字符
[test@demo ~]$ sudo tail -f 5 /var/log/xx.log # 使用 -f 参数,持续关注文件的结尾 5 行内容,按ctrl + c 可以退出关注
nl 命令查看文件内容
[test@demo ~]$ sudo nl /etc/sudoers # 按行号查看文件内容,效果等同于 cat -n 命令
xxd 命令查看二进制文件数据
[test@demo ~]$ sudo xxd /etc/sudoers # 输出文件的十六进制内容。适合查看一些二进制文件
00000000: 2323 2053 7564 6f65 7273 2061 6c6c 6f77 ## Sudoers allow
00000010: 7320 7061 7274 6963 756c 6172 2075 7365 s particular use
......