一、文件/目录查询结果显示
ls 显示文件/目录基本列表
**常用的选项有: **
1
2
3
4
5
6
7
8
9
10
11$ ls -F #轻松区分文件和目录,目录的最后有"/" $ ls -a #显示隐藏文件 $ ls -R #递归方式显示目录内的所有文件/目录 $ ls -l #显示每个文件的相关信息,如文件类型、权限、硬链接总数、属主、属组、修改时间等 $ ls -i #显示文件的inode编号
常见的文件类型包括普通文件(-)、目录文件(d)、链接文件(l)、管道文件(p)、块设备文件(b)以及字符设备文件(c)。
file 查看文件类型
file命令可以查看文件是什么类型,如目录,二进制文件,链接文件,脚本文件,可执行文件等。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18$ file a #a为目录 a: directory $ file test_three #test_three为空文件 test_three: empty $ echo aa > test_three #将aa字符串写入test_three文件 $ file test_three #test_three为二进制文件 test_three: ASCII text $ file a.sh #a.sh为脚本文件 a.sh: Bourne-Again shell script, ASCII text executable $ file /bin/rar #/bar/rar为二进制可执行文件 /bin/rar: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.15, BuildID[sha1]=aa2e0c518e5d0025864a8afdd6101d04c86ad3ef, stripped
cat 显示文本文件的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25$ cat test_three #查看test_three文件的内容 a d d $ cat -n test_three #查看test_three文件的内容,并显示行号 1 a 2 3 d d $ cat -b test_three #查看test_three文件的内容,并给有文本的行显示行号 1 a 2 d d $ cat -T test_three #查看test_three文件的内容,将制表符用^I字符替换 a d^Id
more 分页显示文本文件的内容
cat命令是一次性显示文本文件的全部内容,因此,对于长文本文件来说,只能看到屏幕上最后面的内容。而more命令则可以分屏显示,也就是每次显示一屏的文字。
1
2
3$ cat /etc/bash.bashrc $ more /etc/bash.bashrc
less 更加自主控制所显示的文本文件的内容
less提供一些移动文字的快捷键,如b/u可以往前翻,d/y可以往后翻,q表示退出显示,等等。
1
2$ less /etc/bash.bashrc
tail 显示文件末尾内容,默认10行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ tail /etc/bash.bashrc return $? elif [ -x /usr/share/command-not-found/command-not-found ]; then /usr/share/command-not-found/command-not-found -- "$1" return $? else printf "%s: command not found " "$1" >&2 return 127 fi } fi $ tail -n 5 /etc/bash.bashrc #-n 5可以用-5替代 printf "%s: command not found " "$1" >&2 return 127 fi } fi
head 显示文件开头部分内容,默认10行
1
2
3
4
5
6
7
8
9
10
11
12
13$ head /etc/bash.bashrc # System-wide .bashrc file for interactive bash(1) shells. # To enable the settings / commands in this file for login shells as well, # this file has to be sourced in /etc/profile. # If not running interactively, don't do anything [ -z "$PS1" ] && return # check the window size after each command and, if necessary, # update the values of LINES and COLUMNS. $ head -5 /etc/bash.bashrc # System-wide .bashrc file for interactive bash(1) shells. # To enable the settings / commands in this file for login shells as well, # this file has to be sourced in /etc/profile.
grep 从文件中按“行”提取符合匹配模式的文本内容
语法: grep [选项] 模式 文本对象
选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22-i, --ignore-case 忽略<模式>大小写 -w, --word-regexp 强制<模式>仅完全匹配字词 -x, --line-regexp 强制<模式>仅完全匹配整行 -z, --null-data 数据行以一个 0 字节结束,而非换行符 -s, --no-messages 不显示错误信息 -v, --invert-match 反向选择,即选中不匹配的行 -V, --version 显示版本信息并退出 -n, --line-number 输出的同时打印行号 -c, --count 只打印每个<文件>中的匹配<模式>的行数目 $ sudo cat /etc/sudoers | grep -v '#' | grep -v '^$' #显示/etc/sudoers文件中不包含'#'的行和空行
cut 对格式化的文本进行指定内容输出
对于某些有分割符的文件,可以通过分隔符来显示指定位置的文本。如果没有指定文件,或者文件为"-",则从标准输入读取输入字符。
常用选项
1
2
3
4
5
6
7
8
9
10
11
12-d, --delimiter=分界符 使用指定分界符代替制表符作为区域分界 -b, --bytes=列表 只选中指定的这些字节 -c, --characters=列表 只选中指定的这些字符 -f, --fields=LIST 只选中指定的这些域;还打印不包含分隔符的任何行,除非指定了-s选项 -s, --only-delimited 不打印没有包含分界符的行
**-b, -c 或-f 参数格式表示范围如下: **
-
N 从第1个开始数的第N个字节、字符或域
-
N- 从第N个开始到所在行结束的所有字符、字节或域
-
N-M 从第N个开始到第M个之间(包括第M个)的所有字符、字节或域
-
-M 从第1个开始到第M个之间(包括第M个)的所有字符、字节或域
$ cut -d : -f 1,2,4 /etc/passwd
root❌0
daemon❌1
bin❌2
…省略…
wc 统计文本文件的行数、字数、字节数
1
2
3
4$ wc /etc/bash.bashrc 71 329 2319 /etc/bash.bashrc
stat 查看文件的存储细节和时间参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ stat /etc/bash.bashrc 文件: /etc/bash.bashrc 大小: 2319 块: 8 IO 块: 4096 普通文件 设备: 804h/2052d Inode: 5243317 硬链接: 1 权限: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root) 最近访问: 2022-03-18 09:11:50.556627063 +0800 最近更改: 2020-02-25 20:03:22.000000000 +0800 最近改动: 2021-12-31 16:25:12.904966474 +0800 创建时间: -
sort 对文本内容进行排序后显示(不改变原文本内容)
语法: sort [选项] 文件名
选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33-b, --ignore-leading-blanks 忽略前导的空白区域 -d, --dictionary-order 只考虑空白区域和字母字符 -f, --ignore-case 忽略字母大小写 -g, --general-numeric-sort 按一般数字排序 -h, --human-numeric-sort 使用易读性数字(例如: 2K 1G) -M, --month-sort 按月份排序 (unknown) < 'JAN' < ... < 'DEC' -n, --numeric-sort 按数字排序 -R, --random-sort 随机排序 -V, --version-sort 在文本内进行自然版本排序 -r, --reverse 反向排序 --sort=WORD 按照WORD 指定的格式排序: 一般数字-g,高可读性-h,月份-M,数字-n,随机-R,版本-V -u, --unique 配合-c,严格校验排序;不配合-c,则只输出一次排序结果 -c, --check, --check=diagnose-first 检查输入是否已排序,若已有序则不进行操作 -t, --field-separator=分隔符 使用指定的分隔符代替非空格到空格的转换 -V, --version-sort 在文本内进行自然版本排序
uniq 去重显示文件内容
uniq,unique的缩写,可以去除文本中连续的重复行并输出(不改变原文本内容),但不连续的重复行将不予处理
diff 比较文件之间内容的差异
二、文件/目录管理
touch 创建空文件
touch filename #不存在即创建空文件,存在即改变文件的修改时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38$ pwd #查看当前目录 /home/hollowman/shellstudy $ touch test_one #创建空文件 $ stat test_one #查看文件时间信息 文件: test_one 大小: 0 块: 0 IO 块: 4096 普通空文件 设备: 804h/2052d Inode: 4468041 硬链接: 1 权限: (0664/-rw-rw-r--) Uid: ( 1000/hollowman) Gid: ( 1000/hollowman) 最近访问: 2022-03-17 14:04:23.133578989 +0800 最近更改: 2022-03-17 14:04:23.133578989 +0800 最近改动: 2022-03-17 14:04:23.133578989 +0800 创建时间: - $ touch test_one #改变文件的修改时间 $ stat test_one 文件: test_one 大小: 0 块: 0 IO 块: 4096 普通空文件 设备: 804h/2052d Inode: 4468041 硬链接: 1 权限: (0664/-rw-rw-r--) Uid: ( 1000/hollowman) Gid: ( 1000/hollowman) 最近访问: 2022-03-17 14:05:49.624544261 +0800 最近更改: 2022-03-17 14:05:49.624544261 +0800 最近改动: 2022-03-17 14:05:49.624544261 +0800 创建时间: -
touch -a filename #只修改文件的访问时间
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17$ touch -a test_one $ stat test_one 文件: test_one 大小: 0 块: 0 IO 块: 4096 普通空文件 设备: 804h/2052d Inode: 4468041 硬链接: 1 权限: (0664/-rw-rw-r--) Uid: ( 1000/hollowman) Gid: ( 1000/hollowman) 最近访问: 2022-03-17 14:10:04.416773006 +0800 最近更改: 2022-03-17 14:05:49.624544261 +0800 最近改动: 2022-03-17 14:10:04.416773006 +0800 创建时间: -
cp 复制文件
cp [选项] source destination
1
2
3
4
5
6
7
8
9$ cp test_one test_two #简单复制命令,但目标文件有新的修改时间 $ ls -l 总用量 0 -rw-rw-r-- 1 hollowman hollowman 0 3月 17 14:05 test_one -rw-rw-r-- 1 hollowman hollowman 0 3月 17 14:15 test_two
如果目标文件已经存在,cp命令并不会提醒,加上-i选项后,则会强制询问是否需要覆盖已有文件。
1
2
3$ cp -i test_one test_two cp: 是否覆盖'test_two'? n
如果需要将非当前工作目录的文件复制到当前目录,可使用" . "
1
2
3
4
5
6
7
8
9
10
11
12
13$ touch ../test_three #尝试在当前目录的父目录创建一个文件 $ cp ../test_three . #将父目录的文件复制到当前目录 $ ls -l 总用量 0 -rw-rw-r-- 1 hollowman hollowman 0 3月 17 14:05 test_one -rw-rw-r-- 1 hollowman hollowman 0 3月 17 14:22 test_three -rw-rw-r-- 1 hollowman hollowman 0 3月 17 14:15 test_two
注意复制文件到某个目录时,不要忘记"/",除非您能确保该目录存在。
1
2
3
4
5$ cp test_one ../testdirs/ #因为testdirs不存在,所以会提示无法创建普通文件。 cp: 无法创建普通文件'../testdirs/': 不是目录 $ cp test_one ../testdirs #本意是复制到testdirs目录,而实际则是将复制后的文件重命名为testdirs。
复制目录及目录下面的所有文件,可以用-R属性
1
2
3
4
5
6
7$ cp -R ../testdir/ . $ ls -F testdir/ test_one test_three test_two
ln 创建链接文件
链接文件有两种类型,符号链接 和 硬链接
符号链接 就是一个实实在在的文件,它指向存放在虚拟目录结构中某个地方的另一个文件。这两个通过符号链接在一起的文件,彼此的内容并不相同。使用
-s
选项可创建符号链接
硬链接 会创建独立的虚拟文件,其中包含了原始文件的信息及位置。但是它们从根本上而言是同一个文件。引用硬链接文件等同于引用了源文件。要创建硬链接,原始文件也必须事先存在,只不过这次使用ln命令时不再需要加入额外的参数了。
1
2
3
4
5
6
7
8
9
10
11
12
13$ ln -s test_one ln_test_one_s #创建符号链接 $ ln test_one ln_test_one #创建硬链接 $ ls -il *one* #查看文件列表,对比3个文件 4468041 -rw-rw-r-- 2 hollowman hollowman 0 3月 17 14:05 ln_test_one 4457640 lrwxrwxrwx 1 hollowman hollowman 8 3月 18 09:26 ln_test_one_s -> test_one 4468041 -rw-rw-r-- 2 hollowman hollowman 0 3月 17 14:05 test_one
可以看出,符号链接文件属性与源文件属性并不相同,大小不同,inode编号也不同,类似于快捷方式,而硬链接文件和原始文件属性相同,并且同inode编号,属性中的2是硬链接数,表示该文件有2个硬链接文件,修改任意一个硬链接文件其他文件都会改变,删除1个硬链接对应的硬链接数将减1
注意: 只能对处于同一存储媒体的文件创建硬链接。要想在不同存储媒体的文件之间创建链接,只能使用符号链接。
mv 重命名/移动文件
mv命令可以将文件或目录移动到另一个位置或重新命名,而且,并不会改变文件的inode编号和时间戳。
当目标文件已存在时,会进行覆盖操作,通过-i选项可以在试图覆盖已有文件是得到提示
1
2
3
4$ mv -i test_two test_three mv: 是否覆盖'test_three'? n $ mv test_two test_three
rm 删除文件
**常用选项: **
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21rm -i filename #删除前确认,养成使用-i的好习惯 rm -f filename #强制删除,慎用 rm -r dirname #删除目录及目录内的文件 rm -rf / #强制删除根目录及目录文件,除非搞破坏不要使用此命令。 $ ls -F ln_test_one_ss testdir/ test_three $ rm -i ln_test_one_ss #确认后再删除文件 rm: 是否删除普通空文件 'ln_test_one_ss'? y $ rm -r testdir/ #删除目录 $ ls -F ln_test_one_ss test_three
mkdir 创建目录
-p选项可以同事创建多层目录
1
2
3
4
5
6$ mkdir a/b/c mkdir: 无法创建目录 “a/b/c”: 没有那个文件或目录 $ mkdir -p a/b/c $ cd a/b/c /a/b/c$
rmdir 删除目录
rmdir命令只能删除空目录,
rm -i
也可以用来删除目录,并且是非空目录,因此一般不用rmdir命令。
tr 替换文本内容
tr,translate的意思,可以替换文本内容中的字符,需通过管道符来实现
语法: tr [原始字符] [目标字符]
tar 对文件进行压缩、解压缩
语法: tar [选项...] [FILE]...
选项
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21-c 创建压缩文件 -x 解开压缩文件 -t 查看压缩包内有哪些文件 -z 用Gzip压缩或解压 -j 用bzip2压缩或解压 -v 显示压缩或解压的过程 -f 目标文件名 -p 保留原始的权限与属性 -P 使用绝对路径来压缩 -C 指定解压到的目录
实例
1
2
3
4
5
6
7
8tar -cvf archive.tar foo bar # 将foo和bar压缩为archive.tar包 tar -xvf archive.tar # 将archive.tar解压缩 tar -tvf archive.tar # 查看archive.tar包文件列表
dd 复制文件,依照指定操作数转换并格式化。
语法: dd [操作数] ...
或: dd 选项
(仅用于显示帮助信息–help和版本信息–version)
常用操作数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16if=文件 从指定文件而非标准输入来进行读取 of=文件 写入到指定文件而非标准输出 bs=字节数 一次读写的比特数(默认: 512);会覆盖 ibs 和 obs 选项 ibs=字节数 一次读取的字节数(默认: 512),与obs配合使用 obs=字节数 一次写入指定字节数(默认: 512),与ibs配合使用 cbs=字节数 一次转换的字节数 count=块数 指定需要复制的输入块的数量
**块数和字节数后可以带有以下的一个或多个后缀: **
c=1, w=2, b=512, kB=1000, K=1024, MB=1000_1000, M=1024_1024, xM=M,GB=1000_1000_1000, G=1024_1024_1024 以及相应可使用 T, P, E, Z, Y。也可使用二进制进位前缀: 如 KiB=K、MiB=M 等等。
以下3个复制操作数虽不同,但效果相同:
1
2
3
4
5
6
7
8
9
10
11
12
13# dd if=/dev/zero of=h1 count=1 bs=1024 记录了1+0 的读入 记录了1+0 的写出 1024字节(1.0 kB,1.0 KiB)已复制,0.000397286 s,2.6 MB/s # dd if=/dev/zero of=h1 count=1 obs=1024 ibs=1024 记录了1+0 的读入 记录了1+0 的写出 1024字节(1.0 kB,1.0 KiB)已复制,0.00090209 s,1.1 MB/s # dd if=/dev/zero of=h1 count=2 记录了2+0 的读入 记录了2+0 的写出 1024字节(1.0 kB,1.0 KiB)已复制,0.000301429 s,3.4 MB/s
/dev/zero:“零”设备,本身不占存储空间,但可以无限的提供空字符(0x00,ASCII代码NUL)。常用来配合dd命令生成一个特定大小的文件。
三、文件权限管理
chown 修改文件的属主(所有者)和属组(所属组)
语法: chown owner:group 文件名
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25$ ls -l 总用量 12 drwxrwxr-x 3 hollowman hollowman 4096 3月 18 11:07 a -rw-rw-r-- 1 hollowman hollowman 22 3月 18 13:22 a.sh -rw-rw-r-- 1 hollowman hollowman 7 3月 18 13:33 test_three $ sudo chown root:root a.sh #注意: 如果涉及到root用户,需要通过sudo获取root权限 [sudo] hollowman 的密码: $ ls -l 总用量 12 drwxrwxr-x 3 hollowman hollowman 4096 3月 18 11:07 a -rw-rw-r-- 1 root root 22 3月 18 13:22 a.sh -rw-rw-r-- 1 hollowman hollowman 7 3月 18 13:33 test_three
chmod 修改文件/目录权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24$ ll file1 #无权限文件file1 ---------- 1 hollowman hollowman 0 9月 18 11:18 file1 $ chmod u+r,g+w file1 #u,g分别赋权r和w $ ll file1 -r---w---- 1 hollowman hollowman 0 9月 18 11:18 file1 $ chmod +x file1 #u,g,o都赋权x $ ll file1 -r-x-wx--x 1 hollowman hollowman 0 9月 18 11:18 file1* $ chmod ugo+rwx file1 #u,g,o都赋权rwx $ ll file1 -rwxrwxrwx 1 hollowman hollowman 0 9月 18 11:18 file1* $ chmod 765 file1 #数字赋权法 $ ll file1 -rwxrw-r-x 1 hollowman hollowman 0 9月 18 11:18 file1*
SUID,SGID,SBIT赋权
SUID: 让二进制程序的执行者临时拥有所有者的权限(仅对拥有执行权限的二进制程序有效)。
SGID: 当对二进制程序进行设置时,能够让执行者临时获取文件所属组的权限;当对目录进行设置时,则是让目录内新创建的文件自动继承该目录原有用户组的名称。
SBIT(Sticky Bit)粘滞位: 当对目录设置SBIT权限后,目录中的文件只能被文件所有者删除,也就是用户只能删除自己的文件,而不能删除其他用户的文件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21$ chmod ug+s,o+t file1 $ ll file1 -rwsrwsrwt 1 hollowman hollowman 0 9月 18 11:18 file1* $ chmod 4000 file1 $ ll file1 ---S------ 1 hollowman hollowman 0 9月 18 11:18 file1 $ chmod 6000 file1 $ ll file1 ---S--S--- 1 hollowman hollowman 0 9月 18 11:18 file1 $ chmod 7000 file1 $ ll file1 ---S--S--T 1 hollowman hollowman 0 9月 18 11:18 file1 $ chmod 7777 file1 $ ll file1 -rwsrwsrwt 1 hollowman hollowman 0 9月 18 11:18 file1*
chattr 设置文件隐藏权限(change attributes)
语法: chattr [-pRVf] [-+=aAcCdDeijPsStTuF] [-v version] files...
**属性: **
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23s: 第1位隐藏属性,彻底从硬盘中删除,不可恢复(用0填充原文件所在硬盘区域) u: 第2位隐藏属性,与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion S: 第3位隐藏属性,文件内容在变更后立即同步到硬盘(sync) i: 第5位隐藏属性,设定文件不能被修改;若对目录设置了该参数,则仅能修改其中的子文件内容而不能新建或删除文件。 a: 第6位隐藏属性,append Only,仅允许补充(追加)内容,无法覆盖/删除内容。 d: 第7位隐藏属性,no dump,使用dump命令备份时忽略(也就是不备份)本文件/目录 A: 第8位隐藏属性,文件或目录的 atime (access time)不可被修改(modified) c: 第9位隐藏属性,compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。 j: 第11位隐藏属性,journal,设定此参数使得当通过mount参数: data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为 data=journal,则该参数自动失效。 t: 第12位隐藏属性,让文件系统支持尾部合并(tail-merging) D: 检查压缩文件中的错误(不能通过lsattr查看,直接通过+D进行检查)
lsattr 查看文件隐藏属性
1
2
3
4
5
6
7
8
9
10
11
12
13# chattr +s test_three && lsattr ./test_three s------------------- ./test_three # chattr -s test_three && lsattr ./test_three -------------------- ./test_three # chattr =uiaAct test_three && lsattr ./test_three -u--ia-Ac---t------- ./test_three # chattr -uiaAct test_three && lsattr ./test_three -------------------- ./test_three
setfacl 设置文件的ACL(访问控制列表)
语法: setfacl [-bkndRLP] { -m|-M|-x|-X ... } file ...
选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22-m, --modify=acl 更改文件的访问控制列表 -M, --modify-file=file 从文件读取访问控制列表条目更改 -x, --remove=acl 根据文件中访问控制列表移除条目 -X, --remove-file=file 从文件读取访问控制列表条目并删除 -b, --remove-all 删除所有扩展访问控制列表条目 -k, --remove-default 移除默认访问控制列表 --set=acl 设定替换当前的文件访问控制列表 --set-file=file 从文件中读取访问控制列表条目设定 --mask 重新计算有效权限掩码 -n, --no-mask 不重新计算有效权限掩码 -d, --default 应用到默认访问控制列表的操作 -R, --recursive 递归操作子目录 -L, --logical 依照系统逻辑,跟随符号链接 -P, --physical 依照自然逻辑,不跟随符号链接 --restore=file 恢复访问控制列表,和“getfacl -R”作用相反 --test 测试模式,并不真正修改访问控制列表属性 -v, --version 显示版本并退出 -h, --help 显示本帮助信息
getfacl 查看文件的ACL(访问控制列表)
语法: getfacl [-aceEsRLPtpndvh] 文件 ...
选项:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31-a, --access 仅显示文件访问控制列表 -d, --default 仅显示默认的访问控制列表 -c, --omit-header 不显示注释表头 -e, --all-effective 显示所有的有效权限 -E, --no-effective 显示无效权限 -s, --skip-base 跳过只有基条目(base entries)的文件 -R, --recursive 递归显示子目录 -L, --logical 逻辑遍历(跟随符号链接) -P, --physical 物理遍历(不跟随符号链接) -t, --tabular 使用制表符分隔的输出格式 -n, --numeric 显示数字的用户/组标识 -p, --absolute-names 不去除路径前的 '/' 符号 -v, --version 显示版本并退出 -h, --help 显示本帮助信息
最后
以上就是默默蜻蜓最近收集整理的关于linux命令-文件目录管理的全部内容,更多相关linux命令-文件目录管理内容请搜索靠谱客的其他文章。
发表评论 取消回复