这是我参与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 b 或 mv 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/