linux极简小知识:42、linux中的目录和文件管理,mkdir、rmdir、rm、mv、cp、touch等命令

618 阅读3分钟

这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

本篇是 linux极简小知识 系列的第42篇,介绍真实有用的linux知识,欢迎阅读查看!

本篇主要介绍如何对目录和文件进行管理,包括对目录或文件进行创建、删除、移动等操作,涉及mkdir、rmdir、rm、mv、cp、touch等命令及实际使用!

创建目录 —— mkdir

mkdir 即 make directory 的缩写。

创建新目录

mkdir 后面可以同时创建多个目录。

  • 指定绝对路径

在根目录下创建目录 dir_test

$ sudo mkdir /dir_test
  • 相对路径

当前目录下创建 dir_test

$ mkdir dir_test
  • 创建多个目录
$ mkdir a b c
$ ls
a  axel-2.4-9.el7.x86_64.rpm  b  c  dir_test  test  Y6kkd1d

一次创建多个目录的其他的方法:mkdir a/{l,m,n}

目录存在时

提示无法创建,目录存在!

$ mkdir a
mkdir: cannot create directory ‘a’: File exists

-p 选项创建多级目录

-p--parents 简写。

默认 mkdir 只能在已存在的目录下创建新目录,如果创建多级目录时,父级目录不存在是无法创建的。

$ mkdir a/b/c
mkdir: cannot create directory ‘a/b/c’: No such file or directory

-p 参数可以实现连续创建多级目录:

$ mkdir -p  a/b/c
$ ls -R a
a:
b

a/b:
c

a/b/c:

-m 选项指定目录权限

创建755权限的目录。

mkdir -m755 dir_test2

删除目录 —— rmdir

rmdir 即 remove directory 的缩写。

删除目录

$ rmdir c

-p 删除多级目录

-p 参数用于删除多级目录,必须保证各级目录都为空,否则会删除失败。

$ rmdir -p a/b/c/

该命令等同于 rmdir a/b/c rmdir /a/b rmdir /a

删除不存在的目录会提示不存在

$ rmdir c
rmdir: failed to remove ‘c’: No such file or directory

无法删除非目录的文件

如果删除文件,将会提示不是目录 Not a directory

$ rmdir a.txt
rmdir: failed to remove ‘a.txt’: Not a directory

删除命令 —— rm

默认 rmdir 只能删除空目录,即目录内必须为空,如果存在其他目录(即使是空目录)或文件,也会删除失败。

$ rmdir a
rmdir: failed to remove ‘a’: Directory not empty

所以在实际中删除目录一般都是使用 rm 命令。还可以用以删除普通文件等其他类型的文件!

-r 选项删除多级或多个目录

删除包含多个子级目录的a目录。

$ rm -r a

删除文件

$ ls
a.txt  axel-2.4-9.el7.x86_64.rpm  b  dir_test  dir_test2  test  Y6kkd1d
$ rm a.txt
$ ls
axel-2.4-9.el7.x86_64.rpm  b  dir_test  dir_test2  test  Y6kkd1d

-f 强制删除

-f 用于强制删除文件或目录。

rm -rf 的谨慎使用

rm -rf 用于递归低强制删除所有目录和文件,一定要慎重使用,避免造成不可挽回的数据丢失!

创建普通文件 —— touch

touch 命令用于创建普通的文本文件。

$ touch a.txt
$ ls
a.txt  axel-2.4-9.el7.x86_64.rpm  b  dir_test  dir_test2  test  Y6kkd1d

复制命令 —— cp

复制文件

a.txt 复制到 test/my 目录。

$ cp a.txt test/my
$ ls -l test/my
total 0
-rw-rw-r-- 1 root_test root_test 0 Nov  1 11:51 a.txt

-r 复制目录

如果要复制目录,需要使用 -r 选项。

$ cp -r b a/b/c/
$ ls -al a/b/c/
total 12
drwxrwxr-x 3 root_test root_test 4096 Nov  1 11:57 .
drwxrwxr-x 3 root_test root_test 4096 Nov  1 11:55 ..
drwxrwxr-x 2 root_test root_test 4096 Nov  1 11:57 b

不使用 -r 时:

$ cp b a/b/c/
cp: omitting directory ‘b’
$ cp b/ a/b/c/
cp: omitting directory ‘b/’

-v 显示复制过程

$ cp -v a.txt b/
‘a.txt’ -> ‘b/a.txt’

-p 保留文件的权限、所属用户和最后的修改时间

保持文件的模式、属主和最后修改时间不变

cp -p 等同于 --preserve=mode,ownership,timestamps,man帮助命令中的解释:-p same as --preserve=mode,ownership,timestamps

默认使用 cp 复制,会修改文件的权限、属主、最后修改时间等多个文件属性。

如下复制 a.txt:

$ ls -l a.txt
-rw-rw-r-- 1 root_test1 root_test 0 Nov  1 11:50 a.txt
$ cp a.txt a/b/c/
$ ls -l a/b/c/
total 4
-rw-rw-r-- 1 root_test root_test    0 Nov  1 12:00 a.txt
drwxrwxr-x 2 root_test root_test 4096 Nov  1 11:57 b

普通用户只能保持时间不变

如下,可以看到复制过去后,最后修改时间仍为 11:50

$ cp -p a.txt a/b/c/
$ ls -l a/b/c/
total 4
-rw-rw-r-- 1 root_test root_test    0 Nov  1 11:50 a.txt
drwxrwxr-x 2 root_test root_test 4096 Nov  1 11:57 b

root或root权限用户使用

因为保持权限、属主不变,是需要root权限的,因此,想要使用 cp -p 做到保持不变,也需要root权限,或者root用户操作。

  • 使用 sudo cp -p 示例:
$ ls -l b/a.txt
-rw-rw-r-- 1 root_test1 root_test 0 Nov  1 15:49 a.txt
$ sudo cp -p a.txt b/
$ ls -l b/a.txt
-rw-rw-r-- 1 root_test1 root_test 0 Nov  1 15:49 b/a.txt
  • 只使用root或root权限执行cp操作,属主、所属用户组都会变为root,并且权限、修改日期等都会变化
$ rm b/a.txt
$ sudo cp a.txt b/
$ ls -l b/a.txt
-rw-r--r-- 1 root root 0 Nov  1 18:02 b/a.txt
  • 对比只使用 cp 操作的结果,属主已经变成当前登录的用户 root_test。
$ rm b/a.txt
$ cp a.txt b/
$ ls -l b/a.txt
-rw-rw-r-- 1 root_test root_test 0 Nov  1 18:05 b/a.txt

思考

最开始自己测试时,是在普通用户下使用非 sudo 权限命令执行的cp,测试结果一直是“最后修改时间”保持不变。

查找资料都是使用 -p-a 实现保留文件属性不变,一段怀疑出现了什么问题???!!!

后面突然想到修改文件所属者需要root权限才行,那么,保持属主不变是否也要对应的root权限才可以。一测试果然是这样。怪自己一开始没想到。。。

要反思,有些文件属性是需要root权限才能修改的!

-a 保留原文件所有信息(属性)不变

-a 的含义为:-a, --archive same as -dR --preserve=all

记得 sudo 权限提升!

$ sudo cp -a a.txt b/

保持文件属性不变的参数为 --preserve,比如保持文件所有信息不变:--preserve=all

移动文件和重命名 —— mv

mv 命令用于移动文件或目录。同时还用于重命名文件(移动到一个新的文件名)。

移动的目标(目录或文件夹)如果不存在,将创建!

移动文件

  • 移动文件到目录中
$ mv a.txt b/
$ ls -l b/
total 0
-rw-rw-r-- 1 root_test1 root_test 0 Nov  1 11:50 a.txt
$ ls
a  axel-2.4-9.el7.x86_64.rpm  b  dir_test  dir_test2  test  Y6kkd1d
  • 移动目录

mv a bmv a/ b/

$ mv a b
$ ls
axel-2.4-9.el7.x86_64.rpm  b  dir_test  dir_test2  test  Y6kkd1d
$ ls b/
a  a.txt
$ ls b/a/b/c/
a.txt  b/

重命名文件

给移动的目标一个新的名字即可。

  • 重命名文件
$ mv b/a.txt b/b.txt
$ ls b/
a  b.txt
  • 重命名目录

重命名目录时,目标目录必须是一个不存在的目录名。

重命名 a 目录为 b/k 目录:

$ mv a b/k
$ ls
axel-2.4-9.el7.x86_64.rpm  b  dir_test  dir_test2  test  Y6kkd1d
$ cd b/k/b/c/b/