Linux基本知识目录与命令
Linux 的哲学思想
1、一切皆文件;
2、单一目的的[小程序]
3、组合小程序完成复杂任务;
4、文本文件保存配置信息;
5、尽量避免捕获用户接口;
6、提供机制,而非策略。
一、什么是shell?
1.1、概念
- shell是Linux中运行的一种特殊程序(程序为执行任务的一串代码)
- shell在用户和内核之间充当“翻译官”(内核属于操作系统的一部分,用于调度cpu,程序占用多少内存)
- 用户登录Linux系统时会自动加载一个Shell程序
- shell是一类软件的总称(比如bash、sh、tsh都属于分类)
- Linux中默认的shell程序时bash
1.2、shell命令执行的顺序:
1、绝对路径下的执行程序
2、先看别名,如果有别名,就直接执行
3、再区别是内部命令还是外部命令,如果内部命令直接执行
4、如果外部命令,首先查看hash缓存表,如果在表中,就直接进行;如果表中有,但是找不到,就直接报错
5、如果没有hash缓存表,则去$PATH路径下的文件夹去找,找到执行,找不到直接报错\
$PATH 路径下的5个缓存表:
/usr/local/sbin:
/usr/local/bin:
/usr/sbin:
/usr/bin:
/root/bin
1.3、shell与内、外部命令
1.3.1、shell 分为内部命令和外部命令,一般先执行内部命令,hash,再执行外部命令
内部命令(系统自带):
- 没有单独对应的系统文件:系统自带的,没有系统文件去打开
- 内部命令的程序一直处于开启状态
- 没有独立的文件
- 程序会自动载入内存,可以直接使用
外部命令(需要自己额外安装):
- 外部命令存放在硬盘上
- 每个外部命令都有相对应的文件
- 每个外部命令都要知道对应文件的位置,才可以经过shell加载后使用
别名 > 内部命令 > hash > 外部命令
哈希(hash):内部命令执行不会存在在哈希表中,外部命令会存在哈希表中
1.3.2、help命令可以查看内部命令
1.3.3、--help命令可以查看外部命令
1.3.4、可以使用 type 命令来区分内外部命令
二、Linux命令格式
通用的命令行使用格式
命令字 +[选项]+[参数](之间一定要空格隔开)\
- 命令字(区分字母大小写)\
- 是整条命令中最关键的一部分\
- 唯一确定一条命令(一定是确定的)
- 选项(程序不加选项只有默认的基础作用,加入选项可以让程序功能更强大)(默认功能)
- 参数(需要有选择对象):如果不加参数,默认是当前文件夹的所有参数(默认当前文件夹)
1、 以 . 开头的都属于隐藏文件
2、 ;可以隔开命令,执行多个命令
2.1、ls命令
格式:ls [选项] [文件或目录… ]
2.1.1、ls -a(显示隐藏文件,包括. 与 ..开头的文件)
2.1.2、ls-l(显示文件属性)ls -l长格式显示,文件属性比较详细等同于ll
\
d 代表文件格式
rwx 创建者;r-x 所属组;r-x 其他 (r:可读;w:可写;x:可执行;-:没有该权限)
5 代表硬链接数,这边硬链接数是5
root 创建者(拥有者)
root 所属组(拥有组)
36 文件大小
9月 20 00:18 创建时间(最后一次使用文件的时间)
11 文件名
2.1.3、ls -A(显示文件,不包含.和..开头的隐藏文件)
2.1.4、ls- d(只显示当前目录的属性)
2.1.5、ls -h 人性化显示(加入了文件大小的单位)
2.1.6、ls -R 递归显示
补充:ls -t 以时间排序 ; ls -i 显示indoe号 ; ls -S 文件大小排序 ; ls -r 倒序排列
注意:ls 不单独使用,要配合通配符使用
2.2、通配符
通配符的作用:匹配文件名,去模糊查找文件
?代表任意单个字符
*是代表任意单个长度
举例:
以a开头的文件:a*
以.txt结尾的文件:*.txt
*.t?t:表示列出所有以 .t?t 结尾的文件,t和t中间只能有一个字符
{1..10}:1到10 10个数
{a..z}:小写字母a-z
[abcd] :[abcd]只代表一个数值,从abcd中任取一个,只表示一个数,如果寻找e名字的文件夹或文件夹则找不到;
[0-9]指的是0-9的单个数字一共9个数字
[a-c]:a A b B c共五个数值
[^a-c]或者[!a-c]:反向匹配:除了上列的五个数值以外的内容即[C-Z]
三、别名
3.1、概念:将一些很长的命令,自定义成简单的好记的命令
3.2、通式:alias 自行定义的命令='常用的复杂命令'
例:alias sna='hostnamectl set-hostname'
3.3、删除别名
通式:unalias 自定义命令
alias 直接显示所有别名
四、du(disk use):统计文件占用磁盘大小
4.1、du -a(分开显示每个文件的大小)
4.2、du -s(显示当前文件夹的总大小)
4.3、du -h(人性化显示每个文件大小)
4.4、du -d 2
注意:-as 不能一起使用
du 与 ls 的区别:
du:统计的是当前文件占磁盘大小,不足4k,按照4k算
ls:看到的是文件的真实大小
五、创建
- 文件名最长255个字节
- 包括路径在内文件名称最长4095个字节
- 除了斜杠和NULL,所有字符都有效.但使用特殊字符的目录名和文件不推荐使用,有些字符需要用引号来引用。
5.1、mkdir 创建目录
通式:mkdir [选项] 目录位置及名称…
mkdir -p 递归建立文件夹
例:在etc文件夹下,递归创建文件夹1/2/3
mkdir -v 显示建目录过程
一般与p一起使用(mkdir -pv 文件目录名称)
5.2、touch 创建文件
通式: touch 文件名\
例:在etc文件夹下,创建{1..10}.txt 文件
六、ln 软硬连接
6.1、软连接
软连接 类似于windows里快捷方式
通式:ln -s 源文件或目录… 链接文件或目标位置\
例:将etc目录下的1.txt的文件,连接到mnt目录下,并取名1-1.txt
- 软链接和源文件的 inode 号不一致,软链接通过 -> 明显地标识出源文件的位置\
- 在软链接的权限位 lrwxrwxrwx 中,l 就代表软链接文件
这里需要注意,软链接文件的源文件必须写成绝对路径,而不能写成相对路径(硬链接没有这样的要求);否则软链接文件会报错。这是初学者非常容易犯的错误。
软连接特点:\
- 删除源文件无法访问,再新建同名文件后依然可以访问
- 可以跨设备
- 可以支持文件夹
6.2、硬连接
硬连接:是给一个文件的 inode 分配多个文件名,通过任何一个文件名,都可以找到此文件的 inode,从而读取该文件的数据信息。
通式:ln [选项] 源文件 目标文件
硬连接的特点:
- 不论是修改源文件(hard 文件),还是修改硬链接文件(hard2 文件),另一个文件中的数据都会发生改变。
- 不论是删除源文件,还是删除硬链接文件,只要还有一个文件存在,这个文件(inode 号是 33554597 的文件)都可以被访问。
- 硬链接不会建立新的 inode 信息,也不会更改 inode 的总数。
- 硬链接不能跨文件系统(分区)建立,因为在不同的文件系统中,inode 号是重新计算的。
- 硬链接不能链接目录,因为如果给目录建立硬链接,那么不仅目录本身需要重新建立,目录下所有的子文件,包括子目录中的所有子文件都需要建立硬链接,这对当前的 Linux 来讲过于复杂。
6.3、软硬连接区别:
| 对比项 | 硬链接 | 软链接 |
|---|---|---|
| 本质 | 本质是同一个文件 | 本质不是同一个文件 |
| inode(身份证号) | 相同 | 不同 |
| 连接数 | 创建新的硬链接,链接数会增加,删除硬链接,链接数减少 | 删除,新建都不会改变 |
| 文件夹 | 不支持 | 支持 |
| 删除源文件 | 只是链接数减一,但链接文件的访问不受影响 | 无法访问连接文件 |
| 文件类型 | 和源文件相同 | 链接文件,和源文件无关 |
| 文件大小 | 和源文件相同(指向硬盘上的同一个文件) | 源文件的路径的长度 |
七、cd
| 命令 | 效果 |
|---|---|
| cd 或 cd ~ | 若不指定目标位置,切换到当前用户的宿主目录(家目录) |
| cd - | 到前一次目录 |
| 一个点号“.”开头(自己) | 表示以当前的工作目录作为起点(已点开头的是) |
| 两个点号“..”开头(上一级) | 表示以当前目录的上一级目录(父目录)作为起点 |
| “~用户名”形式开头” | 表示以指定用户的宿主目录(家目录)作为起点 |
| "."开头文件 | 表示隐藏文件 |
| ~zhangsan (有个用户叫zhangsan 家目录为起点) | 表示以指定用户的宿主目录作为起点 |
八、cp 复制/备份
通式:
- cp [选项]… 源文件 目标 相当改名复制
- cp [选项]... 源文件... 文件夹 多个源文件只能复制到文件夹
8.1、cp命令的选项说明
| 选项 | 说明 |
|---|---|
| -f | 覆盖目标同名文件或目录时不进行提醒,直接强制复制 |
| -i | 覆盖目标同名文件或目录时提醒用户确认 |
| -p | 复制时保持源文件的权限、属主及时间标记等属性不变 |
| -r | 复制目录时必须使用此选项,表示递归复制所有文件及子目录 |
| -a | 完整保留所有的信息包括连接文件 |
| -v | 可视化 |
| -u | 相当于增备,差异备份 |
| -b | 先备份(只保留最近) |
复制多个文件必须要是目录,不能是文件,且目录要存在
九、rm 删除文件
通式:rm [选项] 要删除的文件或目录\
选项:
- -f、强制
- -i、交互
- -r 递归(删除目录需要)
[root@localhost data]# ls -a *
1
#不显示隐藏文件
[root@localhost data]# ls -a
. .. 1
#显示隐藏文件
[root@localhost data]# ls *
# *不包括.开头的 l
s: 无法访问*: 没有那个文件或目录
[root@localhost data]# ls .* //包括了 .. 上层目录
.:
..:
aaa boot dev home lib64 misc net proc run sdb1 sys usr bin data etc lib media mnt opt root sbin srv tmp var
[root@localhost data]# touch f{a..z}.log
[root@localhost data]# touch f{A..Z}.log
[root@localhost data]# ls
123456.txt fa.log fe.log fj.log fo.log ft.log fy.log
123.txt f{A.Z}.log ff.log fk.log fp.log fu.log fz.log 1.txt
fb.log fg.log fl.log fq.log fv.log rh
2.txt fc.log fh.log fm.log fr.log fw.log test.txt
abc.txt fd.log fi.log fn.log fs.log fx.log
[root@localhost data]# ls f[zhou].log //包含z、h、o、u四个字母中的任意一个就会显示(只匹配单个字符)
fh.log fo.log fu.log fz.log
[root@localhost data# ls f[x-z].log //显示xXyYz,不包括Z
fx.log fX.log fy.log fY.log fz.log
[root@localhost data]# ls f[a-c].log //显示aAbBc,不包括C
fa.log fA.log fb.log fB.log fc.log
[root@localhost data]# ls f{a..c}.log //显示abc所有小写
fa.log fb.log fc.log
[root@localhost data]# ls 1[[:lower:]]* //显示小写字母
1a1.txt 1e1.txt 1i1.txt 1m1.txt 1q1.txt 1u1.txt 1y1.txt
1b1.txt 1f1.txt 1j1.txt 1n1.txt 1r1.txt 1v1.txt 1z1.txt
[root@localhost data]# ls 1[[:upper:]]* //显示大写字母
[root@localhost data]# ls 1[[:upper:]]*
1A1.txt 1E1.txt 1I1.txt 1M1.txt 1Q1.txt 1U1.txt 1Y1.txt
[root@localhost data]# touch f{1..9}.txt
[root@localhost data]# touch f{10..20}.txt
[root@localhost data]# ls f[0-9].txt //[0-9]只能匹配10以下的数字
f1.txt f2.txt f3.txt f4.txt f5.txt f6.txt f7.txt f8.txt f9.txt
[root@localhost data]# ls f[0-9][0-9].txt //两个[0-9]可以匹配双数字
f10.txt f11.txt f12.txt f13.txt f14.txt f15.txt f16.txt f17.txt f18.txt f19.txt f20.txt
[root@localhost data]# ls f{10..20}.txt //{10..20}可以匹配双数字
f10.txt f11.txt f12.txt f13.txt f14.txt f15.txt f16.txt f17.txt f18.txt f19.txt f20.txt
[root@localhost data]# ls f??.txt //两个?号可以匹配两个字符
f10.txt f11.txt f12.txt f13.txt f14.txt f15.txt f16.txt f17.txt f18.txt f19.txt f20.txt
[root@localhost data]# ls f*.txt //*可以匹配任意字符
f10.txt f12.txt f14.txt f16.txt f18.txt f1.txt f2.txt f4.txt f6.txt f8.txt
f11.txt f13.txt f15.txt f17.txt f19.txt f20.txt f3.txt f5.txt f7.txt f9.txt
[root@localhost data]# ls /etc/.* //显示隐藏文件也包括..的上层目录
[root@localhost data]# ls /etc/.* -d //如果不想看上层目录 就要加-d 只显示当前目录
/etc/. /etc/.. /etc/.java /etc/.pwd.lock /etc/.updated
十、mv 移动或者改名
通式:mv [选项] … 源文件或目录… 目标文件或目录 单个文件
选项:
| 选项 | 说明 |
|---|---|
| -f | 强制覆盖,如果目标文件已经存在,则不询问,直接强制覆盖 |
| -i | 交互移动,如果目标文件已经存在,则询问用户是否覆盖(默认选项) |
| -n | 如果目标文件已经存在,则不会覆盖移动,而且不询问用户 |
| -v | 显示文件或目录的移动过程 |
[root@localhost test]# mv bbb aaa //将目录bbb改名为aaa
[root@localhost test]# mv aaa /tmp //将目录aaa移动到/tmp目录下
[root@localhost test]# mv 1.txt 2.txt file01.txt //源文件为多个时目标必须是目录,否则系统会报错
mv: 目标"file02" 不是目录
[root@localhost test]# mv 1.txt 2.txt /tmp/aaa //将多个文件移动到/tmp/aaa目录下
[root@localhost test]# ls /tmp/aaa
1.txt 2.txt
[root@localhost test]# which mv //查看mv命令,发现mv=mv -i
alias mv='mv -i'
/usr/bin/mv
[root@localhost test]# ls /tmp/aaa
1.txt 2.txt [root@localhost test]# mv 1.txt /tmp/aaa //当目标文件存在时,提示是否覆盖
mv:是否覆盖"/tmp/aaa/1.txt"?
十一、find 查找文件
11.1、特点
- 精确查找
- 实时查找
- 支持查找条件巨多
- 默认递归查询
缺点:慢
11.2、命令格式:
find [OPTION]... [查找路径] [查找条件] [处理 动作]
- 查找路径:指定具体目标路径;不指定为默认为当前目录
- 查找条件:可以对文件名、大小、类型、权限等标准进行查找;默认为找出指定路径下的所有文件
- 处理动作:对符合条件的文件做操作,默认输出至屏幕 (print)
处理动作:
- -ls 对查找到的文件列出属性信息
- -delete 对查找到的文件进行删除
- -exec COMMAND {} \; 对查找到的每个文件执行由COMMAND指定的命令,{}: 用于引用查找到的文件名称自身。
- -ok COMMAND {} \;
对查找到的每个文件执行由COMMAND指定的命令,对于每个文件执行命令之前,都会交互式要求用户确认。
11.3、常用命令选项
| 查找类型 | 关键字 | 说明 |
|---|---|---|
| 按名称查找 | -name | 根据目标文件的名称进行查找,允许使用“*”及“?”通配符 |
| 按文件大小查找 | -size | 根据目标文件的大小进行查找 一般使用“+”、“-”号设置超过或小于指定的大小作为查找条件 常用的容量单位包括 kB(注意 k 是小写)、MB、GB |
| 按文件属主查找 | -user | 根据文件是否属于目标用户进行查找 |
| 按文件类型查找 | -type | 根据文件的类型进行查找 文件类型包括普通文件(f)、目录(d)、块设备文件(b)、字符设备文件(c)等 |
| 按inode号 | -inum | 根据文件inode号查找 |
| 按权限查找 | -perm | 按文件权限查找 |
| 最大搜索目录深度 | -maxdepth level | 将你的文件已分级的形式查找 |
| 最小搜索目录深度 | -mindepth level | 同上 |
按文件名称查找 -name
[root@localhost ~]# find /etc/ -name passwd //查找文件名为passwd的文件
/etc/pam.d/passwd
/etc/passwd
[root@localhost ~]# find /etc/ -name '*.conf' //查找以.conf结尾的文件
/etc/resolv.conf
[root@localhost ~]# find /etc/ -name 'vm*' //查找以vm开头的文件
/etc/pam.d/vmtoolsd
/etc/abrt/plugins/vmcore.conf
按文件属主查找 -user
[root@localhost ~]# find /mnt -user root //查找属主为root的文件
/mnt
[root@localhost ~]# find /home -user jlx //查找/home下属于jlx的文件并列出属性
/home/jlx
/home/jlx/.mozilla
/home/jlx/.mozilla/extensions
/home/jlx/.mozilla/plugins
/home/jlx/.bash_logout
/home/jlx/.bash_profile
/home/jlx/.bashrc
按文件类型查找 -type
[root@localhost ~]#find /boot -type d //查找/boot下的目录文件
/boot
/boot/efi
/boot/efi/EFI
/boot/efi/EFI/centos
/boot/grub2
/boot/grub2/i386-pc
/boot/grub2/locale
/boot/grub2/fonts
/boot/grub
按文件大小查找 -size
[root@localhost ~]#find -size 1M //查找文件(0,1]M的文件
.
./.bash_logout
./.bash_profile
注意:按文件大小查找时,大小范围需注意
-
find -size 1G:查找的是从0G到1G,不包括0G,即(0,1]。
-
find -size 2G:查找的是从1G到2G,不包括1G,即(1,2]。
-
find -size 1024M:查找的是从1023M到1024M,不包括1023M,即(1023,1024)
1024kb和1Mb一样吗?
- 1024k 表示 1023k ~ 1024k,不包括 1023k。
- 1M 表示 0M ~1M,不包括 0M。 故使用 find -size 1024k 查找更加精准
查找到文件后并做其他处理
[root@localhost opt]# find -name "*.img" -delete
[root@localhost opt]# find -name "*.img" -exec rm -rf {} \;
[root@localhost opt]# find -name "*.img" | xargs rm -rf
[root@localhost opt]# find -name "*.txt" -ok mv {} /mnt \; //查找.txt的文件并移动到/mnt目录下,对于每个文件执行命令之前,都会交互式要求用户确认
[root@localhost opt]# find -name "*.txt" -exec mv {} /mnt \; //查找.txt的文件并移动到/mnt目录下
按时间查找
#以“天”为单位: find -atime [+/-]# //按读取时间查找
# //表示[#,#+1)
+# //表示[#+1,+∞)
-# //表示[0,#)
find -mtime //按文件内容改变时间查找
find -ctime //按元数据改变时间查找
#以“分钟”为单位:
-amin
-mmin
-cmin
find -mtime 10 //10天到11天,[10,11)
find -mtime +10 //代表11天以上,[11,+∞)
find -mtime -10 //10天以内,[0,10)
找到文件并删除的三种方式
find -name "*.img" -delete
find -name "*.img" -exec rm -rf {} \;
find -name "*.img" | xargs rm -rf
which
which 命令|程序名
which ls