Linux学习笔记-Shell与常用命令

Shell

在计算机科学中,Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序。
同时它又是一种程序设计语言。作为命令语言,它交互式解释和执行用户输入的命令或者自动地解释和执行预先设定好的一连串的命令;作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支。
传统意义上的shell指的是命令行式的shell,以后如果不特别注明,shell是指命令行式的shell。
文字操作系统与外部最主要的接口就叫做shell。shell是操作系统最外面的一层。shell管理你与操作系统之间的交互:等待你输入,向操作系统解释你的输入,并且处理各种各样的操作系统的输出结果。实际上Shell就是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。
shell提供了你与操作系统之间通讯的方式。这种通讯可以以交互方式(从键盘输入,并且可以立即得到响应),或者以shell script(非交互)方式执行。shell script是放在文件中的一串shell和操作系统命令,它们可以被重复使用。本质上,shell script是命令行命令简单的组合到一个文件里面。
Shell基本上是一个命令解释器,类似于DOS下的COMMAND.COM。它接收用户输入的命令(如ls等),然后调用相应的应用程序。较为通用的shell有标准的Bourne shell和C Shell。
在这里插入图片描述

交互式shell和非交互式shell

交互式模式就是shell等待用户的输入,并且执行用户提交的命令。这种模式被称作交互式是因为shell与用户进行交互。这种模式也是大多数用户非常熟悉的:登录、执行一些命令、签退。当用户签退后,shell也终止了。
shell也可以运行在另外一种模式:非交互式模式。在这种模式下,shell不与用户进行交互,而是读取存放在文件中的命令,并且执行它们。当它读到文件的结尾,shell也就终止了。

Shell交互工具

命令行界面

命令行界面(英语:Command-line Interface,缩写:CLI)是在图形用户界面得到普及之前使用最为广泛的用户界面,它通常不支持鼠标,用户通过键盘输入指令,计算机接收到指令后,予以执行。
linux的服务器版本就是只提供了命令行界面,用户使用键盘输入,显示器作为输出;

终端

终端 (Terminal),其词汇本身的意义为「终点站;末端;(电路)的端子,线接头」。而在计算机领域,终端则是一种用来让用户输入数据至计算机,以及显示其计算结果的机器。
也就是说,终端只是一种用于与计算机进行交互的输入输出设备,其本身并不提供运算处理功能。
现在常说的终端是指在图形界面中的终端模拟器(Terminal Emulator),对于那些命令行 (CLI) 程序,终端模拟器会「假装」成一个传统终端设备;而对于现代的图形接口,终端模拟器会「假装」成一个 GUI 程序。一个终端模拟器的标准工作流程是这样的:

1.捕获你的键盘输入;
2.将输入发送给命令行程序(程序会认为这是从一个真正的终端设备输入的);
3.拿到命令行程序的输出结果(STDOUT 以及 STDERR);
4.调用图形接口(比如 X11),将输出结果渲染至显示器。

Shell程序

shell程序就是一个包含若干行shell或者linux命令的文件。它由列在档案内的命令所构成。此程序在编辑器中编辑(虽然也可以直接在命令列下写作程序,online scripting),由 UNIX 命令和基本的程序结构,例如变量的指定、测试条件、和循环所构成。我们不需要编译shell命令档。Shell 本身会解译命令档中的每一行,就如同由键盘输入一样。shell负责解译命令,而使用者则必须了解这些命令能做什么。

构成Shell程序的基本命令

文件管理

ls-查看文件信息

ls的全称:list files,ls命令用于显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。

ls [-alrtAFR] [name...]

ls参数:

	-a :全部的档案,连同隐藏档( 开头为 . 的档案) 一起列出来~ 
	-A :全部的档案,连同隐藏档,但不包括 ... 这两个目录,一起列出来~ 
	-d :仅列出目录本身,而不是列出目录内的档案数据 
	-f :直接列出结果,而不进行排序 (ls 预设会以档名排序!) 
	-F :根据档案、目录等信息,给予附加数据结构,例如: 
		*:代表可执行档; /:代表目录; =:代表 socket 档案; |:代表 FIFO 档案; 
	-h :将档案容量以人类较易读的方式(例如 GB, KB 等等)列出来; 
	-i :列出 inode 位置,而非列出档案属性; 
	-l :长数据串行出,包含档案的属性等等数据; 
	-n :列出 UID 与 GID 而非使用者与群组的名称 (UID与GID会在账号管理提到!) 
	-r :将排序结果反向输出,例如:原本档名由小到大,反向则为由大到小; 
	-R :连同子目录内容一起列出来; 
	-S :以档案容量大小排序! 
	-t :依时间排序 
	--color=never :不要依据档案特性给予颜色显示; 
	--color=always :显示颜色 
	--color=auto :让系统自行依据设定来判断是否给予颜色 
	--full-time :以完整时间模式 (包含年、月、日、时、分) 输出 
	--time={atime,ctime} :输出 access 时间或 改变权限属性时间 (ctime) ,而非内容变更时间 (modification time)  

可以使用alias来写常用的组合命令缩写,系统目前默认的自定义命令有:

alias alert='notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e '\''s/^\s*[0-9]\+\s*//;s/[;&|]\s*alert$//'\'')"'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l='ls -CF'
alias la='ls -A'
alias ll='ls -alF'
alias ls='ls --color=auto'

常用ll='ls -alF’来查看文件的所有文件常用信息;
在这里插入图片描述
如果需要查看软链接和硬链接的信息,就需要加上-i;
在这里插入图片描述
可以看到iNode节点信息,foo.txt硬链接hard-link-foo指向的是922030,同foo.txt指向的节点是一样的;foo.txt的软链接是新的iNode928887,内部记录了指向foo.txt的iNode;

ln-链接

ln的全称link files;
ln的功能是为某一个文件在另外一个位置建立一个同步的链接,可以将链接文件看做是源文件的引用或者别名。
当我们需要在不同的目录,用到相同的文件时,我们不需要在每一个需要的目录下都放一个必须相同的文件,我们只要在某个固定的目录,放上该文件,然后在 其它的目录下用ln命令链接(link)它就可以,不必重复的占用磁盘空间。

ln [参数][源文件或目录][目标文件或目录]

参数列表:

	-b 删除,覆盖以前建立的链接
	-d 允许超级用户制作目录的硬链接
	-f 强制执行
	-i 交互模式,文件存在则提示用户是否覆盖
	-n 把符号链接视为一般目录
	-s 软链接(符号链接)
	-v 显示详细的处理过程
	-S "-S<字尾备份字符串> ""--suffix=<字尾备份字符串>"
	-V "-V<备份方式>""--version-control=<备份方式>"
	--help 显示帮助信息
	--version 显示版本信息

在 Linux 系统中 ,inode 号才是文件的唯一标识而非文件名。文件名只是为了方便人们的记忆和适用。
“ls -li” 结果中的第一列就是文件的 inode 号。系统是通过 inode 号寻找正确的文件数据块。
文件的实际内容则保存在 block 中(大小可以是 1KB、2KB 或 4KB),一个 inode 的默认大小为 128B (在 Ext3 文件系统中),记录一个 block 则消耗 4B 。当文件的 inode 被写满后,Linux 系统会自动分配出一个 Block 块,专门用于像 innode 那样记录其他 block 块的信息,这样能把各个 block 块的内容串到一起,就能够让用户读到完整的文件内容了。
xxx

可以使用stat / | grep "IO Block"查看文件系统中一个block的大小;
在这里插入图片描述

Linux文件系统中,链接又可分为两种 : 硬链接(hard link)与软链接(symbolic link)。
不论是硬链接或软链接都不会将原本的档案复制一份,只会占用非常少量的硬盘空间。

硬链接

硬链接的意思是一个文件可以有多个名称,新建的硬链接文件只是源文件在当前文件的一个引用,注意:硬链接是必须存在同一个文件系统中。
创建硬链接只需要使用ln 源文件 链接文件名
在这里插入图片描述
注意:

1.不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变。
2.不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件都可以被访问。
3.硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
4.硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
5.硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂
软链接

软链接是产生一个特殊的文件,该文件的内容记录了指向另一个文件的位置。不同于硬链接,软链接可以跨越不同的文件系统。
创建软链接只需要使用ln -s 源文件 链接文件名
在这里插入图片描述
注意:

1.不论是修改源文件,还是修改硬链接文件,另一个文件中的数据都会发生改变。
2.软链接会新建自己的inode信息和block,只是在block中不存储实际文件数据,而存储的是源文件的文件名及inode号。
3.删除软链接文件,源文件不受影响。而删除原文件,软链接文件将找不到实际的数据,从而显示文件不存在。
4.软链接可以链接目录。
5.软链接可以跨分区。

rm-删除文件

rm:remove,用于删除一个文件或者目录。

rm [options] name...

参数列表:

-i 删除前逐一询问确认。
-f 即使原档案属性设为唯读,亦直接删除,无需逐一确认。
-r 将目录及以下之档案亦逐一删除。

注意:使用rm删除文件夹,需要配合使用参数-r;
使用rm删除多个文件:
在这里插入图片描述
使用rm删除文件夹
如果不使用-r,提示错误信息;
在这里插入图片描述
使用-r参数,可以删除文件夹dir1;
在这里插入图片描述

cp-拷贝

cp全称为copy file,用于复制文件或目录。

cp [options] source dest
cp [options] source... directory

参数列表

-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于dpR参数组合。
-d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。
-f:覆盖已经存在的目标文件而不给出提示。
-i:与 -f 选项相反,在覆盖目标文件之前给出提示,要求用户确认是否覆盖,回答 y 时目标文件将被覆盖。
-p:除复制文件的内容外,还把修改时间和访问权限也复制到新文件中。
-r:若给出的源文件是一个目录文件,此时将复制该目录下所有的子目录和文件。
-l:不复制文件,只是生成链接文件。

mv-移动/重命名

mv的全称为move file,用来为文件或目录改名、或将文件或目录移入其它位置。

mv [options] source dest
mv [options] source... directory

参数列表:

-b: 当目标文件或目录存在时,在执行覆盖前,会为其创建一个备份。
-i: 如果指定移动的源目录或文件与目标的目录或文件同名,则会先询问是否覆盖旧文件,输入y表示直接覆盖,输入n表示取消该操作。
-f: 如果指定移动的源目录或文件与目标的目录或文件同名,不会询问,直接覆盖旧文件。
-n: 不要覆盖任何已存在的文件或目录。
-u:当源文件比目标文件新或者目标文件不存在时,才执行移动操作。
drwxrwxr-x 4 liu liu 4096 Jun 21 11:09 ./
drwxr-xr-x 7 liu liu 4096 Jun 21 11:09 ../
drwxrwxr-x 3 liu liu 4096 Jun 18 09:42 c_code/
-rw-rw-r-- 1 liu liu  233 Jun 21 11:09 file_copy.txt
-rw-rw-r-- 1 liu liu  233 Jun 21 11:09 file.txt
drwxrwxr-x 2 liu liu 4096 Jun  4 01:48 py_code/
[liu@h:code]$mv file.txt -b file_copy.txt
[liu@h:code]$ll
total 24
drwxrwxr-x 4 liu liu 4096 Jun 21 11:10 ./
drwxr-xr-x 7 liu liu 4096 Jun 21 11:09 ../
drwxrwxr-x 3 liu liu 4096 Jun 18 09:42 c_code/
-rw-rw-r-- 1 liu liu  233 Jun 21 11:09 file_copy.txt
-rw-rw-r-- 1 liu liu  233 Jun 21 11:09 file_copy.txt~
drwxrwxr-x 2 liu liu 4096 Jun  4 01:48 py_code/

使用-b参数后,当前文件夹多了一个file_copy.txt~文件;

chmod-修改文件权限

chmod的全称是change mode,是控制用户对文件的权限的命令。
linux中的文件调用权限分为三级 : 文件所有者(Owner)、用户组(Group)、其它用户(Other Users)。
在这里插入图片描述
RWX对应的是Read-Write-Execute,分别对应的是22,21,20;不同的文件权限组合出不同的数值,例如7表示111,即RWE,3表示011,即-WE;
在这里插入图片描述

chmod [-cfvR] [--help] [--version] mode file...

参数列表

-c : 若该文件权限确实已经更改,才显示其更改动作
-f : 若该文件权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有文件与子目录进行相同的权限变更(即以递归的方式逐个变更)
--help : 显示辅助说明
--version : 显示版本

其中mode表示了数值或者模式,具体表示

[ugoa...][[+-=][rwxX]...][,...]

其中:

who用户类型说明
uuser文件的拥有者
ggroup与该文件的拥有者属于同一个群体(group)者
oothers其他以外的人
aallall
Operator说明
+增加权限
-取消权限
=唯一设定权限
模式名字说明
r设置为可读权限
w设置为可写权限
x执行权限设置为可执行权限
X特殊执行权限只有当文件为目录文件,或者其他类型的用户有可执行权限时,才将文件权限设置可执行
ssetuid/gid当文件被执行时,根据who参数指定的用户类型设置文件的setuid或者setgid权限
t粘贴位设置粘贴位,只有超级用户可以设置该位,只有文件所有者u可以使用该位

对文件夹内的foo文件设置权限,ugo去掉读权限,o增加执行权限;
在这里插入图片描述

压缩与备份

tar

tar的全称为tape archive,功能为用于备份文件。
tar是用来建立,还原备份文件的工具程序,它可以加入,解开备份文件内的文件。

tar [-ABcdgGhiklmMoOpPrRsStuUvwWxzZ][-b <区块数目>][-C <目的目录>][-f <备份文件>][-F <Script文件>][-K <文件>][-L <媒体容量>][-N <日期时间>][-T <范本文件>][-V <卷册名称>][-X <范本文件>][-<设备编号><存储密度>][--after-date=<日期时间>][--atime-preserve][--backuup=<备份方式>][--checkpoint][--concatenate][--confirmation][--delete][--exclude=<范本样式>][--force-local][--group=<群组名称>][--help][--ignore-failed-read][--new-volume-script=<Script文件>][--newer-mtime][--no-recursion][--null][--numeric-owner][--owner=<用户名称>][--posix][--erve][--preserve-order][--preserve-permissions][--record-size=<区块数目>][--recursive-unlink][--remove-files][--rsh-command=<执行指令>][--same-owner][--suffix=<备份字尾字符串>][--totals][--use-compress-program=<执行指令>][--version][--volno-file=<编号文件>][文件或目录...]

参数列表为:

-A或--catenate 新增文件到已存在的备份文件。
-b<区块数目>或--blocking-factor=<区块数目> 设置每笔记录的区块数目,每个区块大小为12Bytes。
-B或--read-full-records 读取数据时重设区块大小。
-c或--create 建立新的备份文件。
-C<目的目录>或--directory=<目的目录> 切换到指定的目录。
-d或--diff或--compare 对比备份文件内和文件系统上的文件的差异。
-f<备份文件>或--file=<备份文件> 指定备份文件。
-F<Script文件>或--info-script=<Script文件> 每次更换磁带时,就执行指定的Script文件。
-g或--listed-incremental 处理GNU格式的大量备份。
-G或--incremental 处理旧的GNU格式的大量备份。
-h或--dereference 不建立符号连接,直接复制该连接所指向的原始文件。
-i或--ignore-zeros 忽略备份文件中的0 Byte区块,也就是EOF。
-k或--keep-old-files 解开备份文件时,不覆盖已有的文件。
-K<文件>或--starting-file=<文件> 从指定的文件开始还原。
-l或--one-file-system 复制的文件或目录存放的文件系统,必须与tar指令执行时所处的文件系统相同,否则不予复制。
-L<媒体容量>或-tape-length=<媒体容量> 设置存放每体的容量,单位以1024 Bytes计算。
-m或--modification-time 还原文件时,不变更文件的更改时间。
-M或--multi-volume 在建立,还原备份文件或列出其中的内容时,采用多卷册模式。
-N<日期格式>或--newer=<日期时间> 只将较指定日期更新的文件保存到备份文件里。
-o或--old-archive或--portability 将资料写入备份文件时使用V7格式。
-O或--stdout 把从备份文件里还原的文件输出到标准输出设备。
-p或--same-permissions 用原来的文件权限还原文件。
-P或--absolute-names 文件名使用绝对名称,不移除文件名称前的"/"号。
-r或--append 新增文件到已存在的备份文件的结尾部分。
-R或--block-number 列出每个信息在备份文件中的区块编号。
-s或--same-order 还原文件的顺序和备份文件内的存放顺序相同。
-S或--sparse 倘若一个文件内含大量的连续0字节,则将此文件存成稀疏文件。
-t或--list 列出备份文件的内容。
-T<范本文件>或--files-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让tar解开或建立符合设置条件的文件。
-u或--update 仅置换较备份文件内的文件更新的文件。
-U或--unlink-first 解开压缩文件还原文件之前,先解除文件的连接。
-v或--verbose 显示指令执行过程。
-V<卷册名称>或--label=<卷册名称> 建立使用指定的卷册名称的备份文件。
-w或--interactive 遭遇问题时先询问用户。
-W或--verify 写入备份文件后,确认文件正确无误。
-x或--extract或--get 从备份文件中还原文件。
-X<范本文件>或--exclude-from=<范本文件> 指定范本文件,其内含有一个或多个范本样式,让ar排除符合设置条件的文件。
-z或--gzip或--ungzip 通过gzip指令处理备份文件。
-Z或--compress或--uncompress 通过compress指令处理备份文件。
-<设备编号><存储密度> 设置备份用的外围设备编号及存放数据的密度。
--after-date=<日期时间> 此参数的效果和指定"-N"参数相同。
--atime-preserve 不变更文件的存取时间。
--backup=<备份方式>或--backup 移除文件前先进行备份。
--checkpoint 读取备份文件时列出目录名称。
--concatenate 此参数的效果和指定"-A"参数相同。
--confirmation 此参数的效果和指定"-w"参数相同。
--delete 从备份文件中删除指定的文件。
--exclude=<范本样式> 排除符合范本样式的文件。
--group=<群组名称> 把加入设备文件中的文件的所属群组设成指定的群组。
--help 在线帮助。
--ignore-failed-read 忽略数据读取错误,不中断程序的执行。
--new-volume-script=<Script文件> 此参数的效果和指定"-F"参数相同。
--newer-mtime 只保存更改过的文件。
--no-recursion 不做递归处理,也就是指定目录下的所有文件及子目录不予处理。
--null 从null设备读取文件名称。
--numeric-owner 以用户识别码及群组识别码取代用户名称和群组名称。
--owner=<用户名称> 把加入备份文件中的文件的拥有者设成指定的用户。
--posix 将数据写入备份文件时使用POSIX格式。
--preserve 此参数的效果和指定"-ps"参数相同。
--preserve-order 此参数的效果和指定"-A"参数相同。
--preserve-permissions 此参数的效果和指定"-p"参数相同。
--record-size=<区块数目> 此参数的效果和指定"-b"参数相同。
--recursive-unlink 解开压缩文件还原目录之前,先解除整个目录下所有文件的连接。
--remove-files 文件加入备份文件后,就将其删除。
--rsh-command=<执行指令> 设置要在远端主机上执行的指令,以取代rsh指令。
--same-owner 尝试以相同的文件拥有者还原文件。
--suffix=<备份字尾字符串> 移除文件前先行备份。
--totals 备份文件建立后,列出文件大小。
--use-compress-program=<执行指令> 通过指定的指令处理备份文件。
--version 显示版本信息。
--volno-file=<编号文件> 使用指定文件内的编号取代预设的卷册编号。

用tar来压缩文件,使用参数为czvf,意思是使用gzip指令,建立新的备份文件,显示指令的执行过程,从当前文件压缩到目标文件tar.gz文件中;

wang@myubuntu:~/projects$ tar -czvf file.tar.gz file.txt 
file.txt
wang@myubuntu:~/projects$ ll
total 16
drwxrwxr-x 2 wang wang 4096 Jun 26 14:22 ./
drwxr-xr-x 7 wang wang 4096 Jun 26 14:21 ../
-rw-rw-r-- 1 wang wang  793 Jun 26 14:22 file.tar.gz
-rw-rw-r-- 1 wang wang 1276 Jun 26 14:21 file.txt

用tar来解压缩文件,使用参数为xzvf,意思是使用gzip指令从备份文件中恢复文件,并显示指令执行过程,从tar.gz文件解压到目标文件中;

wang@myubuntu:~/projects$ tar -xzvf file.tar.gz 
file.txt
wang@myubuntu:~/projects$ ll
total 16
drwxrwxr-x 2 wang wang 4096 Jun 26 14:23 ./
drwxr-xr-x 7 wang wang 4096 Jun 26 14:21 ../
-rw-rw-r-- 1 wang wang  793 Jun 26 14:22 file.tar.gz
-rw-rw-r-- 1 wang wang 1276 Jun 26 14:21 file.txt

用tar来查看压缩备份文件中文件列表;使用参数-tzvf;与之前命令有所不同的地方是使用了t,t是用来列出备份文件的内容;

wang@myubuntu:~/projects$ tar -tzvf file.tar.gz 
-rw-rw-r-- wang/wang      1276 2021-06-26 14:21 file.txt

系统设置

alias

alias命令用于设置指令的别名。
用户可利用alias,自定指令的别名。
若仅输入alias,则可列出目前所有的别名设置。
注意:alias的效力仅及于该次登入的操作。若要每次登入是即自动设好别名,可在.profile或.cshrc中设定指令的别名。

alias[别名]=[指令名称]

使用alias查看当前所有别名列表:
在这里插入图片描述

磁盘管理

tree-查看树形结构

使用whatis查看tree的功能,tree是使用树形结构显示当前文件夹内文件和文件夹的组成结构;
在这里插入图片描述

tree [-aACdDfFgilnNpqstux][-I <范本样式>][-P <范本样式>][目录...]

tree参数有:

-a 显示所有文件和目录。
-A 使用ASNI绘图字符显示树状图而非以ASCII字符组合。
-C 在文件和目录清单加上色彩,便于区分各种类型。
-d 显示目录名称而非内容。
-D 列出文件或目录的更改时间。
-f 在每个文件或目录之前,显示完整的相对路径名称。
-F 在执行文件,目录,Socket,符号连接,管道名称名称,各自加上"*","/","=","@","|"号。
-g 列出文件或目录的所属群组名称,没有对应的名称时,则显示群组识别码。
-i 不以阶梯状列出文件或目录名称。
-L level 限制目录显示层级。
-l 如遇到性质为符号连接的目录,直接列出该连接所指向的原始目录。
-n 不在文件和目录清单加上色彩。
-N 直接列出文件和目录名称,包括控制字符。
-p 列出权限标示。
-P<范本样式> 只显示符合范本样式的文件或目录名称。
-q 用"?"号取代控制字符,列出文件和目录名称。
-s 列出文件或目录大小。
-t 用文件和目录的更改时间排序。
-u 列出文件或目录的拥有者名称,没有对应的名称时,则显示用户识别码。
-x 将范围局限在现行的文件系统中,若指定目录下的某些子目录,其存放于另一个文件系统上,则将该子目录予以排除在寻找范围外。

一般情况下,tree命令需要安装,可以根据提示进行安装;
我在Ubuntu下安装命令是:sudo apt install tree;
在这里插入图片描述
在命令行中查看当前文件夹内容,显示效果如下:
在这里插入图片描述

mkdir

mkdir的全称是make directory,用于创建目录。

mkdir [-p] dirName
-p 确保目录名称存在,不存在的就建一个。

在当前目录下,创建空文件夹,直接使用mkdir,不用参数-p,如果一次创建多层不存在的文件夹,就需要使用参数-p;
在当前目录下,创建一个空文件夹dir,再在dir中创建空文件夹dir1;

wang@myubuntu:~/projects$ tree
.
└── foo.txt
0 directories, 1 file
wang@myubuntu:~/projects$ mkdir -p dir/dir1
wang@myubuntu:~/projects$ tree
.
├── dir
│   └── dir1
└── foo.txt
2 directories, 1 file

rmdir

用于删除空的目录。

rmdir [-p] dirName
-p 是当子目录被删除后使它也成为空目录的话,则顺便一并删除。

删除空文件夹,直接rmdir dir1;
在这里插入图片描述
如果dir1文件夹内有东西时,会删除失败;

wang@myubuntu:~/projects$ rmdir dir1/
rmdir: failed to remove 'dir1/': Directory not empty

如果只有空文件夹,就可以使用-p参数,先删除最末尾空文件夹后,如果次末尾文件夹也是空文件夹,也就会被删除;

wang@myubuntu:~/projects$ tree
.
├── dir1
│   └── dir
└── foo.txt
2 directories, 1 file
wang@myubuntu:~/projects$ rmdir dir1/dir/
wang@myubuntu:~/projects$ tree
.
└── foo.txt
0 directories, 1 file

在dir文件夹下创建一个空文件夹dir1,一个文本文件hello.txt;
使用rmdir -p ./dir/dir1;

wang@myubuntu:~/projects$ tree
.
├── dir
│   ├── dir1
│   └── hello.txt
└── foo.txt
2 directories, 2 files
wang@myubuntu:~/projects$ rmdir -p dir/dir1/
rmdir: failed to remove directory 'dir': Directory not empty
wang@myubuntu:~/projects$ tree
.
├── dir
│   └── hello.txt
└── foo.txt
1 directory, 2 files

可以看到有错误提示“rmdir: failed to remove directory ‘dir’: Directory not empty”,只删除了dir1文件夹;
可以使用rm -r来代替;

参考资料

1.Shell百度百科
2.ln - 软链接与硬链接区别
3.linux 软连接和硬链接的区别(看一遍就懂)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黑山老妖的笔记本

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值