山地人

Linux文件管理

山地人
山地人
2021-05-17

接着上一讲,我们继续讲Linux的一些基本操作。

上一讲,我们通过cd,pwdls三个命令,已经可以在文件系统里自由行走了。这一讲让我们再增加一组新的能力,可以创建、查看和删除文件。

“回声”显示

使用echo我们可以往屏幕上输出内容,这时echo命令就像一个回声桶。你喊一句话,它就原样回应你的内容到屏幕。

echo的用法很简单,直接输入echo加空格然后输入你要输出的内容,然后echo会把结果显示到屏幕上。

echo Hello World

启动终端,看到#符号后,输入上面的内容试试。

但如果echo只能给你带来这些,这个命令就有些无聊了。现在只要先对echo有一个印象即可,后面我们会利用echo做更有趣的事情。

创建文件

先介绍一种创建空文件的方法。

touch file

当你只是想创建一个空文件时,你就可以使用touch命令了。如果touch的文件不存在,就会自动创建这个文件。如果存在touch也不会报错。

touch note.txt
ls

打开终端,用touch命令创建一个note.txt的空文件。

当然上面是一种创建空文件的快捷方法,但如果我们要创建有内容的文件。这是我们又要请出我们的echo命令了。

我们除了可以让echo把内容输出到屏幕,还能利用echo把内容写到文件中去。这样就可以利用echo来创建文件了。

echo Hello World > hello.txt

打开终端,输入上面的命令试试,然后用ls查看下当前路径,看看当前路径下是否有一个叫做hello.txt的文件。

如果操作正确你会看到,dev后多了一个hello.txt,这就是刚才我们用echo命令创建的文件。

# echo Hello World > hello.txt
# ls
bin dev hello.txt lib lib64 media opt root sbin sys usr
boot etc home lib32 libx32 mnt proc run srv tmp var

我们在使用的时候输入了一个>符号,这个符号表示我们要把前面的内容输入到后面的文件中,如果要写入的文件不存在,系统会自动创建这个文件。

后面,我们会详细讲解这个>符号,我们暂且先放一放,看看接下来的这个问题。

查看文件内容

当我们把内容写入到文件中后,自然会想阅读一下文件中保存的内容,这时你可能想到了上一个命令echo但内容是存放在文件中的,而不是跟在echo后面的字符串,我们有改如何处理这个问题?

这时,我要向你推荐一个在Linux非常受欢迎的命令cat。 这个cat可别理解成一只猫了,这是Linux上非常常用的输出文件内容到标准输出(屏幕)的命令。这真是我们需要的命令,下面看下这个命令的用法。

cat: concatenate and print files 级联和打印文件,这里我们先关注它的打印文件的功能。

输入cat 后面跟个空格,然后输入你要查询的文件的路径。

cat 文件路径

刚才我们用echo创建了一个文件,现在我们再使用cat来查看刚才创建的hello.txt文件。

启动终端,然后试者输入这个命令,按下空格,再输入一个要查看的文件,最后按下回车。

cat hello.txt

启动这个终端,然后输入上面的命令(不要跳过之前的步骤直接来到这里,这样你会获得一个错误。)。

你会看到cat命令把hello.txt文件的内容输出到了命令下方的屏幕上。

# cat hello.txt
Hello World

你已经掌握了cat命令的最基本的用法,下面我们回过头,再来讲讲刚才说到的>符号。

改变输出行为

先前我们看到的这个>符号叫做重定向符。利用这个重定向符号,我们可以把改变原本往屏幕输出的行为,这就是为什么这个符号叫做重定向符

Linux系统为我们提供了两种模式的重定向符

符号说明
>输出内容会覆盖之前文件中的内容
>>输出内容会以追加的形式添加到文件中现有内容的末尾

下面我们结合echocat命令来完成一组对比实验。

echo Hello > textA.txt
cat testA.txt
echo World > textA.txt
cat testA.txt

打开终端,运行上面的每一条命令,观察>对输出的影响?

现在让我们把>换成>>,往另一个textB.txt文件输出两次不同的内容。

echo Hello >> textB.txt
cat textB.txt
echo World >> textB.txt
cat textB.txt

打开终端,继续运行上面的命令,观察>>对输出的影响发生了什么变化?

对比两组实验,现在你应该能够体会>>>的行为差异,对覆盖追加模式有了直观的感受。

心得体会

这里再次小结一下:

  • 如果往同一个文件中写入多次内容,每一次都希望重新开始,丢弃之前的记录,那就使用>覆盖模式的重定向符。
  • 如果要往同一个文件中写入多次内容,又不希望覆盖掉之前的内容,需要使用>>追加方式的重定向符。

重命名文件

有时候,你可能在创建文件的时候不小心把文件名给打错了。这时不用太着急,我们可以使用mv命令来帮我们纠正操作。

mv: move 的缩写形式,意思就是移动,把文件移动到另外一个路径,所以这个命令既能移动文件也能重命名文件。

按照下面的方式,我们就可以把old_file_name重新改成new_file_name

mv old_file_name new_file_name

下面我们还是动手试试

echo "Hello World" > abc.txt
mv abc.txt helloworld.txt
ls

打开终端,按照上面的这组命令:

  • 先创建一个abc.txt
  • 然后将abc.txt改名成helloworld.txt
  • 最用用ls查看下当前目录下,确定上面的改名操作没有问题。

删除文件

到目前,我们已经学会了创建追加查看移动/改名大部分文件相关的操作,还剩最后一项——删除。首先,在学习这条命名之前,在脑海里留下这样一条印象——删除文件是一个危险的动作,在执行这条命令的时候一定要谨慎操作。

删除命令是rm,是remove directory entries的缩写,意思是移除目录。

rm file

用法很简单rm后面空格,再输入要删除的文件路径。

rm textA.txt
rm textB.txt

打开终端,把之前我们创建的textA.txttextB.txt文件删除掉。

至此,我们已经完成了对文件的增删改查的基本动作。

创建和删除目录

前面,我们都是对文件的操作,如果想要处理的是目录这又该如何处理?

mkdir dir_name
rmdir dir_name

利用上面这两条命令,你就可以创建和删除目录了。

  • mkdir: make directories 创建目录
  • rmdir: remove directories 移除目录
mkdir test
ls
rmdir test

打开终端,测试下上面这组命令。

进阶

看过上一篇基本操作的同学应该知道,在Linux中,我们做一件事的方式有很多中。但有些操作效率特别高,下面这些操作就是为了帮你提升效率的。

批量删除

如果你的当前目录下有一堆.txt结尾的文件想要清楚。我们可以直接使用下面的方式来批量删掉全部.txt结尾的文件。

rm *.txt

这里的*是一个通配符,指代任意字符。整个命令的意思是:删除所有的任意字符开头结尾是.txt的文件,简单说就是删除所有.txt结尾的文件。

touch a.txt
touch b.txt
touch abc.txt
touch test.txt
rm *.txt
ls

打开终端,创建一批.txt结尾的文件,然后用rm批量删除,最后ls检查下文件是否都清理干净。

显示行号

作为开发者,我们很多时候希望查看文件内容时开启行号显示,这时候我们只需要给cat命令添加一个-b的参数即可。

echo 'function say(){' >> main.js
echo 'console.log("Hello")' >> main.js
echo '}' >> main.js
cat -b main.js

打开终端,使用上面的命令,先创建一个main.js,然后用cat -b命令查看这个文件。

创建和删除多级目录

有时候,你想创建一个多层级的目录(父目录里还有子目录的嵌套目录)。

比如:workspace/demo/test/

mkdir workspace
cd workspace
mkdir demo
cd demo
mkdir test

当然,你可以像上面这样一级一级创建下去。如果你不满足于此,你可以使用下面的方式一键创建多级目录

mkdir -p workspace/demo/test

这里的-p就是使用递归方式创建目录。有点像套娃大娃里面套小娃,小娃再套小小娃…直到最后。

对于上面的例子:

1.mkdir先检查workspace目录是否存在,不存在就创建。
2.然后mkdir递归检查workspace下的demo目录是否存在,不存在就创建。
3.然后mkdir递归检查workspace下的demo目录下的test目录是否存在,不存在就创建。

整个执行过程其实就是完成我们上面手工创建的所有过程,但使用-p后,命令变得更为简洁高效了。

打开终端,测试上面的批量创建目录的命令写法。

rmdir -p path

理解了递归创建目录,再来理解递归删除嵌套目录就不难了。

rmdir -p workspace/demo/test

打开终端,测试上面的批量删除目录的写法。

整个删除的执行过程是这样:

1.rmdir先检查 workspace/demo/test 目录是否存在,存在就删除。
2.然后rmdir再删除 workspace/demo。
3.最后rmdir再删除 workspace。

但是上面这种删除方法的使用是有局限性的,如果父目录中还有其他目录,那删除的过程会失败。

比如下面这样:

rmdir -p workspace/demo/test
rmdir -p workspace/hello

workspace目录下有demohello两个目录

这是如果你执行rmdir -p workspace/demo/test就会报错,因为最后删除workspace时,这个目录不是空目录。

这时,你可能会问,那我非要删除这种带多个子目录的父目录怎么办?

我们可以使用rm命令来帮我们完成这件事。

rm -rf workspace

这样一次性就把整个workspace目录都删除干净了。

你可以在终端里测试一下。

到这里,我们完成了对文件和目录的全部基本操作。本节课的内容比较多,所以如果你一时间觉得知识量比较大,也很正常。回头再来复习巩固一遍。

命令说明示例
echo回显内容echo Hello
touch创建空文件touch main.js
cat查看文件内容cat main.js
mv移动/重命名文件mv old.txt new.txt
rm删除文件rm old.txt
mkdir创建目录mkdir room
rmdir删除目录rmdir room

至此,本篇教程也到了该和你说再见的时候了,我们下期再见。

学完本篇互动教程,如果你觉得体验不错,可以把网页链接发送给你的小伙伴,让他/她也来感受一下。当然,你也可以继续看看网站上其他的的互动教程,希望`idev365`能够给你带来收获。