300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 《Linux编程》学习笔记 ·001【基本操作 常用命令】

《Linux编程》学习笔记 ·001【基本操作 常用命令】

时间:2022-11-10 11:33:02

相关推荐

《Linux编程》学习笔记 ·001【基本操作 常用命令】

注:前言、目录见 /qq_44220418/article/details/108428971

文章目录

一、基本操作1、查看目录/文件2、路径跳转(1).路径(2).跳转3、创建目录4、创建文件5、写入文件6、读取文件7、复制文件8、删除文件二、Linux命令行特殊符号1、`~`、`~+`、`~-`2、`&`3、`>`、`>>`、`<`、`<<`4、`|`三、Linux常用命令1、`cat`命令2、`ls`命令3、`find`命令4、`grep`命令5、`wc`命令6、`rm`命令四、“渔”

一、基本操作

1、查看目录/文件

使用命令ls或者dir显示当前目录下的文件/目录(关于ls命令的详细用法见本文 ls命令)

使用命令tree显示当前目录及其子目录下文件和目录的树状结构(有的Linux系统需要安装才能使用,Fedora中是可以直接使用的)

Tips:ls命令输出的文件会根据其类型标注颜色,dir默认全部白色

使用示例

使用命令dir,将显示当前目录下的文件/目录的信息

使用命令ls,将高亮显示当前目录下的文件/目录的信息

使用命令tree,将显示当前目录及其子目录下的所有文件/目录的树状结构

2、路径跳转

(1).路径

一个路径可以理解为一个目录/文件的位置,比如/home/excious/lcmd,这个路径表示根目录/下有一个home目录,home目录下有一个excious目录,excious目录下有一个lcmd目录,这个路径/home/excious/lcmd代表的就是这个lcmd目录

终端命令行中能跳转到的路径都是一个目录的路径

在终端(命令行)中,有一个当前路径,代表你当前所在的目录,比如/home/excious/lcmd

/home/excious/lcmd这样的路径,称为绝对路径,以根目录符号/开头

./cptest../new这样的路径,称为相对路径,以当前目录符号.开头或以父目录符号..开头,这种相对相对于当前目录来说的。比如当前路径为/home/excious/lcmd,那么路径./cptest就相当于/home/excious/lcmd/cptest,路径../new就相当于/home/excious/new

当然,相对路径中当前目录.父目录..都可以理解为目录中的一个子目录,任何一个目录中都有隐含的这两个目录,.代表该目录本身,..代表返回上一级目录(特殊地,根目录的父目录..仍为自己本身)

因此,根据这种理解,就有另一种不太常用的路径写法,像/home/excious/lcmd/../new/my/././././bash,理解的时候先把绝对路径的部分读完作为一个临时路径,读到了相对路径的部分则相对于刚才的临时路径解读为绝对路径。

要解读 /home/excious/lcmd/../new/bash/././././my从前往后读,读到下一个相对路径 .. 或 . 出现的地方之前/home/excious/lcmd (临时路径1)读取到父目录 .. 后,将临时路径1变换为其父目录的绝对路径/home/excious(临时路径2)继续往后读,读到下一个相对路径 .. 或 . 出现的地方之前/home/excious/new/bash(临时路径3)读到当前目录 . 后,将临时路径3变换为其当前目录(自己本身)的路径/home/excious/new/bash(临时路径4)后面还有三个 ./ 同样如此解读/home/excious/new/bash(临时路径5)继续往后读取,直到结束/home/excious/new/bash/my(最终路径)

从上面的分析过程中,可以知道,/home/excious/lcmd/../new/my/././././bash就相当于/home/excious/new/bash/my

(2).跳转

终端(命令行)的当前目录指示了终端当前所在的目录,使用命令pwd可以查看当前目录完整的绝对路径

pwd# 输出:/home/excious/new/bash/my

很多时候,与文件相关操作时,直接指明文件名会在当前目录下搜寻,而不需要指明文件的具体路径

比如当前路径为/home/excious/lcmd,想要查看该目录下一个02.txt的文件,可以不用cat /home/excious/lcmd/02.txt,也不用cat ./02.txt,只需要cat 02.txt即可(如果直接要直接执行该文件,还是要加上./的——./02.txt

(※):使用cat命令可以查看文件内容,后面会说明——可见本文 读取文件

因此,为了方便操作某一目录下的文件/目录,我们需要跳转到那个目录,也就是把那个目录作为终端的当前目录

使用cd命令可以实现目录跳转,格式为cd 目录路径

比如当前路径为/home/excious/lcmd,想跳转进入到/home/excious/lcmd/cptest/cpdir,以下三种方式都可以实现

cd /home/excious/lcmd/cptest/cpdircd ./cptest/cpdircd cptest/cpdir

为什么有必要这样跳转呢,就比如/home/excious/lcmd/cptest/cpdir这个目录下有两个文件01.txt02.txt,你想用cat命令分别查看它们的内容,但你当前目录是/home/excious/lcmd,不跳转就得这么写

cat cptest/cpdir/01.txtcat cptest/cpdir/02.txt

但是如果跳转了目录,使用cat命令的时候就可以简化一点

cd cptest/cpdircat 01.txtcat 02.txt

Tips:命令行输入时,按Tab键可以快速补齐文件名、路径、命令,便于快速操作

技巧示例

目录/home/excious/new下,有如下文件/目录(也可用命令ls观察)

输入cd,加上空格,按下Tab,将提示当前目录下有哪些目录可以跳转(如果唯一,则会自动补全;如果不唯一,多次按下Tab将提示可选输入)

$ cd bash/ dir/ dir2/ gcc/ learn/ $ cd

输入cd b,按下Tab,将自动补全路径bash/

$ cd b# 按下Tab键$ cd bash/

3、创建目录

使用mkdir命令创建目录

使用mkdir 新建目录名在当前目录下创建目录

使用mkdir 某存在的目录路径/新建目录名在指定目录下创建目录

使用mkdir -p 某存在的目录路径/不存在的目录1/不存在的目录2/新建目录名在指定目录下创建不存在的目录及其子目录

使用示例

目录/home/excious/lcmd下,有如下文件/目录,终端(命令行)的当前目录为/home/excious/lcmd

使用命令mkdir mkdirtest,将在当前目录下创建一个新的空目录mkdirtest

使用命令mkdir mkdirtest/newtest,将在刚刚创建的目录mkdirtest下创建一个新的空目录newtest

使用命令mkdir -p new1/new2/new3,将在当前目录下创建一个新的空目录new1,在目录new1下创建新目录new2,在目录new2下创建新目录new3

4、创建文件

方法一:touch命令

使用示例

touch 01.txt

方法二:重定向符>

重定向符的一些知识可以将参考 输入/输出重定向符

使用示例

> 02.txt

方法三:echo命令+重定向符>(创建并写入)

使用示例

echo "内容" > 03.txt

方法四:cat命令+重定向符>(创建并写入)

使用示例

cat > 04.txt内容内容内容^C # (按Ctrl + C)

思考与理解:

\qquad其实,简单理解吧,cat命令和echo命令都能得到一个字符串

\qquadcat命令和echo命令都能得到一个字符串

\qquad\qquadcat命令根据参数文件名读取文件的内容生成字符串

\qquad\qquadecho命令根据参数字符串得到一个字符串

\qquad如果命令行最终得到了这个字符串会在命令行中直接显示

\qquad如果这个字符串顺着重定向符>将会流向指定的文件

\qquad如果这个字符串遇到管道|将会作为参数传入下一条命令

方法五:gedit命令(文本编辑器创建,需要有GNOME桌面,即可视化界面)

使用示例

gedit 05.txt

Tips:按下 Ctrl + C 结束命令、终止输入

5、写入文件

和创建文件时类似,可以配合cat命令、echo命令和重定向符>>>写入文件

使用示例

cat > 01.txt123safs略^C # (按Ctrl + C)

6、读取文件

方法一:cat命令(详细的cat命令使用可见本文 cat命令 )

使用示例

cat 02.txt

方法二:tac命令(从最后一行开始,往上按行读取)

使用示例

tac 02.txt

方法三:less命令(命令行文本阅读器,按q退出)

使用示例

less 02.txt

方法四:nl命令(行号显示,相当于cat -n

使用示例

nl 02.txt

方法五:head命令(参数-n 5读取开头5行)

使用示例

head 02.txt

方法六:tail命令(参数-n 5读取末尾5行)

使用示例

tail 02.txt

7、复制文件

使用cp命令复制文件

使用cp 源文件路径 目标目录路径在目标目录路径下复制一个同名文件

使用cp 源文件路径 目标文件路径在目标目录路径下复制一个对应的重命名的文件

使用示例

目录/home/excious/lcmd/new1下,有如下文件/目录,终端(命令行)的当前目录为/home/excious/lcmd/new1

使用命令cp 1.txt new1.txt,将把当前目录下的文件1.txt复制一份并重命名为new1.txt放到当前目录下

使用命令cp 1.txt cpcp,将把当前目录下的文件1.txt复制一份放到目录cpcp

使用命令cp 1.txt cpcp/2.txt,将把当前目录下的文件1.txt复制一份并重命名为2.txt放到目录cpcp

8、删除文件

使用rm命令删除文件

使用rm 文件路径删除相应文件

使用rm 文件路径1 文件路径2 文件路径3删除多个相应文件

使用rm -r 文件/目录路径删除相应文件/目录

使用rm -f 文件路径删除相应文件(无需确认直接删除)

使用示例见 rm命令

二、Linux命令行特殊符号

要想看比较全面的,可以参考这篇博文 /liaowenxiong/article/details/113768770

1、~~+~-

~符号代表用户主目录

比如我的用户为excious,我的用户主目录为/home/excious,这一目录可以用~代替

~+符号代表当前目录,可以相当于.

~-符号代表上一次的目录

比如终端(命令行)的当前目录为/home/excious,输入了命令cd new跳转到/home/excious/new后,~-就代表了跳转前的目录/home/exciousls ~-就相当于ls /home/excious

2、&

在命令的最后加上&符号——命令 &,代表将该命令放到后台中工作

特性:关闭当前终端窗口,程序仍在运行

3、>>><<<

>>><<<这些是输入/输出重定向符

有三种输入/输出,分别如下:

输入重定向符<<<

使用示例

# 将a2.txt的内容作为grep命令的输入参数,查找文件内容中包含2的地方grep -E "*2*" < a2.txt# 以EOF作为输入的开始符和结束符,输入一系列内容作为grep命令的参数,查找这段内容中包含2的地方grep -E "*2*" << EOF12124afsaEOF

命令执行的截图如下:

输出重定向符>>>

使用示例

# 将文件1.txt清空,并向其中添加内容echo -e "123\nabc\n11111" > 1.txt# 在文件1.txt后添加内容echo -e "abc\n666" >> 1.txt

命令执行的截图如下:

4、|

|代表管道,管道命令使用|作为界定符,详细的管道介绍可参考 /p/9c0c2b57cb73

管道的作用是把上一条命令的输出结果作为下一条命令的输入参数,形如命令1 | 命令2 | 命令3

使用示例当前在目录/home/excious/lcmd下,输入以下脚本

lsls | grep "1"ls | grep "1" | wc -l

可以观察到以下输出:解释一下第一个命令ls,我们可以看到有01.txt 02.txt 03.txt 04.txt cptest examples new1 testsort.txt,这其实就是ls命令的输出 第二个命令ls | grep "1",其实就是把上一个命令ls的输出作为grep命令用来匹配的输入参数,grep命令对前面的输出结果01.txt 02.txt 03.txt 04.txt cptest examples new1 testsort.txt进行查找匹配,匹配路径中含有1的内容 输出结果如下:

01.txtnew1

从输出结果来看,他匹配到了两行数据01.txtnew1,将其作为输出 第三个命令ls | grep "1" | wc -l,其实就是把上一个命令ls | grep "1"的输出作为wc命令用来统计的输入参数,wc命令对前面的输出结果进行统计,统计共有多少行,输出了2

三、Linux常用命令

1、cat命令

cat命令

加入参数-n显示行号

加入参数-b计算行号跳过空白行加入参数-s将两行以上的空行显示为1行加入参数-E$显示行尾(-e⇔⇔⇔-vE

加入参数-T^I显示Tab符(-e⇔⇔⇔-vT

加入参数-v显示^M符号

加入参数-A来show all,相当于-vET

使用示例

当前目录为/home/excious/lcmd/examples/cat,该目录下仅有一个1.txt文件,其内容如下图所示:

使用命令cat 1.txt,显示1.txt的内容

使用命令cat -n 1.txt,显示1.txt的内容,并标注行号

使用命令cat -b 1.txt,显示1.txt的内容,并标注行号(标注时跳过空行,但会显示出空行)

使用命令cat -ns 1.txt,显示1.txt的内容,并标注行号(将多行空行显示为1行空行)

Tips:多个简单的参数可以合并起来写——-n -s相当于-ns

使用命令cat -nET 1.txt,显示1.txt的内容,并标注行号(在行尾显示$、将Tab符显示为^I

2、ls命令

ls命令

加入参数-a增加...的目录显示

加入参数-A不显示...的目录(默认)加入参数-l显示详细信息加入参数-r反序显示

加入参数-t按时序显示加入参数-R显示当前目录中所有文件、子目录、子目录下的全部文件加入参数-F在目录后加/、在可执行文档后加*

使用示例

当前目录为/home/excious/lcmd

使用命令ls,查看当前目录下的文件/目录

使用命令ls -a,查看当前目录下的文件/目录(包括当前目录.和父目录..

使用命令ls -l,查看当前目录下的文件/目录的详细信息

使用命令ls -r,查看当前目录下的文件/目录,并反序显示

使用命令ls -t,查看当前目录下的文件/目录,并按创建时间排序(最新修改的的优先)

使用命令ls -tr,查看当前目录下的文件/目录,并按创建时间排序(最新修改的的最后)

使用命令ls -F,查看当前目录下的文件/目录,并分别用*/标识可执行文件和目录

使用命令ls -R,查看当前目录及其子目录下的文件/目录

3、find命令

find命令

使用参数-name可以当前目录及其子目录下名称匹配的文件/目录通过在最前面加入全局参数-maxdepth 1指定只在当前目录下查找使用参数-type指定文件类型

使用示例

当前目录为/home/excious/lcmd

使用命令tree,观察当前目录及其子目录下文件/目录的树形结构

使用命令find -name "*.txt"(省略了要查找的目录.,实际上是find . -name "*.txt"),查找当前目录及其子目录下文件名满足*.txt的文件/目录(*代表任意个任意字符,*.txt代表任意以.txt结尾的文件/目录)

使用命令find /home/excious/lcmd -name "*.txt",查找目录/home/excious/lcmd及其子目录下文件名以.txt结尾的文件/目录

上面两例其实查找的是同一个目录,一个的结果显示形式是相对路径,一个的结果显示形式是绝对路径,这是因为指定的查找路径形式不一样,因此可知find命令输出的形式取决于查找路径的形式

但是有时候,我们只想在某目录下查找,而不想在该目录的所有子目录下查找,因此我们可以加上参数-maxdepth 1限定向下查找的深度为1

使用命令find -maxdepth 1 -name "*.txt",查找当前目录.下文件名满足*.txt的文件/目录

使用命令find -maxdepth 1 -type d,查找当前目录.下所有目录文件(会把自己本身.算入)

4、grep命令

grep命令

一般使用格式grep 要查找的文件内容 要匹配的文件名格式加入参数-c统计所有查找的各个文件中,每个文件出现要查找内容的次数加入参数-B n显示文件中匹配到要查找内容的前n行的内容

加入参数-A n显示文件中匹配到要查找内容的后n行的内容加入参数-v反向查找,显示出所有查找文件中不包含要查找内容的行加入参数-r在对应目录及其子目录下进行查找(将要匹配的文件名格式换成要查找的目录)加入参数-E 正则表达式可以用正则表达式去匹配加入参数-l输出能够匹配要查找内容的文件的文件名

加入参数-L输出不能够匹配要查找内容的文件的文件名加入参数-n显示找到内容在文件中对应的行号加入参数-i查找时忽略大小写

使用示例

当前目录为/home/excious/lcmd

使用命令grep 12 *.txt,查找当前目录.下所有.txt文件内容中包含12的部分

使用命令grep -c 12 *.txt,查找当前目录.下所有.txt文件内容中12出现的次数

使用命令grep 12 -r .,查找当前目录.及其子目录下所有文件内容中包含12的部分

使用命令grep -E "^123456$" *.txt,查找当前目录.下所有.txt文件内容中满足正则表达式^123456$(即整行以123456开头并结尾,即整行为123456)的部分

使用命令grep -l 12 *.txt,查找当前目录.下所有.txt文件内容中包含12的文件名

使用命令grep -L 12 *.txt,查找当前目录.下所有.txt文件内容中不包含12的文件名

使用命令grep -n -B 1 -A 1 -E "^fdsfdsfds$" *.txt,查找当前目录.下所有.txt文件内容中匹配正则表达式^fdsfdsfds$(即整行为fdsfdsfds)的行,并标注行号,显示其前一行后和后一行内容(如果前一行或后一行也匹配,则不会重复显示)

使用命令grep -vn 12 *.txt,查找当前目录.下所有.txt文件内容中包含12的部分,并标注行号

5、wc命令

wc命令

wc 文件名显示文件的行数、单词数、字节数wc命令输入多个文件参数可以多个组合统计加入参数-l显示行数(默认)加入参数-w显示字数(默认)加入参数-c显示字节数(默认)

使用示例

当前目录为/home/excious/lcmd/examples/wc,当前目录下有两个文件1.txt2.txt,内容如下图所示:

使用命令wc 1.txt,统计该文件的行数、单词数、字节数

使用命令wc -l 1.txt,统计该文件的行数

使用命令wc -w 1.txt,统计该文件的单词数

使用命令wc -c 1.txt,统计该文件的字节数

使用命令wc 1.txt 2.txt,统计这两个文件的函数、单词数、字节数,包括总量

6、rm命令

rm命令

加入参数-r允许删除目录加入参数-f将不需要确认

使用示例

当前目录为/home/excious/lcmd/examples/rm,当前目录及其子目录结构如下图所示:

使用命令rm 1.txt 2.txt删除当前目录下的1.txt2.txt

使用命令rm -r rmtest1删除当前目录下rmtest1目录

Tips:常用rm -rf 文件/目录直接无确认删除某文件/目录

四、“渔”

菜鸟教程上 Linux命令大全 如下图所示

显然命令之多,一个个直接背是学不完的,也不容易记住,而且有的也不常用,没必要太刻意去记

下面提供如何根据你想要的操作,学习相关命令

下面,以“复制文件”为例:

首先,我不知道复制文件的命令是什么,于是,我先到百度上搜索Linux 复制文件,得到了以下搜索结果

简单扫视了几眼,我知道了Linux下复制文件的命令是cp,于是去菜鸟教程的Linux命令大全(/linux/linux-command-manual.html)上,按下Ctrl + F查找cp

点进去看看,重点看实例语法两个部分(想要了解更多参数,再去看看参数说明部分)

有了大致了解后,先解决自己当前想要解决的问题——“怎么复制文件”,看了语法知道了cp命令的基础用法cp 源文件路径 目标路径

到自己虚拟机上试试,创建了一个新的目录/home/excious/lcmd/examples/cp测试用,在目录下创建个s.txt测试用

使用命令cp s.txt s2.txt将当前目录下的s.txt文件复制到当前目录下重命名为s2.txt,用cat命令查看,发现文件内容确实一致,复制成功,这样这么一条命令的基础使用就学会了

这时,如果我还想了解更多cp命令的参数用法,就去看看菜鸟驿站上给出的参数说明,然后在自己的虚拟机上测试并总结(看着麻烦的不懂的,可以暂时先不看,看简单点的)

先看到了参数-a,不过看上面的其作用等于dpR参数组合可以知道这个参数是其他参数的组合,先把其他参数过一遍再来看

然后看到了参数-d,了解到这是关于复制链接的,注意到下面也有参数-l提到链接(其实也是后来才发现的),觉得可以做个对照观察区别,感觉不一定好理解,也暂时先不看,留着最后看

接着看到下一个参数-f,这个好理解,就是覆盖文件的时候不提示,注意到下面也有参数-i提到(其实也是后来才发现的),觉得可以做个对照观察区别,一起测试了

实操一下,先重写s.txt文件的内容,用cat命令观察一下s.txts2.txt的内容,然后先尝试一下不加参数想覆盖是什么样的情况,发现直接使用命令cp s.txt s2.txt不加参数-f并不会给出“是否覆盖”的提示,用cat命令也观察到文件内容确实被覆盖了

据此可以猜想,-f是默认参数,也就是说默认就会不提示直接覆盖,本着探索的精神,还是再尝试一下加上-f-i会是怎么样的情况吧

测试加上参数-f的情况:先重写s.txt文件的内容,用cat命令观察一下s.txts2.txt的内容,尝试一下加上参数-f覆盖复制是什么样的情况,发现直接使用命令cp -f s.txt s2.txt和上面不加参数的情况一样,并不会给出“是否覆盖”的提示,用cat命令也观察到文件内容确实被覆盖了

再测试加上参数-i的情况:先重写s.txt文件的内容,用cat命令观察一下s.txts2.txt的内容,尝试一下加上参数-i覆盖复制是什么样的情况,发现直接使用命令cp -i s.txt s2.txt时,会给出提示询问是否覆盖{输入n时并不会进行覆盖输入y时将进行覆盖\begin{cases} 输入 \; n \;时并不会进行覆盖\\ 输入 \; y \;时将进行覆盖 \end{cases}{输入n时并不会进行覆盖输入y时将进行覆盖​

Tips:每次解读完一个参数,都可以记录下来一些笔记,最后整合

下一个参数是-p,是复制文件时间、访问权限等信息的相关的,我觉得这个很简单,自己大概也不会很经常用到,可以记录下来,就懒得实操了(当然,如果时间多我很闲,我会考虑也搞个对照,记录一下的😂😂😂)

下一个参数是-r,是可以复制整个目录的参数,这个不麻烦,也好理解

实操一下,先建立个新的文件夹testr,进入到该目录,然后新建一个new.txt的文件,随便写入一点内容,返回到上一级

先试试如果不加入参数-r想要复制整个目录会是什么情况,可以看到会提示需要加入参数-r才能复制目录

再试试加上参数-r的效果,使用命令cp -r ./testr/ ./new/,可以明显发现,testr整个目录下的所有文件都被复制到了当前目录下,并且将这个目录改名成了new(而不是新建一个new目录,再把testr这个目录放到new目录下)

于是又产生了一个疑问,刚刚是因为不存在new这个目录,所以把testr这个目录复制并且重命名了,那现在有了这个new目录,同样的命令会不会把testr这个目录放到new目录下呢?

再次输入同样的命令cp -r ./testr/ ./new/,观察结果,果然如我猜想的那样,在目标目录存在的情况下,是不会复制并重命名,而是复制到该目录下

解决了一个疑惑,又产生了一个新的疑惑——之前是路径中最后一级目录不存在(./new/中的./存在,./下的new/不存在),那如果是路径中最后两级或多级目录都不存在呢?(比如./new2/new3/这样的,./存在,./下没有new2目录,也就更不存在new2目录下的new3目录)

继续探索一下,输入命令cp -r ./testr/ ./new2/new3/,可以发现,命令报错了,无法成功执行

那么,根据上面三次实验,总结出结论就是

cp -r 源目录 目标目录路径{目标目录路径存在将源目录按源目录名复制到目标目录下目标目录路径只有最后一级不存在将源目录复制到最后一级存在的目录下,并重命名为不存在的目录名目标目录路径有最后两级或多级不存在命令报错,无法执行\begin{cases} 目标目录路径存在 & 将源目录按源目录名复制到目标目录下 \\ 目标目录路径只有最后一级不存在 & 将源目录复制到最后一级存在的目录下,并重命名为不存在的目录名 \\ 目标目录路径有最后两级或多级不存在 & 命令报错,无法执行 \\ \end{cases}⎩⎪⎨⎪⎧​目标目录路径存在目标目录路径只有最后一级不存在目标目录路径有最后两级或多级不存在​将源目录按源目录名复制到目标目录下将源目录复制到最后一级存在的目录下,并重命名为不存在的目录名命令报错,无法执行​

最后回顾一下之前没有看的两个链接参数-l-d

因为之前测试过,测试的不是很顺利,网上查了查,知道了这是Linux操作系统里硬链接软链接的问题

先创建个测试文件夹ldtest,然后cd进去

先测试参数-d(网上听说这是软链接,相当于快捷方式【后来想想这个说法有问题】),创建一个d.txt文件,随便写点东西,然后cp -d d.txt d-d.txt,然后rm命令删除源文件d.txt,用cat命令查看链接文件d-d.txt时,发现仍然可以正常读取,这出乎了我的预料,我暂时无法解释这一点

再测试参数-l(网上听说这是硬链接,学过操作系统原理应该知道,Linux系统使用索引节点来记录文件信息,这个复制应该就是复制出一个文件,让其指向同一个索引节点),创建一个l.txt文件,随便写点东西,然后cp -l l.txt l-l,然后rm命令删除源文件l.txt,用cat命令查看链接文件l-l.txt时,发现仍然可以正常读取,这倒是在意料之中

对于之前-d参数仍然存疑,网上又重新搜索了一下cp -d

看了很多结果,大致都在说,若源文件为链接文件,则复制链接文件,而非被链接文件本身,重新理解了这句话,大概意思应该是复制快捷方式时,直接复制快捷方式,而不是复制快捷方式对应的文件

那快捷方式要怎么复制呢?看了网上的说法,设置参数-s才是软链接,复制快捷方式

继续实操探索,创建一个s.txt文件,随便写点东西,然后cp -s s.txt s-s.txt,然后rm命令删除源文件s.txt,用cat命令查看链接文件s-s.txt时,发现已经不能正常读取了,所以正确的说法应该为设置参数-s生成快捷方式(软链接

现在知道了参数-s生成软链接(快捷方式)、参数-l生成硬链接,我们重新探索一下参数-d的功能

实操一下,创建一个s.txt文件,随便写点东西,然后cp -s s.txt s-s.txt生成s.txt的快捷方式s-s.txt,然后cp -d s-s.txt d-s-s.txt生成s-s.txt这一快捷方式的拷贝d-s-s.txt(还是一个快捷方式),然后rm命令删除源文件s.txt,用cat命令查看链接文件s-s.txtd-s-s.txt时,发现都不能正常读取了

因此,大致可以猜想,cp命令在复制链接文件(快捷方式)时,默认会复制其所对应的源文件而非快捷方式本身

继续实操来验证猜想,创建一个s.txt文件,随便写点东西,然后cp -s s.txt s-s.txt生成s.txt的快捷方式s-s.txt,然后cp s-s.txt new-s.txt生成s-s.txt这一快捷方式对应的源文件的拷贝new-s.txt,然后rm命令删除源文件s.txt,用cat命令查看链接文件s-s.txt时,发现不能正常读取了,用cat命令查看文件new-s.txt时,发现读取正常,因此,这一猜想得以证实

最后整合之前对cp命令每个参数的理解,如下:

cp命令

加入参数-r才可以复制目录及目录下的所有文件

\;

cp -r 源目录 目标目录路径{目标目录路径存在将源目录按源目录名复制到目标目录下目标目录路径只有最后一级不存在将源目录复制到最后一级存在的目录下,并重命名为不存在的目录名目标目录路径有最后两级或多级不存在命令报错,无法执行\begin{cases} 目标目录路径存在 & 将源目录按源目录名复制到目标目录下 \\ 目标目录路径只有最后一级不存在 & 将源目录复制到最后一级存在的目录下,并重命名为不存在的目录名 \\ 目标目录路径有最后两级或多级不存在 & 命令报错,无法执行 \\ \end{cases}⎩⎪⎨⎪⎧​目标目录路径存在目标目录路径只有最后一级不存在目标目录路径有最后两级或多级不存在​将源目录按源目录名复制到目标目录下将源目录复制到最后一级存在的目录下,并重命名为不存在的目录名命令报错,无法执行​加入参数-p复制访问权限和修改时间加入参数-l,不复制文件,只生成链接(硬链接

加入参数-s,生成链接(软链接,快捷方式,链接文件)

加入参数-d,若复制的源文件为快捷方式,则生成的目标文件也为快捷方式(不加参数-d的默认情况是,复制快捷方式时,将复制快捷方式所对应的文件)加入参数-f,覆盖文件不提示(默认情况)

加入参数-i,覆盖文件要提示

就是这样的过程:

你想学会复制文件→你想了解cp命令的基本使用→你想了解cp命令的更多用法你想学会复制文件→你想了解cp命令的基本使用→你想了解cp命令的更多用法你想学会复制文件→你想了解cp命令的基本使用→你想了解cp命令的更多用法

如果以后要用到,大概自己能想到曾经记录过这么一些笔记,翻翻自己的笔记、看看自己的示例,就能知道怎么使用、有哪些注意点(或者可能探索的时候花了很长时间,印象深刻,能记在脑子里很长时间)

这就是我学习Linux命令的方法,把“渔”也给你们😁😁😁

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。