登录进一个操作系统以后,第一件要做的事通常是浏览目录和文件。此处,我们就从文件管理开始梳理入门命令集。
关于文件操作的命令集非常丰富,尤其是与读写相关的,我们将分为两篇来梳理。本篇是基本操作,下一篇是文件的分析和归档等操作(用命令分析文件中的内容是 Linux 文件操作的一个利器)。
【注:此处命令集之间先后依赖关系不强,可从目录跳到需要的操作命令进行实验】
文件管理命令集
1. 浏览目录
1.1 切换工作目录
1.1.1 切换到指定目录下
cd ${某个目录名}
cy@cy-trip:~/Documents$ cd Linux_trip
cy@cy-trip:~/Documents/Linux_trip$
复制代码
注: 如果不指定目录名,则切换到 ${HOME}下面,就是当前登录账户的主目录。
1.1.2 切换到之前离开的目录
cd -
cy@cy-trip:~/Documents/Linux_trip$ cd -
/home/cy/Documents
cy@cy-trip:~/Documents$
cy@cy-trip:~/Documents$ cd -
/home/cy/Documents/Linux_trip
cy@cy-trip:~/Documents/Linux_trip$
复制代码
从哪来就到哪去,即上次切换过来的目录,反复运行"cd -"就是来回切换工作目录。
1.1.3 切换到用户主目录
cd ~
cy@cy-trip:~/Documents/Linux_trip$ cd ~
cy@cy-trip:~$ pwd
/home/cy
复制代码
切换到用户主目录,等同于"cd ${HOME}"和"cd"。
1.2 创建目录
mkdir ${目录名}
cy@cy-trip:~/Documents/Linux_trip$ mkdir garden
复制代码
mkdir -p ${目录名}
cy@cy-trip:~/Documents/Linux_trip$ mkdir -p garden/trees
复制代码
(parent)可以创建多级目录(如 dir_a/dir_aa),即使目录已经存在也不会报错。
1.3 删除目录
rmdir ${目录名}
# rmdir只能删除空目录
cy@cy-trip:~/Documents/Linux_trip$ rmdir garden
rmdir: failed to remove 'garden': Directory not empty
cy@cy-trip:~/Documents/Linux_trip$ mkdir empty_garden
cy@cy-trip:~/Documents/Linux_trip$ rmdir empty_garden
# 删除trees和他的父目录,但是父目录不为空,所以报错
cy@cy-trip:~/Documents/Linux_trip$ rmdir -p garden/trees
rmdir: failed to remove directory 'garden': Directory not empty
# 上次操作已经删除
cy@cy-trip:~/Documents/Linux_trip$ rmdir garden/trees
rmdir: failed to remove 'garden/trees': No such file or directory
# 父目录garden里面有其他文件
cy@cy-trip:~/Documents/Linux_trip$ ls garden
dir_a dir_b file_list.txt
复制代码
只有目录为空(即不存在任何文件或者目录)时才可以运行成功。否则会报错"Directory not empty"。
1.4 打印当前工作路径
pwd
cy@cy-trip:~/Documents/Linux_trip$ pwd
/home/cy/Documents/Linux_trip
复制代码
2. 查看文件
2.1 列显文件
2.1.1 显示最近修改过的文件的详细信息
ls -lrt
# 文件名左边显示的是该文件的修改时间,最近的修改的在最下面显示
cy@cy-trip:~/Documents/Linux_trip$ ls -lrt
total 12
drwxrwxr-x 4 cy cy 4096 Feb 17 14:33 garden
drwxrwxr-x 2 cy cy 4096 Feb 17 14:57 forest
-rw-rw-r-- 1 cy cy 13 Feb 17 14:58 mountains
复制代码
2.1.2 显示目录下的所有文件(含隐藏的文件)
ls -a
# -a选项会显示出来隐藏的文件(以“.”开头)
cy@cy-trip:~/Documents/Linux_trip$ ls -lrta
total 24
drwxr-xr-x 4 cy cy 4096 Feb 16 10:15 ..
drwxrwxr-x 4 cy cy 4096 Feb 17 14:33 garden
drwxrwxr-x 2 cy cy 4096 Feb 17 14:57 forest
-rw-rw-r-- 1 cy cy 13 Feb 17 14:58 mountains
-rw-rw-r-- 1 cy cy 10 Feb 17 15:15 .myprofile
drwxrwxr-x 4 cy cy 4096 Feb 17 15:15 .
复制代码
2.1.3 显示文件类型
ls -F ${你的文件}
# -F选项会在文件名的最后显示出来文件的类型,“/”表示目录,“*”表示可执行的文件,...
cy@cy-trip:~/Documents/Linux_trip$ ls -lrtaF
total 28
drwxr-xr-x 4 cy cy 4096 Feb 16 10:15 ../
drwxrwxr-x 4 cy cy 4096 Feb 17 14:33 garden/
drwxrwxr-x 2 cy cy 4096 Feb 17 14:57 forest/
-rw-rw-r-- 1 cy cy 13 Feb 17 14:58 mountains
-rw-rw-r-- 1 cy cy 10 Feb 17 15:15 .myprofile
-rwxrw-r-- 1 cy cy 13 Feb 17 15:21 executable_file*
drwxrwxr-x 4 cy cy 4096 Feb 17 15:21 ./
复制代码
2.1.4 以更可读的格式显示文件大小
ls -lh ${你的文件}
# -h选项把文件的大小带上单位显示如:1K 234M 2G,如此处4096变成了4.0K
cy@cy-trip:~/Documents/Linux_trip$ ls -lrtFh
total 16K
drwxrwxr-x 4 cy cy 4.0K Feb 17 14:33 garden/
drwxrwxr-x 2 cy cy 4.0K Feb 17 14:57 forest/
-rw-rw-r-- 1 cy cy 13 Feb 17 14:58 mountains
-rwxrw-r-- 1 cy cy 13 Feb 17 15:21 executable_file*
复制代码
2.1.5 显示文件的类型
file ${你的文件}
# 显示文件的类型,如纯文本、目录、perl脚本等
cy@cy-trip:~/Documents/Linux_trip$ file garden
garden: directory
cy@cy-trip:~/Documents/Linux_trip$ file *
executable_file: POSIX shell script, ASCII text executable
forest: directory
garden: directory
mountains: ASCII text
复制代码
2.2 查找文件
2.2.1 locate
类似桌面索引,就是 google 或者 baidu 等搜索引擎公司推出的桌面版工具,为本机的所有文件创建检索索引到本地数据库里,方便像搜索引擎一样搜本机的文件。如果没有该工具,请通过 root 用户安装,updatedb 操作可以更新索引数据库。
locate ${你的文件名关键字}
# 搜索文件名中包含“dir_a”字样的文件
cy@cy-trip:~/Documents/Linux_trip$ locate dir_a
/home/cy/Documents/Linux_trip/file_system_cmds/dir_a
/home/cy/Documents/Linux_trip/file_system_cmds/dir_a/dir_ac
/home/cy/Documents/Linux_trip/file_system_cmds/dir_a/dir_ac/dir_ac.testfile
/home/cy/Documents/Linux_trip/file_system_cmds/dir_a/xml_in_dir_a.xml.gz
/home/cy/Documents/Linux_trip/file_system_cmds/dir_a/xml_in_dir_a_2.xml
复制代码
2.2.2 find
毋庸置疑,Linux 下查找文件的神器就是 find,功能非常灵活强大。
2.2.2.1 删除 7 天以前的文件
# -type f表示文件类型是普通文件
# -mtime +7表示修改时间为7*24h之前
# -delete表示执行删除动作
find ${某目录} -type f -mtime +7 -delete
复制代码
2.2.2.2 查找关键字
# 在${某目录}下查找名字是*.xml或者*.txt文件(-type f),
# 找到以后,在文件中过滤字符(grep list),
# 过滤操作以“\;”结尾,
# 如果过滤出来“list”字样,则打印出该文件名(-print)
cy@cy-trip:~/Documents/Linux_trip$ find ./ -type f \( -name "*.txt" -o -name "*.xml" \) -exec grep list {} \; -print
测试find grep : file_list.txt
./garden/file_list.txt
复制代码
2.2.2.3 将文件备份后移动到处理路径下
这可能是不得已的笨拙处理,在第三日文件系统管理中将介绍什么情况下会有坑,如何避免,这里仅举例一个实现的方法。
# -mmin +2表示修改时间为2分钟以前(2分钟以内没有修改),常用来判断文件是否传输完毕
# cp表示复制(copy)
# mv表示移动(改名,即move)
cy@cy-trip:~/Documents/Linux_trip$ find ${某目录} -type f -mmin +2 -exec cp {} ../backup/. \; -exec mv {} ../execute/. \;
复制代码
2.2.2.4 find 的常用检测条件
检测条件描述-cmin n 文件状态(内容或者属性)变化的时间(单位是分钟),最近 n 分钟以内用-n,n 分钟以前就用+n-atime n 文件的访问时间(单位是 24 小时),最近 n 天以内用-n,n 天以前就用+n-cnewer file 状态变化时间比文件 file 晚-newer file 修改时间比文件 file 晚-empty 空文件或者目录-iname pattern 类似于-name,不区分大小写-mmin n 文件被修改的时间(单位是分钟),最近 n 分钟以内用-n,n 分钟以前就用+n-mtime n 文件被修改的时间(单位是 24 小时),最近 n 天以内用-n,n 天以前就用+n-name pattern 文件或者目录名满足 pattern 格式,区分大小写-perm mode 指定 mode 的文件,可以是数字格式或者符号格式-user user_name 文件的属主是 user_name 的文件或者目录-o 前后两个检测条件是或的关系,前面的检测成功则不必检测后者-a 前后两个检测条件是与的关系,前面的检测失败则不必检测后者!表示否定,如! -name ".txt"表示文件名不为".txt"()一组检测条件,需要用"\"屏蔽其在 shell 中的含义,\( tester1 -o tester2 \)
2.2.2.5 find 的常用执行动作
执行动作描述-print 默认操作,输出匹配到的文件或者目录名到标准输出(屏幕)-delete 删除匹配到的文件-ls 列显匹配的文件-quit 一旦匹配成功就退出-exec 用户自定义的操作,如前文的 grep,自定义操作以";"结束,需要用"\"屏蔽其在 shell 中的含义,即以\;结尾
2.2.2.6 find 的常用选项
常用选项描述-depth 引导 find 处理目录之前先处理目录里的文件-maxdepth levels 检索进入目录的最大层级数-mindepth levels 检索进入目录的最小层级数-mount 不遍历挂载的其他文件系统
2.3 读写文件
作为操作系统的鼻祖,计算机当初最大的需求就是处理文本,所以在 Linux(含 unix 系列)都有大量的读写文件的好工具。
2.3.1 显示文件内容(cat 和 zcat)
2.3.1.1 显示单个文件的内容
cat ${你的文件}
# 通过cat 显示file_list.txt内容如下
cy@cy-trip:~/Documents/Linux_trip/garden$ cat file_list.txt
这里是一个文本文件,保存了文件列表的信息:
total 8
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b
测试find grep : file_list.txt
复制代码
2.3.1.2 显示文件中的不可见字符
cat -TE ${你的文件}
# 通过cat 显示file_list.txt的不可见字符:
# 其中T选项表示显示tab(制表符)符合为^I
# E选项表示显示一行的结束为$,这一惯例在Linux大量工具中是通用的,在以后的几日里大家都会发现这个规律
cy@cy-trip:~/Documents/Linux_trip/garden$ cat -TE file_list.txt
这里是一个文本文件,保存了文件列表的信息:$
total 8$
^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a$
^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b$
$
测试find grep :^I^Ifile_list.txt$
file_list.txt 最后一行$
复制代码
2.3.1.3 显示文件中的行号
cat -n ${你的文件}
# 通过cat 显示file_list.txt内容的不可见字符和行号
# 注:-n选项为第5行也显示了行号,-b选项不为空行显示行号
cy@cy-trip:~/Documents/Linux_trip/garden$ cat -TEn file_list.txt
1 这里是一个文本文件,保存了文件列表的信息:$
2 total 8$
3 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a$
4 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b$
5 $
6 测试find grep :^I^Ifile_list.txt$
7 file_list.txt 最后一行$
复制代码
2.3.1.4 合并显示文件的内容
cat ${你的文件1} ${你的文件2}
# 显示file_list_another.txt的内容
cy@cy-trip:~/Documents/Linux_trip/garden$ cat -nTE file_list_another.txt
1 这里是另一个文本文件,保存了另一个文件列表的信息:$
2 total 8$
3 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a_another$
4 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b_another$
5 测试find grep :^I^Ifile_list_another.txt$
6 file_list_another.txt 最后一行$
# 合并显示file_list_another.txt和file_list.txt两个文件
# cat本来就是连接(concatenate)文件的缩写
cy@cy-trip:~/Documents/Linux_trip/garden$ cat -nET file_list*.txt
1 这里是另一个文本文件,保存了另一个文件列表的信息:$
2 total 8$
3 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a_another$
4 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b_another$
5 测试find grep :^I^Ifile_list_another.txt$
6 file_list_another.txt 最后一行$
7 这里是一个文本文件,保存了文件列表的信息:$
8 total 8$
9 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a$
10 ^Idrwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b$
11 $
12 测试find grep :^I^Ifile_list.txt$
13 file_list.txt 最后一行$
复制代码
2.3.1.5 zcat 显示压缩文件的内容(不解压)
zcat ${你的压缩文件}
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt *.txt
total 16
-rw-rw-r-- 1 cy cy 225 Feb 21 21:24 file_list.txt
-rw-rw-r-- 1 cy cy 268 Feb 21 21:33 file_list_another.txt
# 压缩两个文本文件
cy@cy-trip:~/Documents/Linux_trip/garden$ gzip *.txt
# 两个文件压缩以后以"gz"结尾,是压缩格式的文件,无法正常显示文本内容
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt *.txt*
-rw-rw-r-- 1 cy cy 201 Feb 21 21:24 file_list.txt.gz
-rw-rw-r-- 1 cy cy 225 Feb 21 21:33 file_list_another.txt.gz
cy@cy-trip:~/Documents/Linux_trip/garden$ cat file_list.txt.gz
�^2`file_list.txt{�����g3�?���dǪg�ڟ�Y$����~Oϓ�s����dW
�i��
W<���d��g�����U�_���`�řRT^B�
F
ɕ db`i�`�lN�����������BJfQ|"I�����m�~�~jZf^�BzQj��gZfNj|Nfq�^IE
O�ٜ����z���
��O�"cy@cy-trip:~/Documents/Linux_trip/garden$
# 通过zcat可以正常显示文本文件的内容
cy@cy-trip:~/Documents/Linux_trip/garden$ zcat file_list_another.txt.gz file_list.txt.gz
这里是另一个文本文件,保存了另一个文件列表的信息:
total 8
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a_another
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b_another
测试find grep : file_list_another.txt
file_list_another.txt 最后一行
这里是一个文本文件,保存了文件列表的信息:
total 8
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b
测试find grep : file_list.txt
file_list.txt 最后一行
# 显示以后,两个文件并没有解压缩,仍是压缩格式
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt *.txt*
-rw-rw-r-- 1 cy cy 201 Feb 21 21:24 file_list.txt.gz
-rw-rw-r-- 1 cy cy 225 Feb 21 21:33 file_list_another.txt.gz
cy@cy-trip:~/Documents/Linux_trip/garden$ file *.txt*
file_list_another.txt.gz: gzip compressed data, was "file_list_another.txt", last modified: Sun Feb 21 13:33:32 2021, from Unix, original size modulo 2^32 268
file_list.txt.gz: gzip compressed data, was "file_list.txt", last modified: Sun Feb 21 13:24:14 2021, from Unix, original size modulo 2^32 225
复制代码
2.3.2 less is more
少就是多的哲学理念,意味着在 Linux 中将鼓励用 less 替代 more,less 可以上下翻页,可以搜索文本,甚至可以显示上述压缩文件的内容,可以使用 vi 编辑器的浏览命令(除了编辑命令),确实非常强大。
less ${你的文件}
cat ${你的文件} | less
# 解压一个文件(后续详细介绍)
cy@cy-trip:~/Documents/Linux_trip/garden$ gunzip file_list.txt.gz
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt *.txt*
-rw-rw-r-- 1 cy cy 225 Feb 21 21:24 file_list.txt
-rw-rw-r-- 1 cy cy 225 Feb 21 21:33 file_list_another.txt.gz
cy@cy-trip:~/Documents/Linux_trip/garden$ file *.txt*
file_list_another.txt.gz: gzip compressed data, was "file_list_another.txt", last modified: Sun Feb 21 13:33:32 2021, from Unix, original size modulo 2^32 268
file_list.txt: UTF-8 Unicode text
# 通过less打开的文件可以进行搜索,此处搜索关键字"dir",匹配到"dir"的文本处将是高亮显示的
# 见附录中关于vi编辑器的详细介绍,操作步骤如下:先按"/",然后输入关键字“dir”,按回车执行命令,最后按"q"退出less
cy@cy-trip:~/Documents/Linux_trip/garden$ less file_list_another.txt.gz
复制代码
[图片上传失败...(image-47ec08-1614440061215)]
# 请你也试一试下面的操作
cy@cy-trip:~/Documents/Linux_trip/garden$ cat -nTE file_list.txt | less
复制代码
2.3.3 掐头去尾
2.3.3.1 显示文件前部(head)
head -n
# head -n1 读取文件的首行
cy@cy-trip:~/Documents/Linux_trip/garden$ head -n1 file_list.txt
这里是一个文本文件,保存了文件列表的信息:
# head -n9 读取文件的前9行
cy@cy-trip:~/Documents/Linux_trip/garden$ head -n9 file_list.txt
这里是一个文本文件,保存了文件列表的信息:
total 8
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b
测试find grep : file_list.txt
第7行
第8行
第9行
# head -vn5 -v 表示总是在最上面显示文件名
cy@cy-trip:~/Documents/Linux_trip/garden$ head -vn5 file_list.txt
==> file_list.txt <==
这里是一个文本文件,保存了文件列表的信息:
total 8
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b
# head -vc10 -c显示文件的最前指定数量个比特(bytes)
cy@cy-trip:~/Documents/Linux_trip/garden$ head -vc10 file_list.txt
==> file_list.txt <==
这里是�cy@cy-trip:~/Documents/Linux_trip/garden$
# head -n-9 数量前面加“-”(负数)表示显示除了这些数量的最前部分,此处是去除最后9行,显示文件的前部
cy@cy-trip:~/Documents/Linux_trip/garden$ head -n-9 file_list.txt
这里是一个文本文件,保存了文件列表的信息:
total 8
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_a
drwxrwxr-x 2 cy cy 4096 2月 16 14:20 dir_b
测试find grep : file_list.txt
第7行
第8行
第9行
第10行
第11行
第12行
第13行
第14行
第15行
第16行
第17行
第18行
测试一下掐头去尾的操作
倒数第10行
复制代码
2.3.3.2 显示文件尾部(tail)
选项与 head 相似,见上一节(head),tail 显示的是文件的尾部。有一个选项很有用,-f 通常用来显示正在写入的文件(如监控日志文件的变化)
[图片上传失败...(image-a7af05-1614440061215)]
2.3.4 复制文件(cp)
2.3.4.1 递归目录内容复制
cp -r
# 直接复制目录会出错,使用-r选项可以递归复制目录的内容
cy@cy-trip:~/Documents/Linux_trip$ ls garden
dir_a dir_b file_list_another.txt.gz file_list.txt
cy@cy-trip:~/Documents/Linux_trip$ man cp
cy@cy-trip:~/Documents/Linux_trip$ cp garden garden_bak
cp: -r not specified; omitting directory 'garden'
cy@cy-trip:~/Documents/Linux_trip$ ls garden_bak
ls: cannot access 'garden_bak': No such file or directory
cy@cy-trip:~/Documents/Linux_trip$ cp -r garden garden_bak
cy@cy-trip:~/Documents/Linux_trip$ ls garden_bak
dir_a dir_b file_list_another.txt.gz file_list.txt
复制代码
2.3.4.2 覆盖文件前提醒确认
cp -i
# 如果目标文件是已经存在的文件,就可能造成意外覆盖,使用-i选项会做提醒确认
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 22 21:36 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 21:51 file_list.txt.bak
# 文件被覆盖,有误操作的风险
cy@cy-trip:~/Documents/Linux_trip/garden$ cp file_list.txt file_list.txt.bak
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 22 21:36 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 21:53 file_list.txt.bak
# 选择不覆盖“n”,操作前确认
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -i file_list.txt file_list.txt.bak
cp: overwrite 'file_list.txt.bak'? n
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 22 21:36 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 21:53 file_list.txt.bak
复制代码
2.3.4.3 只复制有最新修改的文件
cp -u
# 请注意文件的修改时间,只有最新的修改才会复制,否则不会复制
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 22 21:36 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 21:53 file_list.txt.bak
# file_list.txt没有file_list.txt.bak更新,没有复制
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -u file_list.txt file_list.txt.bak
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 22 21:36 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 21:53 file_list.txt.bak
# file_list.txt.bak比file_list.txt.bak更新,执行了复制
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -u file_list.txt.bak file_list.txt
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 23 21:53 file_list.txt.bak
-rw-rw-r-- 1 cy cy 520 Feb 23 22:08 file_list.txt
复制代码
2.3.4.4 提示所作的操作
cp -v
# 同样是上一节的操作,-v选项会显示实际做的操作
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -uv file_list.txt.bak file_list.txt
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -uv file_list.txt file_list.txt.bak
'file_list.txt' -> 'file_list.txt.bak'
复制代码
2.3.4.5 复制后保持修改时间和权限等属性
cp -p
# 请留意文件的修改时间和权限
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -lrt file_list.txt*
-rw-rw-r-- 1 cy cy 520 Feb 23 22:08 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 22:11 file_list.txt.bak
# 取消其他组用户的读权限
cy@cy-trip:~/Documents/Linux_trip/garden$ chmod o-r file_list.txt
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt
-rw-rw-r-- 1 cy cy 520 Feb 23 22:11 file_list.txt.bak
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -p file_list.txt file_list.txt.bak
# file_list.txt.bak的修改时间和权限与file_list.txt一致
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt.bak
复制代码
2.3.5 移动(改名)文件(mv)
mv 与 cp 的更深层次差异将在第三日(文件系统管理)中详细分析,那里也会讲到防御操作冲突的一些技巧。
2.3.5.1 基本操作
mv ${源文件} ${目标文件}
# 与之前的cp相似,mv操作成功以后,原来的源文件将不再存在。
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt
-rw-rw---- 1 cy cy 527 Feb 23 22:29 file_list.txt.bak
# 改名
cy@cy-trip:~/Documents/Linux_trip/garden$ mv file_list.txt file_list.txt.rename
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 527 Feb 23 22:29 file_list.txt.bak
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt.rename
cy@cy-trip:~/Documents/Linux_trip/garden$ mv file_list.txt.rename file_list.txt.bak
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt.bak
# 将文件移动到目录中
cy@cy-trip:~/Documents/Linux_trip/garden$ mv file_list.txt.bak dir_a/.
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
ls: cannot access 'file_list.txt*': No such file or directory
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l dir_a/
total 12
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt.bak
复制代码
2.3.5.2 其他与 cp 相同含义的选项:
-i 表示目标文件存在时提醒确认;
-f 表示强制覆盖,不做提醒确认;
-r 表示递归复制整个目录;
-u 表示只移动有最新修改的文件
-v 表示显示所做的操作。
2.3.6 删除文件(rm)
Linux 没有回收站,我们删除文件以后不能从某处恢复的。有一些工具或许能通过分析磁盘来努力辨认删除前的文件,但这一操作会影响业务,也有时效性,还须避免磁盘被后续写入覆盖。所以我们直接认为简单粗暴的删除操作是不能恢复的。
我们有很多操作习惯可以避免这些危险操作,在后续的旅程中会讲到几个造成灾难的故事,以及常见的避免方法。
2.3.6.1 提醒确认是否删除
所以,我们第一个要讲的操作就是交互式确认是否当真要删除文件。
rm -i
# 与操作者交互,输入“n”不会执行删除
cy@cy-trip:~/Documents/Linux_trip/garden$ rm -i file_list.txt
rm: remove regular file 'file_list.txt'? n
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt
-rw-rw---- 1 cy cy 520 Feb 23 22:44 file_list.txt
# 与操作者交互,输入“y”才会执行删除
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt.to_be_del
-rw-rw---- 1 cy cy 520 Feb 23 22:08 file_list.txt.to_be_del
cy@cy-trip:~/Documents/Linux_trip/garden$ rm -i file_list.txt.to_be_del
rm: remove regular file 'file_list.txt.to_be_del'? y
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt.to_be_del
ls: cannot access 'file_list.txt.to_be_del': No such file or directory
复制代码
2.3.6.2 强制删除
下面的操作将一次比一次危险,误操作将造成更大的麻烦。
rm -f
# 强制删除,“-i”提示将失效,不再提示
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 520 Feb 23 22:44 file_list.txt
-rw-rw---- 1 cy cy 520 Feb 23 22:44 file_list.txt.to_be_del
cy@cy-trip:~/Documents/Linux_trip/garden$ rm -if file_list.txt.to_be_del
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l file_list.txt*
-rw-rw---- 1 cy cy 520 Feb 23 22:44 file_list.txt
复制代码
2.3.6.3 递归强制删除
我刚才在实验这个操作的时候,满手心的汗,已经多年没有直接用这个操作。
这是一个谈之色变的操作,我很可能后悔在本次旅程中呼叫他的名字,也就是很可能后悔让旅客知道他的存在。
rm -rf
# 只要有权限,递归遍历指定的目录,做强制的删除
cy@cy-trip:~/Documents/Linux_trip/garden$ cp -r dir_a dir_a_to_be_del
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l
total 20
drwxrwxr-x 3 cy cy 4096 Feb 23 22:43 dir_a
drwxrwxr-x 3 cy cy 4096 Feb 27 16:47 dir_a_to_be_del
drwxrwxr-x 2 cy cy 4096 Feb 16 14:25 dir_b
-rw-rw-r-- 1 cy cy 225 Feb 21 21:33 file_list_another.txt.gz
-rw-rw---- 1 cy cy 520 Feb 23 22:44 file_list.txt
# 不能直接删除目录
cy@cy-trip:~/Documents/Linux_trip/garden$ rm -f dir_a_to_be_del
rm: cannot remove 'dir_a_to_be_del': Is a directory
# -r选项递归删除目录
cy@cy-trip:~/Documents/Linux_trip/garden$ rm -rf dir_a_to_be_del
cy@cy-trip:~/Documents/Linux_trip/garden$ ls -l
total 16
drwxrwxr-x 3 cy cy 4096 Feb 23 22:43 dir_a
drwxrwxr-x 2 cy cy 4096 Feb 16 14:25 dir_b
-rw-rw-r-- 1 cy cy 225 Feb 21 21:33 file_list_another.txt.gz
-rw-rw---- 1 cy cy 520 Feb 23 22:44 file_list.txt
复制代码
2.3.6.4 其他与 cp 相同含义的选项:
-v 表示显示所做的操作。
评论