Linux入门 之 操作文件及目录

342 阅读13分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 15天,点击查看活动详情

Hi~ o( ̄▽ ̄)ブ,我是Young,众所周知Linux操作系统是一个非常优秀的、免费的、且具有出色的稳定性和多用户概念的操作系统。所以它当之无愧的成为了我们程序员部署代码服务的首选操作系统。由于Linux操作系统命令非常多,一下记住所有的命令是一件很头疼的事,不过我们可以分开学习。小伙伴们感兴趣的可以点击一波收藏,以后没准能派上用场,接下来我们就开始学习Linux操作系统的基础部分,用命令行的方式操作文件和目录。

目标

通过本文我们将学会Linux中常用的操作文件及目录的指令:

  1. mkdir:创建目录
  2. touch:创建文件/改变文件时间属性
  3. ls:显示目录下内容及相关属性
  4. cp:复制文件或目录
  5. mv:移动或重命名
  6. rm:删除文件或目录
  7. rename:重命名文件
  8. chown:改变文件或目录的用户和用户组
  9. 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 214 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 1212 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 

image.png

我们再切回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 

image.png

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命令的格式如下

image.png

权限位操作含义
rread可读权限
wwrite可写权限
xexecute可执行权限
-无权限
备注一些特殊权限位: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 215 13:40 file1.txt
[root@localhost test]# chmod a= file1.txt 
[root@localhost test]# ll -h file1.txt 
----------. 1 young root 11 215 13:40 file1.txt

设置文件所属人执行权限
[root@localhost test]# chmod u+x file1.txt 
[root@localhost test]# ll -h file1.txt 
---x------. 1 young root 11 215 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 215 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 215 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 215 13:40 file1.txt

2、数字权限授权,是不是经常看网上有人写什么chmod 777之类的还在想为啥这么写,到这里你应该就明白了。

image.png

从上图可以看到 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是一款非常优秀的系统,不管是作为研发、测试、运维、实施等各种岗位,都有必要学会如何使用这款操作系统!