跳转至

Linux 手册 | 文件管理命令

cd 命令

在 Linux 终端中如果想要进行工作路径的切换,需要使用 cd 命令。在进行目录的切换的时候, 我们可以使用相对路径也可以使用绝对路径。

进入指定目录

Bash
$ cd 目录名
# 目录名:使用相对路径/绝对路径都可以, 该路径必须是一个有效路径

特殊的目录

.. 表示当前目录的上一级目录,使用 cd .. 或者 cd ../ 都可以;

. 表示当前目录,使用 . 或者 ./ 都可以。

进入家目录

每个用户 (普通用户和 root ) 都有一个属于自己的目录,比如:

robin 是普通用户,家目录:/home/robin

root 是管理员用户,家目录:/root

按照上边的格式来表示家目录书写起来比较麻烦,有一种相对简单的写法就是使用 ~ 表示。如果是使用 cd 命令切换到家目录,后边可以什么路径都不加,这样也可以进入到当前用户的家目录。综上所述也就是通过 cd 进入到当前用户的家目录一共有三种不同的方式。

Bash
1
2
3
$ cd                    # 方式1
$ cd ~                  # 方式2
$ cd /home/用户名        # 方式3

在临近的两个目录之间切换

如果我们要频繁的在两个路径之间切换,也有相关的快捷操作,尤其是对于比较长的路径,可以是这简直是一个福利:

Bash
1
2
3
4
# 通过cd进入到目录1:  /usr/include/c++/7.5.0/ext/pb_ds/detail/list_update_map_/
# 通过cd进入到目录2:  /home/luffy/get/onepiece/itis/a/goldfish
# 频繁在两个目录之间切换
$ cd -

ls 命令

ls 就是 list,打印指定的文件信息,如果是目录,显示对应目录中有哪些子文件。

Bash
1
2
3
$ ls [args]         # 查看当前目录
$ ls [args] 目录名     # 查看指定目录
$ ls [args] 文件名     # 查看某个文件的信息

显示所有文件

ls 添加 -a 参数(就是 all 的意思)就可以显示指定目录中是所有文件了,因为默认情况下具有隐藏属性的文件是不会显示出来的。

那么在 Linux 中什么样是文件才能被隐藏呢?很简单只需要在文件名前边加一个点( . )文件就具有隐藏属性了,例如: .demo

Bash
1
2
3
4
5
6
7
8
# 查看root家目录下所有非隐藏文件
[root@VM-8-14-centos ~]# ls
ace  luffy

# 查看root家目录下所有文件 (隐藏 + 非隐藏)
[root@VM-8-14-centos ~]# ls -a
.   ace            .bash_logout   .bashrc  .config  .lesshst  .pip  .pydistutils.cfg 
..  .bash_history  .bash_profile  .cache   .cshrc   luffy     .pki  .ssh  .viminfo

显示文件详细信息

ls 添加 -l 参数(就是 list 的意思)我们就可以看到文件的详细信息了,其中包括:文件类型,文件所有者对文件的操作权限,文件所属组用户对文件的操作权限,其他人对文件的操作权限,硬链接计数,文件所有者,文件所属组,文件大小,文件的修改日期,文件名...

Bash
# 显示文件的详细信息
robin@OS:~$ ls -l
total 204
-rw-rw-r--  1 robin robin    268 Mar 22 17:32 a.c
drwxrwxr-x  2 robin robin   4096 Aug  4  2019 config
-rw-r--r--  1 robin robin 129487 Dec 25 11:28 english.txt
drwxrwxr-x  4 robin robin   4096 Jan 15 17:48 libevent
drwxrwxr-x 17 robin robin   4096 Apr 13 22:42 Linux
drwxrwxr-x  8 robin robin   4096 Feb  5 16:57 luffy
-rw-r--r--  1 robin robin   2223 Mar  2 14:39 main.cpp
-rw-rw-r--  1 robin robin   2167 Dec  1 22:41 mysql_test.c
drwxrwxr-x  9 robin robin   4096 Mar 26 19:19 network
-rw-r--r--  1 robin robin   1406 Mar  2 20:18 occi.cpp
drwxrwxr-x  3 robin robin   4096 Oct 30 12:09 oradiag_robin
drwxrwxr-x 11 robin robin   4096 Mar 26 09:40 package
drwxrwxr-x  2 robin robin   4096 Dec 29 17:11 process
drwxrwxr-x 17 robin robin   4096 Mar 29 22:31 projects
-rw-r--r--  1 robin robin   1816 Jan  6 09:37 sidtime.c
drwxrwxr-x  2 robin robin   4096 Mar 22 11:31 socket
-rw-r--r--  1 robin robin    583 Oct 18 17:21 test.c
-rw-r--r--  1 robin robin   2015 Mar  1 17:05 test.cpp
-rw-rw-r--  1 robin robin   2218 Dec  2 17:02 test_mysql.c
drwxrwxr-x  5 robin robin   4096 Jan 13 17:35 udp

# 文件详细信息介绍
 d      rwx       rwx     r-x     5    robin    robin    4096    Jan 13 17:35    udp
 |       |         |       |      |      |        |       |          |            |
文件    文件所    文件所   其他人 硬链接  文件     文件   文件大小  文件修改时间     文件名
类型   有者权限  属组权限  权限   计数   所有者   所属组    

简单写法 ( ll )

在查看文件详细信息的时候,还有一种简单的写法,可以使用 ll 命令:有些版本的 Linux 中等价于 ls -l;有些版本的 Linux 中等价于 ls -laF

文件类型

在 Linux 操作系统中,一共有 7 种文件类型,这 7 种类型是根据文件属性进行划分的,而不是根据文件后缀划分的。

  • - : 普通的文件, 在 Linux 终端中没有执行权限的为白色, 压缩包为红色, 可执行程序为绿色字体;
  • d : 目录 (directory), 在 Linux 终端中为蓝色字体, 如果目录的所有权限都是开放的, 有绿色的背景色;
  • l : 软链接文件 (link), 相当于 Windows 中的快捷方式, 在 Linux 终端中为淡蓝色 (青色) 字体;
  • c : 字符设备 (char), 在 Linux 终端中为黄色字体;
  • b : 块设备 (block), 在 Linux 终端中为黄色字体;
  • p : 管道文件 (pipe), 在 Linux 终端中为棕黄色字体;
  • s : 本地套接字文件 (socket), 在 Linux 终端中为粉色字体。

用户类型

在 Linux 中有三大类用户: 文件所有者, 文件所属组用户, 其他人, 我们可以对同一个文件给这三种人设置不同的操作权限, 用于限制用户对文件的访问。

  • 文件所有者
    • Linux 中的所有的文件都有一个所有者, 就是文件的主人
  • 文件所属组
    • 文件的主人属于哪个组, 这个文件默认也就属于哪个组
    • 用户组中可以有多个用户, 这些组中的其他用户和所有者的权限可以是不一样的
  • 其他人
    • 这个用户既不是文件所有者也不是文件所属组中的用户,就称之为其他人
    • 其他人对文件也可以拥有某些权限

文件权限

Linux 中不同的用户可以对文件拥有不同的操作权限, 权限一共有四种: 读权限, 写权限, 执行权限, 无权限。

  • 读权限:使用 r 表示, 即: read
  • 写权限:使用 w 表示, 即: write
  • 执行权限:使用 x 表示, 即: excute
  • 没有任何权限:使用 - 表示
Bash
1
2
3
4
   -           rwx          rw-          r--  1 robin robin   2218 Dec  2 17:02 app
   |            |            |            |
文件类型      文件所有      文件所属     其他人权限
             者权限        组权限

从上边的例子中可以看出:

  • 文件所有者对文件有读、写、执行权限;
  • 文件所属组用户对文件有 读、写权限, 没有执行权限;
  • 其他人对文件有 读权限, 没有写、执行权限。

硬链接计数

硬链接计数是一个整数,如果这个数为N (N>=1),就说明在一个或者多个目录下一共有 N 个文件, 但是这 N 个文件并不占用多块磁盘空间, 他们使用的是同一块, 如果通过其中一个文件修改了磁盘数据, 那么其他文件中的内容也就变了。每当我们给磁盘文件创建一个硬链接(使用 ln ),磁盘上就会出现一个新的文件名,硬链接计数加 1 ,但是这新文件并不占用任何的磁盘空间,文件名还是映射到原来的磁盘地址上。

下图中为大家展示了给文件创建硬链接, 和直接进行文件拷贝的区别, 创建硬链接只是多了一个新的文件名, 拷贝文件不仅多了新的文件名在磁盘上数据也进行了拷贝:

其他属性

关于 ls -l 得到的其他属性相对比较简单, 最后再给大家介绍一下:

  • 文件大小 —> 单位是字节
    • 如果文件是目录显示为 4096, 这是目录自身大小, 不包括目录中的文件大小
  • 文件日期: 显示的是文件的修改日期, 只要文件被更新, 日期也会随之变化
  • 文件名: 文件自己的名字(没啥可解释的)
    • 如果文件类型是软连接会这样显示: link -> /root/file/test, 后边的路径表示快捷方式链接的是哪个磁盘文件

其他参数

单位显示

在查看文件大小的时候, 如果文件比较大对应的数组自然也就很大, 我们还需要基于字节进行相关的换算, 不能直观得到我们想要的结果, 如果数学不好, 我们可以使用一个参数 -h (human)。

Bash
1
2
3
4
5
6
7
# 直接查看文件大小
[root@VM-8-14-centos ~]# ls -l ipc.tar.gz 
-rw-r--r-- 1 root root 122962 Apr 25  2020 ipc.tar.gz

# 添加 -h 参数查看文件大小
[root@VM-8-14-centos ~]# ls -lh ipc.tar.gz 
-rw-r--r-- 1 root root 121K Apr 25  2020 ipc.tar.gz

显示目录后缀

在查看文件信息的时候, 处理通过文件类型区分该文件是不是一个目录之外, 还可以通过一个参数 -F 在目录名后边显示一个 /, 这样就可以直接区分出来了。

Bash
# 直接查看文件信息
[root@VM-8-14-centos ~/file]# ls -l
total 8
drwxr-xr-x 2 root root 4096 Jan 25 14:29 dir
-rw-r--r-- 1 root root    0 Jan 25 14:49 haha.tar.gz
-rwxrwxrwx 1 root root    0 Jan 25 14:49 hello
lrwxrwxrwx 1 root root   15 Jan 25 14:30 link -> /root/file/test
prw-r--r-- 1 root root    0 Jan 25 14:24 pipe-2
drwxrwxrwx 2 root root 4096 Jan 25 15:20 subdir
-rw-r--r-- 1 root root    0 Jan 25 14:23 test

# 添加了 -F 参数查看文件信息
[root@VM-8-14-centos ~/file]# ls -lF
total 8
drwxr-xr-x 2 root root 4096 Jan 25 14:29 dir/
-rw-r--r-- 1 root root    0 Jan 25 14:49 haha.tar.gz
-rwxrwxrwx 1 root root    0 Jan 25 14:49 hello*
lrwxrwxrwx 1 root root   15 Jan 25 14:30 link -> /root/file/test
prw-r--r-- 1 root root    0 Jan 25 14:24 pipe-2|
drwxrwxrwx 2 root root 4096 Jan 25 15:20 subdir/
-rw-r--r-- 1 root root    0 Jan 25 14:23 test

创建/删除目录

创建目录

目录的创建分为两种, 一种是创建单个目录, 另一种是一次性创建多层目录, 使用的命令是 mkdir, 后边参数是要创建的目录的名字, 如果是多层目录需要添加参数 -p

关于创建的目录所在的路径可以是相对路径, 也可以是绝对路径。

Bash
1
2
3
4
5
# 单层目录
$ mkdir 新目录的名字

# 多层目录, 需要加参数 -p
$ mkdir parent/child/baby1/baby2 -p

删除目录

如果要删除已经存在的路径一共有两种方式, 可以使用 rmdir 或者 rm

  • rmdir: 只能删除空目录,有点low,不好用。
  • rm: 可以删除文件也可以删除目录, 如果删除的的是目录, 需要加参数 -r, 意思是递归 (recursion)。
  • rm 命令还有另外两个经常使用的参数:
    • -i: 删除的时候给提示;
    • -f: 强制删除文件, 没有提示直接删除并且不能恢复, 慎用。

cp 命令

cp 就是 copy , 拷贝, 使用这个命令可以拷贝文件也可以拷贝目录。

拷贝文件 => 文件不存在得到新文件, 文件存在就覆盖:

Bash
1
2
3
4
5
6
7
# `语法: cp 要拷贝的文件  得到的文件`

# `场景1: 文件A, 将A拷贝一份得到文件B`
$ cp 文件A 文件B

# `场景2: 文件A存在的, 文件B也是存在的, 执行下边的拷贝 ==> 文件A覆盖文件B`
$ cp 文件A 文件B

拷贝目录 ==> 目录不存在得到新目录, 该目录被拷贝到存在的目录中:

Bash
# 拷贝目录需要参数 -r
# 场景1: 目录A, 通过拷贝得到不存在的目录B
$ cp 目录A 目录B -r

# 场景2: 目录A存在的, 目录B也是存在的, 执行下边的拷贝 ==> 目录A会被拷贝并将其放到目录B中
$ cp 目录A 目录B -r

# 场景3: 把A目录里的某一个或者多个文件拷贝到B目录中
$ cp A/a.txt B  # 拷贝 A目录中的 a.txt 到目录B中
$ cp A/* B -r   # 拷贝 A目录中的所有文件到目录B中, 不能确定A目录中是否有子目录, 因此需要加 -r

mv 命令

mv 就是 move , 这个 Linux 命令既能移动文件所在目录也可以给文件改名:

文件移动
1
2
3
4
# 语法: mv 要移动的文件  目录
# 有一个文件A, 移动到目录B中
# 其中A可以是文件也可以是目录, B必须是目录而且必须是存在的
$ mv A B
文件改名
1
2
3
# 语法: mv 要改名的文件  新名字(原来是不存在的,这点很重要)
# 其中A可以是文件也可以是目录,并且是存在的, B原来是不存在的
$ mv A B
文件覆盖
1
2
3
4
# 语法: mv 存在文件A  存在的文件B
# 其中A是文件(非目录)并且是存在的, B也是一个文件(非目录)并且也存在
# A文件中的内容覆盖B文件中的内容, A文件被删除, 只剩下B文件
$ mv A B

查看文件内容

如果想要查看文件内容方式有很多, 最常用的是 vim , 下面介绍一下 vim 以外的一些的一些方式:

cat

该命令可以将文件内容显示到终端, 由于终端是有缓存的, 因此能显示的字节数也是受限制的。 如果文件太大数据就不能完全显示出来了,因此该命令适合查看比较小的文件内容。

Bash
$ cat 文件名

more

该命令比 cat 要高级一点, 我们可以以翻屏的方式查看文件中的内容,使用方式如下:

Bash
1
2
3
4
5
6
$ more 文件名
# 快捷键
- 回车: 显示下一行
- 空格: 向下滚动一屏
- b: 返回上一屏
- q: 退出more

less

该命令和 more 命令差不多, 我们可以以翻屏的方式查看文件中的内容,使用方式如下:

Bash
1
2
3
4
5
6
7
$ less 文件名
# 快捷键
- b: 向上翻页
- 空格: 向后翻页
- 回车: 显示下一行
- 上下键: 上下滚动
- q:退出

链接的创建

链接分两种类型: 软连接和硬链接。软连接相当于 Windows 中的快捷方式,硬链接前边也已经介绍过了文件并不会进行拷贝,只是多出一个新的文件名并且硬链接计数会加 1 。

软链接
# 语法: ln -s 源文件路径 软链接文件的名字(可以带路径)

# 查看目录文件
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:27 get
-rw-r--r-- 1 root root   37 Jan 25 17:26 onepiece.txt

# 给 onepiece.txt 创建软连接, 放到子目录 get 中
[root@VM-8-14-centos ~/luffy]# ln -s /root/luffy/onepiece.txt get/link.lnk  
[root@VM-8-14-centos ~/luffy]# ll get
total 4
lrwxrwxrwx 1 root root   24 Jan 25 17:27 link.lnk -> /root/luffy/onepiece.txt
drwxr-xr-x 2 root root 4096 Jan 24 21:37 onepiece

注意

在创建软链接的时候, 命令中的 源文件路径建议使用绝对路径, 这样才能保证创建出的软链接文件在任意目录中移动都可以访问到链接的那个源文件。

硬链接
# 语法: ln 源文件 硬链接文件的名字(可以带路径)

# 创建硬链接文件, 放到子目录中
[root@VM-8-14-centos ~/luffy]# ln onepiece.txt get/link.txt

# 查看链接文件和硬链接计数, 从 1 --> 2
[root@VM-8-14-centos ~/luffy]# ll get
total 8
lrwxrwxrwx 1 root root   24 Jan 25 17:27 link.lnk -> /root/luffy/onepiece.txt
-rw-r--r-- 2 root root   37 Jan 25 17:26 link.txt
drwxr-xr-x 2 root root 4096 Jan 24 21:37 onepiece

Tip

硬链接和软链接不同, 它是通过文件名直接找对应的硬盘地址, 而不是基于路径, 因此 源文件使用相对路径即可, 无需为其制定绝对路径。 目录是不允许创建硬链接的!

文件属性

文件属性相关的命令主要是修改用户对文件的操作权限, 文件所有者, 文件所属组的相关信息。

修改文件文件权限

文件权限是针对文件所有者, 文件所属组用户, 其他人这三类人而言的, 对应的操作指令是 chmod。设置方式也有两种,分别为文字设定法和数字设定法。

文字设定法是通过一些关键字 r , w , x , - 来描述用户对文件的操作权限。

数字设定法是通过一些数字 0, 1, 2, 4, 5, 6, 7 来描述用户对文件的操作权限。

文字设定法
#chmod
# 语法格式: chmod who [+|-|=] mod 文件名
    - who:
        - u: user  -> 文件所有者
        - g: group -> 文件所属组用户
        - o: other -> 其他
        - a: all, 以上是三类人 u+g+o
    - 对权限的操作:
        +: 添加权限
        -: 去除权限
        =: 权限的覆盖
    - mod: 权限
        r: read,         w: write,         x: execute, 执行
        -: 没有权限

# 将文件所有者权限设置为读和执行, 也就是权限覆盖
robin@OS:~/Linux$ chmod u=rx b.txt 
robin@OS:~/Linux$ ll b.txt         
-r-xrw-r-- 2 robin robin 2929 Apr 14 18:53 b.txt*

# 给其他人添加写和执行权限
robin@OS:~/Linux$ chmod o+wx b.txt 
robin@OS:~/Linux$ ll b.txt         
-r-xrw-rwx 2 robin robin 2929 Apr 14 18:53 b.txt*

# 给文件所属组用户去掉读和执行权限
robin@OS:~/Linux$ chmod g-rx b.txt 
robin@OS:~/Linux$ ll b.txt         
-r-x-w-rwx 2 robin robin 2929 Apr 14 18:53 b.txt*

# 将文件所有者,文件所属组用户,其他人权限设置为读+写+执行
robin@OS:~/Linux$ chmod a=rwx b.txt
robin@OS:~/Linux$ ll b.txt 
-rwxrwxrwx 2 robin robin 2929 Apr 14 18:53 b.txt*
数字设定法
# 语法格式: chmod [+|-|=] mod 文件名
    - 对权限的操作:
        +: 添加权限
        -: 去除权限
        =: 权限的覆盖, 等号可以不写
    - mod: 权限描述, 所有权限都放开是 7
        - 4: read, r
        - 2: write, w
        - 1: execute , x
        - 0: 没有权限

# 分解: chmod 0567 a.txt

    0           5           6             7
  八进制     文件所有者  文件所属组用户    其他人
              r + x       r + w         r+w+x

######################### 举例 #########################
# 查看文件 c.txt 的权限               
robin@OS:~/Linux$ ll c.txt 
-rwxrwxrwx 2 robin robin 2929 Apr 14 18:53 c.txt*

# 文件所有者去掉执行权限, 所属组用户去掉写权限, 其他人去掉读+写权限
robin@OS:~/Linux$ chmod -123 c.txt
robin@OS:~/Linux$ ll c.txt 
-rw-r-xr-- 2 robin robin 2929 Apr 14 18:53 c.txt*

# 文件所有者添加执行权限, 所属组用户和其他人权限不变
robin@OS:~/Linux$ chmod +100 c.txt
robin@OS:~/Linux$ ll c.txt 
-rwxr-xr-- 2 robin robin 2929 Apr 14 18:53 c.txt*

# 将文件所有者,文件所属组用户,其他人权限设置为读+写, 没有执行权限
robin@OS:~/Linux$ chmod 666 c.txt
robin@OS:~/Linux$ ll c.txt 
-rw-rw-rw- 2 robin robin 2929 Apr 14 18:53 c.txt

修改文件所有者

默认情况下, 文件是通过哪个用户创建出来的, 就属于哪个用户, 这个用户属于哪个组, 文件就属于哪个组。如果有特殊需求,可以修改文件所有者,对应的操作命令是 chown 。因为修改文件所有者就跨用户操作, 普通用户没有这个权限, 需要借助管理员权限才能完成该操作。

普通用户借助管理员权限执行某些 shell 命令, 需要在命令前加关键字 sudo , 但是普通用户默认是没有使用 sudo 的资格的, 需要修改 /etc/sudoers 文件 。

Bash
# 语法1-只修改所有者: 
$ sudo chown 新的所有者 文件名

# 语法2-同时修改所有者和所属组: 
$ sudo chown 新的所有者:新的组名 文件名

# 查看文件所有者:b.txt 属于 robin 用户
robin@OS:~/Linux$ ll b.txt 
-rw-rw-rw- 2 robin robin 2929 Apr 14 18:53 b.txt

# 将 b.txt 的所有者修改为 luffy
robin@OS:~/Linux$ sudo chown luffy b.txt
[sudo] password for robin: 
robin@OS:~/Linux$ ll b.txt 
-rw-rw-rw- 2 luffy robin 2929 Apr 14 18:53 b.txt

# 修改文件所有者和文件所属组
# 查看文件所有者和所属组
robin@OS:~/Linux$ ll b.txt 
-rw-rw-rw- 2 luffy robin 2929 Apr 14 18:53 b.txt

# 同时修改文件所有者和文件所属组
robin@OS:~/Linux$ sudo chown robin:luffy b.txt 
robin@OS:~/Linux$ ll b.txt 
-rw-rw-rw- 2 robin luffy 2929 Apr 14 18:53 b.txt

修改文件所属组

普通用户没有修改文件所属组的权限, 如果需要修改需要借助管理员权限才能完成,需要使用的命令是 chgrp。当然了这个属性的修改也可以使用 chown 命令来完成。

Bash
# 只修改文件所属的组, 普通用户没有这个权限, 借助管理员的权限
# 语法: sudo chgrp 新的组 文件名

# 查看文件所属组信息
robin@OS:~/Linux$ ll b.txt 
-rw-rw-rw- 2 robin luffy 2929 Apr 14 18:53 b.txt

# 修改文件所属的组
robin@OS:~/Linux$ sudo chgrp robin b.txt 
robin@OS:~/Linux$ ll b.txt 
-rw-rw-rw- 2 robin robin 2929 Apr 14 18:53 b.txt

其他命令

tree 命令

该命令的作用是以树状结构显示目录, tree 工具默认是没有的, 需要手动安装, 系统版本不同安装方式也不尽相同:

Bash
1
2
3
4
# ubuntu:
sudo apt install tree
# centos:
sudo yum install tree

如果是基于管理员用户安装软件,不需要加sudo。该命令有一个常用参数 -L (layer) 显示目录的层数。

Bash
# 语法格式
$ tree [-L n]         # 查看当前目录的结构, n为显示的目录层数
$ tree 目录名  [-L n]  # 查看指定目录的结构, n为显示的目录层数

# 只显示1层
[root@VM-8-14-centos ~]# tree -L 1
.
|-- ace
|-- file
|-- ipc.tar.gz
|-- link.lnk -> /root/luffy/onepiece.txt
`-- luffy

# 显示2层目录
[root@VM-8-14-centos ~]# tree -L 2
.
|-- ace
|   `-- brother
|-- file
|   |-- dir
|   |-- haha.tar.gz
|   |-- hello
|   |-- link -> /root/file/test
|   |-- pipe-2
|   |-- subdir
|   `-- test
|-- ipc.tar.gz
|-- link.lnk -> /root/luffy/onepiece.txt
`-- luffy
    |-- get
    `-- onepiece.txt

pwd 命令

pwd 命令用户当前所在的工作目录, 没有参数, 直接执行该命令即可:

Bash
1
2
3
# 查看当前用户在哪个目录中, 所在的目录一般称之为工作目录
[root@VM-8-14-centos ~/luffy/get/onepiece]# pwd
/root/luffy/get/onepiece        # 当前工作目录

touch 命令

使用touch命令可以创建一个新的空文件, 如果指定的文件是已存在的, 只会更新文件的修改日期, 对内容没有任何影响。

Bash
# 语法: touch 文件名

# 查看目录信息
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:38 get
-rw-r--r-- 2 root root   37 Jan 25 17:26 onepiece.txt

# 创建一个新的文件 robin.txt
[root@VM-8-14-centos ~/luffy]# touch robin.txt

# 再次查看目录中的文件信息, 发现 robin.txt是空的, 大小为 0
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:38 get
-rw-r--r-- 2 root root   37 Jan 25 17:26 onepiece.txt
-rw-r--r-- 1 root root    0 Jan 25 17:54 robin.txt

# touch 后的参数指定一个已经存在的文件名
[root@VM-8-14-centos ~/luffy]# touch onepiece.txt 

# 继续查看目录中的文件信息, 发现文件时间被更新了: 37 Jan 25 17:26 --> 37 Jan 25 17:54
[root@VM-8-14-centos ~/luffy]# ll
total 8
drwxr-xr-x 3 root root 4096 Jan 25 17:38 get
-rw-r--r-- 2 root root   37 Jan 25 17:54 onepiece.txt
-rw-r--r-- 1 root root    0 Jan 25 17:54 robin.txt

which 命令

which 命令可以查看要执行的命令所在的实际路径, 命令解析器工作的时候也会搜索这个目录。需要注意的是该命令只能查看非内建的 shell 指令所在的实际路径, 有些命令是直接写到内核中的, 无法查看。

我们使用的大部分 shell 命令都是放在系统的 /bin 或者 /usr/bin 目录下:

Bash
# 由于使用的Linux版本不同, 得到的路径也会有不同
[root@VM-8-14-centos ~]# which ls
alias ls='ls --color=auto'
        /usr/bin/ls

[root@VM-8-14-centos ~]# which date
/usr/bin/date

[root@VM-8-14-centos ~]# which cp
alias cp='cp -i'
        /usr/bin/cp

[root@VM-8-14-centos ~]# which mv
alias mv='mv -i'
        /usr/bin/mv

[root@VM-8-14-centos ~]# which pwd
/usr/bin/pwd

重定向命令

关于重定向使用最多的是就是输出重定向, 顾名思义就是修改输出的数据的位置, 通过重定向操作我们可以非常方便的进行文件的复制, 或者文件内容的追加。输出重定向使用的不是某个关键字而是符号 > 或者 >>

>: 将文件内容写入到指定文件中, 如果文件中已有数据, 则会使用新数据覆盖原数据; >>: 将输出的内容追加到指定的文件尾部。

Bash
# 输出的重定向举例: printf默认是要将数据打印到终端, 可以修改默认的输出位置 => 重定向到某个文件中
# 关键字 >
# 执行一个shell指令, 获得一个输出, 这个输出默认显示到终端, 如果要将其保存到文件中, 就可以使用重定向
# 如果当前目录下test.txt不存在, 会被创建, 如果存在, 内容被覆盖
$ date > test.txt
# 日期信息被写入到文件 test.txt中
robin@OS:~/Linux$ cat test.txt 
Wed Apr 15 09:37:52 CST 2020

# 如果不希望文件被覆盖, 而是追加, 需要使用 >>
in@OS:~/Linux$ date >> test.txt
# 日期信息被追加到 test.txt中
robin@OS:~/Linux$ cat test.txt 
Wed Apr 15 09:37:52 CST 2020
Wed Apr 15 09:38:44 CST 2020

# 继续追加信息
robin@OS:~/Linux$ date >> test.txt
robin@OS:~/Linux$ cat test.txt    
Wed Apr 15 09:37:52 CST 2020
Wed Apr 15 09:38:44 CST 2020
Wed Apr 15 09:39:03 CST 2020