• 6

  • 475

  • 收藏

Linux之旅 - 入⻔命令集 - 文件管理(1/2)

2星期前

登录进一个操作系统以后,第一件要做的事通常是浏览目录和文件。此处,我们就从文件管理开始梳理入门命令集。
关于文件操作的命令集非常丰富,尤其是与读写相关的,我们将分为两篇来梳理。本篇是基本操作,下一篇是文件的分析和归档等操作(用命令分析文件中的内容是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
复制代码

less命令的操作动画

# 请你也试一试下面的操作
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通常用来显示正在写入的文件(如监控日志文件的变化) tail -f的效果

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 表示显示所做的操作。

免责声明:文章版权归原作者所有,其内容与观点不代表Unitimes立场,亦不构成任何投资意见或建议。

程序员

475

相关文章推荐

未登录头像

暂无评论