注:前言、目录见 /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.txt
、02.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/excious
,ls ~-
就相当于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.txt
和new1
,将其作为输出 第三个命令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.txt
和2.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.txt
和2.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.txt
和s2.txt
的内容,然后先尝试一下不加参数想覆盖是什么样的情况,发现直接使用命令cp s.txt s2.txt
不加参数-f
并不会给出“是否覆盖”的提示,用cat
命令也观察到文件内容确实被覆盖了
据此可以猜想,-f
是默认参数,也就是说默认就会不提示直接覆盖,本着探索的精神,还是再尝试一下加上-f
和-i
会是怎么样的情况吧
测试加上参数-f
的情况:先重写s.txt
文件的内容,用cat
命令观察一下s.txt
和s2.txt
的内容,尝试一下加上参数-f
覆盖复制是什么样的情况,发现直接使用命令cp -f s.txt s2.txt
和上面不加参数的情况一样,并不会给出“是否覆盖”的提示,用cat
命令也观察到文件内容确实被覆盖了
再测试加上参数-i
的情况:先重写s.txt
文件的内容,用cat
命令观察一下s.txt
和s2.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.txt
和d-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命令的方法,把“渔”也给你们😁😁😁