1.简单命令使用
【1】命令提示符解释
[ylp@localhost~]$
[1] ylp 当前登录主机的用户名
[2] localhost 表示当前登录主机的主机名
[3] ~ 表示用户当前所处的目录,不是一个固定的目录名称,而是bash中一个特别的变量,代表当前登录用户的
一个私有目录“家目录”
举例来说
A. 我已用户ylp来登录,那么“~”就代表ylp的家目录
B. 我已根用户root的身份登录系统,那么“~”就代表根用户root的家目录
[4] []后面的符号根据bash的传统表示了用户的类型
A. 普通用户的提示符以“$”结尾
B.根用户以“#”结尾
【2】whoami使用
[ylp@localhost~]$ whoami
ylp
//输出当前登录的用户名
[ylp@localhost~]$ whoami --help
//将输出whoami命令简短的帮助文档
[ylp@localhost~]$ whoami --version
//将输出whoami命令的简短的版本信息
//--表示长选项
【3】echo
[ylp@localhost~]$ echo "hello,linux."
hello,linux.
//这个命令带了一个参数,就是字符串“hello,linux.”
[ylp@localhost~]$ echo -n "hello,linux."
hello,linux.[ylp@localhost~]$
//这个命令表示回显指定字符串后不换行
[ylp@localhost~]$ echo -e "hello,linux.\n\n"
hello,linux.
//这个命令输出反斜杠开头的转义字符(此处下面是空两2行,是\n\n的效果)
2.切换、创建删除目录
【1】linux目录的基本架构
目录 | 目录描述 |
/bin | 放置着可执行的命令文件 |
/boot | 放置着系统核心文件和开机所需文件 |
/dev | 放置着系统设备相关文件 |
/etc | 放置着系统主要配置文件 |
/home | 放置着除根用户外其他用户的家目录,默认情况下,每个用户在该目录下有一个自己的私人目录 |
/lib | 放置着系统和程序运行所要调用的库函数文件 |
/root | 是root用户的家目录 |
/sbin | 放置着根用户才能够执行的命令文件 |
/srv | 放置着服务启动之后需要访问的数据,如web服务所需要访问的网页数据,就默认存放在/srv/WWW/目录下 |
/tmp | 程序临时存放文件的目录,任何人都可以访问,重要数据不可放置在此目录下 |
/opt | 第三方软件建议安装目录,也即非本发行版本所提供的软件,建议放置在此目录 |
/media | 放置着移动设备相关文件,如光驱优盘相关数据都放置在该目录下 |
当时使用linux时,我们总是位于某个目录下,这个所处的目录就被称为“工作目录”,登录系统时,初始的工作目录总是登录用户的“家目录”,也即登录用户的私人目录
使用pwd命令来显示当前完整的“工作目录”
【2】切换目录
- 【cd+目录名称】命令是用来切换目录
- 特殊目录:cd+特殊字符
- “.” 表示工作工作目录
- “..” 表示工作目录的上层目录”
- “-” 表示退回到前一个工作目录
- “~” 表示用户的家目录
[root@localhost ~]# pwd //显示当前完整的“工作目录”
/root
[root@localhost ~]# cd /tmp //切换到tmp目录
[root@localhost tmp]#
[root@localhost tmp]# cd ./dir01 //表示切换到当前目录下的dir01目录
[root@localhost dir01]#
[root@localhost dir01]# cd ../dir02 //表示切换到当前目录的上层目录下的dir02
[root@localhost dir02]#
[root@localhost dir02]# cd - //表示切换到前一个目录
/tmp/dir01
[root@localhost dir01]#
[root@localhost dir01]# cd ~ //表示用户的家目录
[root@localhost ~]# pwd
/root
[root@localhost ~]# cd ~yangliping //表示切换到yangliping用户的家目录中
[root@localhost yangliping]# pwd
/home/yangliping
【3】创建目录mkdir
//创建目录sampledir
[root@localhost ~]# cd /tmp //切换到tmp目录
[root@localhost tmp]# mkdir /tmp/sampledir
[root@localhost tmp]# cd /tmp/sampledir
[root@localhost sampledir]# pwd
/tmp/sampledir
[root@localhost sampledir]# cd ..
[root@localhost tmp]#
//创建多级目录,通过在mkdir后面添加-p选项
[root@localhost tmp]# mkdir -p /tmp/dirlevel01/dirlevel02
[root@localhost tmp]# cd /tmp/dirlevel01/dirlevel02/
[root@localhost dirlevel02]# pwd
/tmp/dirlevel01/dirlevel02
[root@localhost dirlevel02]#
【3】删除目录rmdir
//rmdir 删除目录
[root@localhost ~]# cd /tmp //切换到tmp目录
[root@localhost tmp]# rmdir sampledir //删除sampledir
[root@localhost tmp]# cd sampledir
-bash:cd:sampledir:没有那个文件或目录
//rmdir只能删除空目录
[root@localhost tmp]# rmdir dirlevel01
rmdir:删除失败,目录非空
[root@localhost tmp]#
【4】相对路径与绝对路径
//绝对路径
[root@localhost tmp]# mkdir /tmp/sampledir //绝对路径,要从根目录开始写
[root@localhost tmp]#
相对路径
[root@localhost tmp]# rmdir sampledir //相对路径,相对当前的工作目录
3.列出文件并探究文件属性
【1】列出文件命令 ls [文件名] [目录名] [NONE]
- ls [文件名] 列出该文件
- ls [目录名] 列出该目录下的文件
- ls [NONE] 列出当前所处工作目录下的所有文件
- ls -a 列出包括隐藏文件,也即名字以“.”打头的文件在内的所有文件
- ls -l 以长格式列出文件,也即除了列出文件名外,还要列出文件的详细属性信息
- ls -a -l 表示以长格式列出所有文件,可以观察到每个文件的详细属性信息,都占据ls命令的一行输出
【2】文件属性以及文件权限
文件属性解析:
-rwxr-xr-- | 1 | yangliping | users | 23 | 7月 24 22:15 | hello.sh
[1] [2] [3] [4] [5] [6] [7]
[1][3][4]字段联合在一起,决定了一个文件完整的访问权限属性
[1] 代表文件的类型和权限
[3] 代表文件的拥有者(Owner)
[4] 代表文件所从属的用户组
[2] 代表文件的硬链接数目
[5] 代表文件的大小,单位是字节
[6] 代表文件的时间戳,也即文件最近修改的日期时间
[7] 代表文件名
概念解析:
#####概念1
1.文件拥有者
2.文件所从属的用户组
在linux中与一个文件有关系的的用户分为三类:
A.文件的拥有者(Owner),也就是字段[3]所规定的用户,文件的拥有者只可能有一个。
B.文件所从属的用户组里面的用户,也就是字段[4]所规定的一组用户里面的用户,这些用户可以有多个。
C.除了前面两类用户以外的其他用户(Ohters)
#####概念2
文件拥有者与文件所从属的用户组与文件访问权限的关系解说:
可以看到字段[1]由10个字符构成,其中后面9个字符分为三组,每组三个字符即为rwx,r-x,r--,分别规定
了文件拥有者,文件所从属的用户组里面的用户和其他用户的对这个文件的访问权限,这些访问权限又分 为3类
1.读权限,用字符r表示,表示可以查看这个文件内容
2.写权限,用字符w表示,表示可以修改或者删除这个文件内容
3.执行权限,用字符x表示,表示可以运行这个文件
4.如果对这个文件有相应权限,就会在特定位上就会有相应字符显示,如果特定位上显示的是-字符,就表示没有相应权限
举例解说:
以hello.sh文件为例,字段[1]是-rwxr-xr-- ,后面9个字符分为三组,rwx,r-x,r--:
A.对于它的拥有者(yangliping)用户来说,它具有可读,可写,可执行权限
B.对于它所从属的users用户组里面的用户来说,它具有可读,不可写,可执行的权限
C.对于其他用户来说,它具有可读,不可写,不可执行的权限
【3】文件权限码八进制转换
转换的方法:将有英文字符的地方替换为1,将-替换为0
rwx r-x r--
111 101 100
三个一组将其转换为八进制数字,那么111101100可以转换为754,因此我们可以称这个文件有754的访问权限
【4】修改文件的访问属性 命令chmod
[yangliping@localhost tmp]$ chomd 700 hello.sh
[yangliping@localhost tmp]$ ls -l ./hello.sh
-rwx------. 1 yangliping users 32 7月 27 27:22:59 ./hello.sh
修改以后的权限就是对文件的拥有者可读可写可执行,对于用户组里面的用户和其他用户无权限
【5】修改文件的拥有者和从属用户组的属性 命令chown
#修改文件拥有者和用户组
#文件拥有者:文件用户组
[yangliping@localhost tmp]$ chown yangliping1:users1 hello.sh
[yangliping@localhost tmp]$ ls -l ./hello.sh
-rwx------. 1 yangliping1 users1 32 7月 27 22:59 ./hello.sh
##hello.sh 将文件的拥有者改为yangliping1,将文件的用户组改为users1
#单修改文件拥有者,冒号和其后的部分可以省略
[yangliping@localhost tmp]$ chown yangliping2 hello.sh
[yangliping@localhost tmp]$ ls -l ./hello.sh
-rwx------. 1 yangliping2 users1 32 7月 27 22:59 ./hello.sh
##hello.sh 将文件的拥有者改为yangliping2
#单修改文件用户组,冒号前面的部分可以省略
[yangliping@localhost tmp]$ chown :users2 hello.sh
[yangliping@localhost tmp]$ ls -l ./hello.sh
-rwx------. 1 yangliping2 users2 32 7月 27 22:59 ./hello.sh
##hello.sh 将文件的用户组改为users2
【6】文件的类型
-rwxr-xr-- | 1 | yangliping | users | 23 | 7月 24 22:15 | hello.sh
[1] [2] [3] [4] [5] [6] [7]
第一个字段[1]中10个字符中的第一个字符代表的就是文件的类型
d: 表示目录文件
-: 表示普通文件
c: 表示字符设备文件
b: 表示一个块设备文件
l: 表示一个符号链接文件
显然,hello.sh是一个普通文件
4.拷贝,剪切,删除和创建文件
【1】拷贝文件 cp命令
命令:cp [ 要拷贝的文件|文件列表 ] [ 目的文件名|目的目录 ]
解释:
A.cp命令后面要跟2个参数,第一个参数表示你要拷贝的文件,第二个参数表示你准备将这个文件拷贝到哪里去
B.需要注意第二个参数可以是一个目录,也可以是一个带路径的文件名,表示在拷贝的同时让这个文件重新命名
举例如下:
——拷贝文件——
[root@localhost ~]# ls
anaconda-ks.cfg hello.sh install.log install.log.syslog
[root@localhost ~]# cp /tmp/file01 ~
//将tmp中file01文件拷贝到当前用户的家目录中
[root@localhost ~]# ls
anaconda-ks.cfg file01 hello.sh install.log install.log.syslog
[cp]
//家目录中多了一个file01文件
[root@localhost ~]#
——拷贝文件的时候重命名文件———
[root@localhost ~]# cp /tmp/file01 ~/file01_bak
//将tmp中file01文件拷贝到当前用户的家目录中,并将其重命名为file01_bak
[root@localhost ~]# ls
anaconda-ks.cfg file01 file01_bak hello.sh install.log install.log.syslog
[cp]
——拷贝多个文件,只要在第一个参数的位置填入多个文件名,用空格隔开即可——
[root@localhost ~]# cp /tmp/file02 /tmp/file03 /tmp/file04 ~
//将tmp目录中的file02,file03,file04拷贝到当前用户的家目录中
[root@localhost ~]# ls
anaconda-ks.cfg file01 file01_bak file02 file03 file04 hello.sh install.log install.log.syslog
——拷贝整个目录,这需要在命令后面跟上-r选项———
[root@localhost ~]# cp -r /tmp/dir01 ~
//将tmp目录中的dir01目录拷贝到当前用户的家目录中去
[root@localhost ~]# ls
anaconda-ks.cfg file01 file01_bak file02 file03 file04 hello.sh install.log dir01 install.log.syslog
在使用cp命令时,需要注意2点:
1.拷贝文件的时候,如果在目标目录中已有同名文件存在,cp命令默认询问用户是否覆盖,用户同意后,cp命
令才回覆盖这些文件
——拷贝文件,单个文件覆盖———
[root@localhost ~]# ls
anaconda-ks.cfg file01 file01_bak file02 file03 file04 hello.sh install.log dir01
install.log.syslog //file01文件已经存在
[root@localhost ~]# cp /tmp/file01 ~
//拷贝file01文件到当前登录用户的家目录下
cp:是否覆盖"/root/file01"? y //y-是,将会执行覆盖文件
——拷贝文件,批量文件覆盖,需要在cp命令后面跟上一个-f选项,并在cp命令前面加上一个反斜杠(\) ———
——cp命令就会强制覆盖所有的同名文件——
[root@localhost ~]# \cp -f /tmp/file02 /tmp/file03 ~
2.在cp命令拷贝文件的时候,文件的属性,包括文件的拥有者,文件的从属组,和访问权限位都有可能发生变化。
如,我们以root的用户身份,将tmp目录中的sample.sh文件拷贝到yangliping用户的家目录下,我们发现文
件的拥有者,文件的从属组属性都由yangliping变成了root,这将导致yangliping用户无法修改和执行这个文件。
[root@localhost ~]# ls -l /tmp/sample.sh
-rwxr-xr--. 1 yangliping users 12 8月 26 17:34 /tmp/sample.sh
//表明文件的拥有者是yangliping
[root@localhost ~]# cp /tmp/sample.sh ~yangliping
//将tmp目录中的sample.sh文件拷贝到yangliping用户的家目录下
[root@localhost ~]# ls -l ~yangliping/sample.sh
//显示yangliping用户的家目录下的被拷贝的文件sample.sh的属性信息
-rwxr-xr--. 1 root root 12 8月 26 17:34 /home/yangliping/sample.sh
//我们发现文件的拥有者,文件的从属组属性都由yangliping变成了root
因此,如果需要原原本本的将文件拷贝过来,还需要在命令后面跟上一个-p选项
[root@localhost ~]# cp -p /tmp/sample.sh ~yangliping
cp:是否覆盖"/home/yangliping/sample.sh"? y
[root@localhost ~]# ls -l ~yangliping/sample.sh
-rwxr-xr--. 1 yangliping users 12 8月 26 17:34 /home/yangliping/sample.sh
//此时,这个文件的属性和原来一模一样
当然,要使用-p选项的前提是登录用户对这个文件有写权限才行
【2】移动文件 mv命令
mv [ 要移动的文件|文件列表|目录 ] [ 目的文件名|目的目录 ]
移动一个文件
[root@localhost ~]# mv /tmp/file05 ~
[root@localhost ~]# ls
dir01 file01 file01_bak file02 file03 file04 file05
移动多个文件
[root@localhost ~]# mv /tmp/file06 /tmp/file07 /tmp/file08 ~
[root@localhost ~]# ls
dir01 file01 file01_bak file02 file03 file04 file05 file06 file07 file08
移动目录,与cp命令不同,不需要加任何选项
[root@localhost ~]# mv /tmp/dir02 ~
[root@localhost ~]# ls
dir01 file01 file01_bak file02 file03 file04 file05 file06 file07 file08 dir02
注意事项
1.使用mv移动单个已存在文件,默认询问用户是否覆盖文件,mv如果有多个同名文件要覆盖,则在mv命令之后
添加-f选项
[root@localhost ~]# mv /tmp/file01 ~
mv:是否覆盖"/root/file01"? y //覆盖单个文件
[root@localhost ~]# mv -f /tmp/file02 ~ //强制覆盖所有的同名文件
2.linux中并没有专门的重命名文件名的命令,mv就可以实现这个功能,也即将文件从原本的目录移动到原本
的目录,路径不变,只改变文件名就可以了
[root@localhost ~]# mv ./file08 ./file08_rename
【3】删除文件 rm命令
rm [ 要删除的文件|文件列表|目录 ]
删除单个文件
[root@localhost ~]# rm ./file01
rm:是否删除普通空文件"./file01"? y
[root@localhost ~]# ls
//结果中没有file01文件了,表示删除成功
删除多个文件,加上-f不询问,直接删除
[root@localhost ~]# rm ./file02 ./file03 ./file04
rm:是否删除普通空文件"./file02"? y
rm:是否删除普通空文件"./file03"? y
rm:是否删除普通空文件"./file04"? y
[root@localhost ~]# ls
//结果中没有file02,file03,file04文件了,表示删除成功
删除目录,需要在目录后面跟-R选项
[root@localhost ~]# rm -R ./dir01
rm:是否进入目录"./dir01"? y
rm:是否删除目录"./dir01/dir03"? y
rm:是否删除普通空文件"./dir01/file09"? y
rm:是否删除目录"./dir01"? y
[root@localhost ~]# ls
//删除成功
【4】创建文件 touch命令
touch [ 要创建的文件 ]
创建没有任何内容的空文件
[root@localhost tmp]# touch ./empty
如果touch一个已经存在的文件,那将会改变文件的时间戳属性
5.链接文件
【1】符号链接
符号链接和windows的快捷方式类似
创建符号链接命令:ln -s [ 链接指向的文件 ] [ 链接名 ]
创建一个符号链接
[yangliping@localhost ~]$ ls -l /tmp/hello.sh
-rwxr-xr--. 1 yangliping users 32 7月 27 22:59 /tmp/hello.sh
[yangliping@localhost ~]$ ln -s /tmp/hello.sh ./hello_slink //链接文件创建成功
虽然我们可以通过符号链接文件来读、写和执行源文件,但这完全不代表符号链接文件和源文件是同一个文件
接下来分别列出源文件和符号链接文件
[yangliping@localhost ~]$ ls -l /tmp/hello.sh
-rwxr-xr--. 1 yangliping users 32 7月 27 22:59 /tmp/hello.sh
[yangliping@localhost ~]$ ls -l ./hello_slink
lrwxrwxrwx. 1 yangliping users 13 7月 27 00:28 ./hello_slink
我们观察到
A.源文件和符号链接文件完全是两个不同的文件,不仅名字不一样,文件的各个属性都不一样,同时我们
还注意到,符号链接文件的名字非常特殊,名字中不仅有符号链接文件名,还有目标文件名。
B.如果符号链接所指向
的源文件被删除了,那么这个符号链接文件就会失效,读取或执行这个符号链接文件,会显示没有那个文件或目录
的提示,这种情况下我们称这个符号链接文件为断链
C.符号链接应用比较灵活,可以为任意文件创建符号链接
【2】硬链接
@linux的文件如何存储:
- 在linux中,当划分磁盘分区并格式化的时候,整个分区会被划分为2个部分,即inode区和data block区。
- linux中每个文件都分成两部分存放,一部分是文件的唯一标识inode-number以及属性信息放在inode区的一个inode中,inode-number和inode是一一对应的。另一部分是文件的实际数据,放在data-block区中。
- 在Linux中我们需要通过文件的inode来找到存放文件数据的data block
- 在一个硬盘分区中,不可能有两个文件共用一个inode,自然也不可能有两个文件的inode-number是一样的。
如果我们将硬盘分区中的所有的文件比作一本书的话,inode区就是它的目录,data block区就是其内容,我们必须通过目录才能找到具体的内容
通过ls -il 命令列出文件的inode-number来进行观察,第一个字段就是文件的inode-number
[yangliping@localhost ~]$ ls -il
32041 lrwxrwxrwx. 1 yangliping users 13 7月 27 00:28 ./hello_slink
@linux中的目录到底是怎么样的文件:
- 简单来说linux中目录是一张表,每个表项都代表了一个文件,目录中有多少文件,这张表中就有多少表项。
- 每个表现中包括了2样数据,一是文件名,二是该文件的inode-number,因此linux中存取文件的过程就是通过文件名找到对应的inode-number,然后找到文件的inode,最后找到文件的数据
@硬链接,就是在目录这张表中,让一个inode-number对应了多个文件名,文件inode和数据还是一份,没变,只不过文件多了一个名字,这个名字就被成为硬链接.
创建硬链接命令: ln [ 链接指向文件 ] [ 链接名 ]
创建硬链接
[yangliping@localhost ~]$ ls -il /tmp/sample.txt
922039 -rw-rw-r--. 1 yangliping users 20 7月 28 00:45 /tmp/sample.txt
[yangliping@localhost ~]$ ln /tmp/sample.txt ./sample_hl01 //创建硬链接
[yangliping@localhost ~]$ ls -il /tmp/sample.txt ./sample_hl01
922039 -rw-rw-r--. 2 yangliping users 20 7月 28 00:45 /tmp/sample.txt
922039 -rw-rw-r--. 2 yangliping users 20 7月 28 00:45 ./sample_hl01
可以观察到,创建前后文件属性第二个字段发生了改变,由1变成2,表示文件的硬链接数目增加了1
再为/tmp/sample.txt 在创建一个硬链接
[yangliping@localhost ~]$ ln /tmp/sample.txt ./sample_hl02 //创建硬链接
[yangliping@localhost ~]$ ls -il /tmp/sample.txt ./sample_hl01 ./sample_hl02
922039 -rw-rw-r--. 3 yangliping users 20 7月 28 00:45 /tmp/sample.txt
922039 -rw-rw-r--. 3 yangliping users 20 7月 28 00:45 ./sample_hl01
922039 -rw-rw-r--. 3 yangliping users 20 7月 28 00:45 ./sample_hl02
此时的文件的硬链接数目变成了3,但我们清楚,无论是sample.txt,还是sample_hl01,还是sample_hl02,
本质上是同一个文件,只不过这个文件有多个名字罢了,这一点我们可以通过列出的inode-number来观察验证。
我们可以通过任意一个硬链接文件来读写执行源文件。
删除硬链接
[yangliping@localhost ~]$ rm /tmp/sample.txt
[yangliping@localhost ~]$ ls -il
922039 -rw-rw-r--. 2 yangliping users 20 7月 28 00:45 ./sample_hl01
922039 -rw-rw-r--. 2 yangliping users 20 7月 28 00:45 ./sample_hl02
我们可以发现3个硬链接文件中数目变成了2,仍然能够照常打开,文件属性和文件内容并无异常
[yangliping@localhost ~]$ rm ./sample_hl02
922039 -rw-rw-r--. 1 yangliping users 20 7月 28 00:45 ./sample_hl01
我们可以发现2个硬链接文件中数目变成了1,仍然能够照常打开,文件属性和文件内容并无异常
总结:我们为sample.txt文件创建了2个硬链接sample_hl01和sample_hl02,那么就相当于这个文件在文件系统中有了3个文件名,这三个文件名都指向了同一份文件内容,删除了一个文件,只是将某个文件名从文件系统中移除了,我们仍然可以通过余下的文件名来访问这个文件的数据。
事实上,只要文件还存在着一个文件名,这个文件就一切正常,仍然可以访问,除非将这三个文件都删除,我们才无法通过文件名找到文件inode,进而访问文件数据,文件这才算真正的被删除掉。
硬链接由于文件系统的限制,不如符号链接灵活,有2点提醒:
- 是我们强烈不推荐为目录创建硬链接,容易造成目录遍历死循环
- 是不能跨硬盘分区创建硬链接,原因就是在不同的分区当中,文件的inode-number不再是唯一的了