开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15天,点击查看活动详情
Hi~ o( ̄▽ ̄)ブ,我是Young,众所周知Linux操作系统是一个非常优秀的、免费的、且具有出色的稳定性和多用户概念的操作系统。所以它当之无愧的成为了我们程序员部署代码服务的首选操作系统。由于Linux操作系统命令非常多,一下记住所有的命令是一件很头疼的事,不过我们可以分开学习。小伙伴们感兴趣的可以点击一波收藏,以后没准能派上用场,接下来我们就开始学习Linux操作系统的基础部分,用命令行的方式操作文件和目录。
目标
通过本文我们将学会Linux中常用的操作文件及目录的指令:
- mkdir:创建目录
- touch:创建文件/改变文件时间属性
- ls:显示目录下内容及相关属性
- cp:复制文件或目录
- mv:移动或重命名
- rm:删除文件或目录
- rename:重命名文件
- chown:改变文件或目录的用户和用户组
- chmod:改变文件或目录的权限
1、mkdir
mkdir(make directories)命令主要用来创建目录,默认情况下,如果要创建的目录已存在,则会提示此文件已存在,而不会继续创建目录。
语法格式如下:
mkdir [option] [directory]
mkdir [选项] [目录]
需要注意的是命令之间是需要有空格的,而且这个命令支持同时创建多个文件,命令中的option是代表可选项的意思,并非必填。
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -p | 递归创建目录,递归的意思是父目录及子目录及子目录的子目录;即使要创建的目录事先已存在也不会报错。 |
| -m | 设置新创建目录的默认权限 |
| -v | 显示创建目录的过程 |
使用示例:
1、在当前目录下创建data目录
mkdir data
2、在当前目录下创建data1目录并创建data2子目录,这里需要注意的是如果data1上级目录不存在,则data2的创建会失败。
mkdir data1/data2
3、针对上面的可以改进一下语句,加上-p的的选项。这时候如果data1上级目录不存在,系统会自动为我们创建上级目录
mkdir -p data1/data2
4、顺带看看带-v如何使用,不过我是没发现这个显示创建过程究竟有什么特殊的用法
mkdir -pv data1/data2
5、进阶,同时创建多个目录,且多个目录下有多个子目录
[root@localhost home]# mkdir -pv data/{data1_1,data1_2}/{data2_1,data2_2}
mkdir: 已创建目录 "data"
mkdir: 已创建目录 "data/data1_1"
mkdir: 已创建目录 "data/data1_1/data2_1"
mkdir: 已创建目录 "data/data1_1/data2_2"
mkdir: 已创建目录 "data/data1_2"
mkdir: 已创建目录 "data/data1_2/data2_1"
mkdir: 已创建目录 "data/data1_2/data2_2"
[root@localhost home]# tree -d data
data
├── data1_1
│ ├── data2_1
│ └── data2_2
└── data1_2
├── data2_1
└── data2_2
[root@localhost home]# mkdir -p test/dir{1..6} old/{a..e}
[root@localhost home]# tree -d test old
test
├── dir1
├── dir2
├── dir3
├── dir4
├── dir5
└── dir6
old
├── a
├── b
├── c
├── d
└── e
2、touch
touch这个命令有两个功能,一是创建新文件,二是改变已有文件时间属性。需要注意touch和mkdir的区别,touch操作的是文件,而mkdir操作的是目录。
语法格式如下:
touch [option] [file]
touch [选项] [文件]
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -a | 只修改文件最后访问时间 |
| -d STRING | 使用STRING形式的时间作为模板设置指定文件的时间属性 |
| -m | 只修改文件最后修改时间 |
| -r file | 将指定文件时间属性设置为与file文件的时间属性相同 |
| -t STAMP | 使用 [[CC]YY]MMDDhhmm[.ss] 格式设置文件的时间属性,格式含义从左到右依次为:世纪、年、月、日、时、分、秒 |
使用示例:
1、在当前目录下创建单个/多个文件
[root@localhost data2_1]# touch data.txt
[root@localhost data2_1]# touch data1.txt data2.txt
[root@localhost data2_1]# ls
data1.txt data2.txt data.txt
2、批量创建文件
[root@localhost data2_1]# touch log{01..02}
[root@localhost data2_1]# ls
log01 log02
3、修改时间属性
[root@localhost data2_1]# stat data.txt
文件:"data.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd02h/64770d Inode:749 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:home_root_t:s0
最近访问:2023-02-14 13:08:18.181584404 +0800
最近更改:2023-02-14 13:05:25.975817764 +0800
最近改动:2023-02-14 13:08:18.181584404 +0800
创建时间:-
[root@localhost data2_1]# touch -a data.txt
[root@localhost data2_1]# stat data.txt
文件:"data.txt"
大小:0 块:0 IO 块:4096 普通空文件
设备:fd02h/64770d Inode:749 硬链接:1
权限:(0644/-rw-r--r--) Uid:( 0/ root) Gid:( 0/ root)
环境:unconfined_u:object_r:home_root_t:s0
最近访问:2023-02-14 13:09:01.700778147 +0800
最近更改:2023-02-14 13:05:25.975817764 +0800
最近改动:2023-02-14 13:09:01.700778147 +0800
创建时间:-
5、指定文件时间
修改前
[root@localhost data2_1]# ls -lh data.txt
-rw-r--r--. 1 root root 0 2月 14 13:05 data.txt
修改后
[root@localhost data2_1]# touch -d 20221212 data.txt
[root@localhost data2_1]# ls -lh data.txt
-rw-r--r--. 1 root root 0 12月 12 00:00 data.txt
6、指定文件时间与目标文件时间属性相同
[root@localhost data2_1]# touch -r data1.txt data.txt
7、指定文件时间为字符串格式时间
[root@localhost data2_1]# touch -t 2022121212234.50 data.txt
3、ls
ls这个命令大家可以理解为是list的意思,就是列出目录下面的内容及属性
语法格式如下:
ls [option] [file]
ls [选项] [文件或目录] #ls后面也可以什么都不加,表示查看当前目录的文件信息
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -l | 使用长格式列出文件及目录信息 |
| -a | 列出目录下所有文件,包括”.“字符的隐藏文件 |
| -t | 根据最后修改时间排序 |
| -r | 根据反次序排序 |
| -h | 详细列出目录或文件的大小信息 |
| -S | 根据文件大小排序 |
| -R | 按递归形式列出所有子目录 |
| -c | 根据状态改变时间排序 |
| -u | 根据最后访问时间排序 |
使用示例:
1、随便进入一个目录用 ls -l 查看
[root@localhost data2_1]# ls -l
总用量 0
-rw-r--r--. 1 root root 0 2月 14 13:05 data1.txt
-rw-r--r--. 1 root root 0 2月 14 13:05 data2.txt
-rw-r--r--. 1 root root 0 12月 12 00:00 data.txt
2、进入根目录下用 ls -a 查看
[root@localhost /]# ls -a
. .. bin boot dev etc home lib lib64 logs media mnt mydata opt proc root run sbin srv sys tmp usr var
3、修改data文件后再用 ls -t 查看,就会发现排序有变化
[root@localhost data2_1]# ls -t
data1.txt data2.txt data.txt
[root@localhost data2_1]# vi data.txt
[root@localhost data2_1]# ls -t
data.txt data1.txt data2.txt
4、使用 ls -S 查看列表,根据文件大小排序
[root@localhost data2_1]# ls -S
data.txt test data1.txt data2.txt
3、cp
可以理解为copy的意思,cp命令主要用来复制文件或目录
语法格式如下:
cp [option] [source] [dest]
cp [选项] [源文件] [目标文件]
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -p | 复制时保留源文件的所有者、权限、时间等属性 |
| -d | 如果复制的源文件是符号链接,那么只是复制链接本身,保留符号链接所指的源文件或目录 |
| -r | 递归复制目录及目录下所有层级的子目录及文件 |
| -a | 等于上面的 p+d+r 功能总和 |
| -i | 覆盖已有文件前提示用户确认 |
| -t | 反向复制,格式为 ”cp -t 目标文件 源文件“ |
使用示例:
1、使用 cp i 命令
[root@localhost data2_1]# cp -i data.txt data2.txt
cp:是否覆盖"data2.txt"? y
[root@localhost data2_1]#
2、使用 cp t 命令复制目录
cp -r data2_1 data1_1/
4、mv
mv命令可以理解为英文move的意思,其功能是移动或重命名文件
语法格式如下:
mv [option] [source] [dest]
mv [选项] [源文件] [目标文件]
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -f | 若目标文件存在,则不会提示用户而是直接覆盖 |
| -i | 若目标文件存在,则会提示用户是否覆盖 |
| -n | 不覆盖已存在的文件 |
| -t | 指定mv的目标目录,适用于移动多个源文件到同一个目录下,此时目标目录在前,源文件在后 |
| -u | 在源文件比目标文件新或目标文件不存在时进行 |
使用示例:
1、使用 mv 命令,这里如果data3.txt不存在,则直接将data2.txt改名为data3.txt,若存在则直接覆盖
[root@localhost data2_1]# ls
data1.txt data2.txt data.txt test
[root@localhost data2_1]# mv data2.txt data3.txt
[root@localhost data2_1]# ls
data1.txt data3.txt data.txt test
2、移动多个文件
方式一
mv data2.txt data3.txt test/
方式二
mv -t test/ data2.txt data3.txt
3、移动目录
mv dir1 dir2 #目录dir2不存在的话,将目录dir1改为dir2
5、rm
rm命令可以理解为单词remove,意思是删除1/N个文件或目录。这个命令可是很危险的,没事别乱用哈!
语法格式如下:
rm [option] [file]
rm [选项] [文件或目录]
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -f | 强制删除,无任何提示 |
| -i | 带确认提示的删除操作 |
| -I | 删除超过三个文件以上或存在递归删除前提示用户 |
| -r | 递归删除目录和内容 |
使用示例:
1、直接使用 rm
[root@localhost data2_1]# ls
data1.txt data3.txt data.txt test
[root@localhost data2_1]# rm data3.txt
rm:是否删除普通文件 "data3.txt"?y
[root@localhost data2_1]#
2、强制删除
rm -f data.txt
3、递归删除
递归删除时会有提示
rm -r test
递归删除无提示
rm -rf test
注意:
rm命令平时使用的时候一定要特别小心,除非你特别清楚要删除的都是无用文件,否则可以尝试用mv命令先把待删除项移动到另一个区域。当作是备份,若出现问题还能随时还原。大多数情况下,数据删除后是可以恢复的(例如:使用ext3grep,感兴趣的小伙伴可以自行尝试)
6、rename
使用rename命令可以帮助我们以字符串替换的方式来批量修改文件名
语法格式如下:
rename from to file
- from:代表需要替换或处理的字符
- to:把前面的内容替换为后面的
- file 待处理的文件,支持 “*” 通配符
使用示例:
1、批量修改文件名
首先创建一批文件,他们有相同后缀为_test,然后用rename命令修改去掉这个后缀名
[root@localhost test]# touch log-2023-02-15-{01..09}_test.txt
[root@localhost test]# ls
log-2023-02-15-01_test.txt log-2023-02-15-03_test.txt log-2023-02-15-05_test.txt log-2023-02-15-07_test.txt log-2023-02-15-09_test.txt
log-2023-02-15-02_test.txt log-2023-02-15-04_test.txt log-2023-02-15-06_test.txt log-2023-02-15-08_test.txt
[root@localhost test]# rename "_test" "" *
[root@localhost test]# ls
log-2023-02-15-01.txt log-2023-02-15-03.txt log-2023-02-15-05.txt log-2023-02-15-07.txt log-2023-02-15-09.txt
log-2023-02-15-02.txt log-2023-02-15-04.txt log-2023-02-15-06.txt log-2023-02-15-08.txt
2、批量修改扩展名
[root@localhost test]# ls
log-2023-02-15-01.txt log-2023-02-15-03.txt log-2023-02-15-05.txt log-2023-02-15-07.txt log-2023-02-15-09.txt
log-2023-02-15-02.txt log-2023-02-15-04.txt log-2023-02-15-06.txt log-2023-02-15-08.txt
[root@localhost test]# rename .txt .jpg *
[root@localhost test]# ls
log-2023-02-15-01.jpg log-2023-02-15-03.jpg log-2023-02-15-05.jpg log-2023-02-15-07.jpg log-2023-02-15-09.jpg
log-2023-02-15-02.jpg log-2023-02-15-04.jpg log-2023-02-15-06.jpg log-2023-02-15-08.jpg
7、chown
使用chown命令可以帮助我们改变文件或目录的用户和用户组
语法格式如下:
chown [option] [OWNER][:[GROUP]] [file]
chown [选项] [用户: 用户组] [文件或目录]
使用示例:
1、更改文件所属用户
这里我们用root账户。创建一个文件
[root@localhost test]# touch file1.txt
[root@localhost test]# ls
file1.txt
然后切换到我新建的用户young环境下,虽然我们可以看到这个file1.txt文件,但是我们无法修改,系统会提示我们处于只读状态
[root@localhost test]# su young
[young@localhost test]$ ls
file1.txt
[young@localhost test]$ vi file1.txt
我们再切回root用户,赋予young用户权限后再切换回young用户后,就发现可以编辑这个文件了
[young@localhost test]$ su root
密码:
[root@localhost test]# ls
file1.txt
[root@localhost test]# chown young file1.txt
[root@localhost test]# su young
[young@localhost test]$ vi file1.txt
2、更改文件所属用户组属性,注意这里有一个 “.” 代表分组
形式一:xx.xx
[root@localhost test]# chown .root data2.txt
或者是这种形式: xx:xx
[root@localhost test]# chown root:root data2.txt
8、chmod
chmod命令可以帮助我们改变文件或目录权限,这个命令仅限 root用户或文件的归属用户才能执行
语法格式如下:
chmod [option] [mode] [file]
chmod [选项] [模式] [文件或目录]
常见命令的参数选项如下:
| 参数选项 | 解释说明 |
|---|---|
| -R | 递归处理指定目录及其子目录下所有文件 |
| -i | 带确认提示的删除操作 |
| -I | 删除超过三个文件以上或存在递归删除前提示用户 |
| -r | 递归删除目录和内容 |
chmod命令的格式如下
| 权限位 | 操作 | 含义 |
|---|---|---|
| r | read | 可读权限 |
| w | write | 可写权限 |
| x | execute | 可执行权限 |
| - | 无 | 无权限 |
| 备注 | 一些特殊权限位:t、T、s、S、X、x | |
| 用户类型 | 文件所属用户:u(Owner/User) 文件所属组:g(Group) | |
| 用户类型 | 其他用户:o(Other) 所有用户:a(ALL)等于u+g+o | |
| 操作字符 | +:加入 -:减去 =:设置 |
使用示例:
1、权限字母和操作符
设置指定文件所有用户权限为空
[root@localhost test]# ll -h file1.txt
-rw-r--r--. 1 young root 11 2月 15 13:40 file1.txt
[root@localhost test]# chmod a= file1.txt
[root@localhost test]# ll -h file1.txt
----------. 1 young root 11 2月 15 13:40 file1.txt
设置文件所属人执行权限
[root@localhost test]# chmod u+x file1.txt
[root@localhost test]# ll -h file1.txt
---x------. 1 young root 11 2月 15 13:40 file1.txt
设置指定文件对应的group组用户可写权限
[root@localhost test]# chmod g+w file1.txt
[root@localhost test]# ll -h file1.txt
---x-w----. 1 young root 11 2月 15 13:40 file1.txt
设置其他用户可读权限
[root@localhost test]# chmod o+r file1.txt
[root@localhost test]# ll -h file1.txt
---x-w-r--. 1 young root 11 2月 15 13:40 file1.txt
也支持多个操作一起执行
[root@localhost test]# chmod ug+r file1.txt
[root@localhost test]# ll -h file1.txt
-r-xrw-r--. 1 young root 11 2月 15 13:40 file1.txt
2、数字权限授权,是不是经常看网上有人写什么chmod 777之类的还在想为啥这么写,到这里你应该就明白了。
从上图可以看到 r对应的数字是4,w对应的权限数字是2,x对应的权限数字是1,”-”对应的权限数字是0。需要什么类型的权限,只管做加法求和就行了
效果等同于上面的 chmod a= file1.txt
[root@localhost test]# chmod 000 file1.txt
[root@localhost test]# ll -h file1.txt
----------. 1 young root 11 2月 15 13:40 file1.txt
[root@localhost test]# chmod 753 file1.txt
[root@localhost test]# ll -h file1.txt
-rwxr-x-wx. 1 young root 11 2月 15 13:40 file1.txt
使用R递归赋予权限
[root@localhost test]# chmod -R 777 file1.txt
[root@localhost test]# ll -h file1.txt
-rwxrwxrwx. 1 young root 11 2月 15 13:40 file1.txt
总结
要是有小伙伴看到这里,那么真是太感谢你了,希望写的东西能够给你的工作带来便捷。同时也希望能不惜给我一波三连!Linux是一款非常优秀的系统,不管是作为研发、测试、运维、实施等各种岗位,都有必要学会如何使用这款操作系统!