Linux:常用指令
全部:Linux常用命令 - SegmentFault 思否
wget 与 curl 命令详解 - SegmentFault 思否
十万字Linux命令大全cat详细教程(一)_川川菜鸟的博客-CSDN博客
规则与技巧
- ctrl+k //剪切(删除)光标处到行尾的所有字符
- ctrl+u //剪切光标处到行首的所有字符
- ctrl+y //粘贴
- ctrl+r 指令:自动匹配历史指令(不停按ctrl+r可以不停往上找历史指令)
- 删除整行 HOME + CTRL K
- 如果指令太长一行写不完,可以用\+ENTER实现换行继续输入
- 指令+pageup:上一次输入的这个指令
- 交互式系统退出:q
- 上下翻页:SHIFT + pageup
- 如果需要用root权限来执行,需要在执行的命令前加sudo
- 指令内容输出到文件,ls -a > test(追加)
- 桌面端截图快捷键:CTRL+ALT+A
- which 指令A:指令A的路径
- whereis 指令A:所有跟A沾边的指令的路径
- 字符串拼接:$str1"str2"
- Linux下,文件中的换行符为/n,Windows中,文件中的换行符为/r/n。所以某些文件从Windows中变到Linux中后,要用sed -i将/r消除:
sed -i 's/\r$//g' 具体文件
常用
变量
var=1234 echo $var
查看版本
- uname -a
- cat /etc/issue
- cat /etc/os-release
容量
- 几核CPU:cat /proc/cpuinfo
- 内存:free、cat /proc/meminfo
系统自身
- hostname:主机名
- hostname -i:主机IP
文件系统
- mount:文件挂载情况,挂载路径的文件系统属性
- df:显示磁盘使用情况,同时也能显示挂载情况
用户、权限
-
查看当前用户:whoami
-
切换为root:su -
-
从root切换为其他用户:su - 用户名
-
退出当前用户:exit
-
添加用户:useradd 用户名 -p 密码
-
删除用户:userdel 用户名
-
查看全部用户:cat /etc/passwd 或 compgen -u
-
修改当前用户对于某个目录/文件的权限:chmod 777 目录/文件
-
创建目录并修改权限:mkdir -m 711 目录
-
递归创建目录:mkdir -p 目录
- 一次修改多个文件、目录的权限:
find /usr/local/lib/python3.7 -type f|xargs -I {} chmod 644 '{}' find /usr/local/lib/python3.7 -type d|xargs -I {} chmod 755 '{}'
-
用户属性修改:usermod
-
修改文件、目录的所属用户、组:chown
chown [-R] 所有者:组名 文件或目录
-
修改目录、文件的权限-读写可执行:chmod
chmod [-R] 数字权限 文件或目录 chmod [-ugoa] [+-=][rwx] 文件或目录 #将.bashrc的所有权限都设定为启用 chmod 777 .bashrc
文件/目录
-
一次移动多个文件:mv 源1 源2 目的目录(最后一个一定是目录)
-
一次创建多个文件名顺序排列的文件:mkdir dir{1..10},创建文件名为dir1-dir10的文件
- 以树形结构显示某个目录下的所有文件组织结构:tree 路径
- 以树形结构显示某个目录下的所有目录结构:tree -d 目录
- 创建文件:
- touch 文件名
- echo 内容 >> 文件
- vim或vi
- 远程文件传输:scp
文件内容显示
-
前/后十行:head/tail -n 10
- grep前/后十行:grep -C 10
grep 关键字 选项 选项: -A n 列出匹配行及其后n行 -B n 列出匹配行及其前n行 -C n 列出匹配行及其前后n行
-
输出文件行数:wc -l a.txt | awk '{print $1}'
屏幕、界面、系统本身
-
清屏:clear或ctrl +L
-
关机poweroff 重启reboot
-
上下翻页:SHIFT + PAGEUP/PAGEDOWN
-
安装:yum -y install 命令 (yum -y install vim*)
-
ctrl+k //剪切(删除)光标处到行尾的所有字符
-
ctrl+u //剪切光标处到行首的所有字符
-
ctrl+y //粘贴
-
删除整行 HOME + CTRL K
路径
- cd、pwd
- ls
- ln -s A B:建立链接,之后访问B等同于访问A
- which 指令A:指令A的路径
- whereis 指令A:所有跟A沾边的指令的路径
网络
-
测试网络连接:ping www.baidu.com 测试
-
查看所有网络连接信息:netstat -a
-
网络连通性:curl -v url
-
显示所有网卡信息:ifconfig -v、ip a
-
查看网卡是千兆还是万兆:ethtool 网卡名(网卡名通过ifconfig获得)
-
域名解析:dig URL、nslookup URL
压缩
-
解压缩:tar -zxvf xxx.tar.gz -C 指定路径
0、汇总
0)特殊符号
符号 |
说明 |
用法 |
; | 多条命令顺序执行,命令间不互相干扰 | 命令1 ; 命令2 |
| |
①正则表达式中表示或; ②用于命令间,表示用前边命令的输出作为后边命令的输入 |
①ab(c|d) ②命令1 | 命令2 |
& |
①把命令放在后台执行 ②标准输出和标准错误输出,具体见输入输出重定向一节 |
①java -jar xxx.jar & |
&& | 前边指令执行成功才执行后边指令 | |
|| | 前边指令执行失败才执行后边指令 | |
# |
①注释 ② $#命令行参数个数 ③${#变量}变量(字符串)长度 ④${#数组[@]}数组长度 |
|
$ |
变量①$a:变量的值 命令行$0:当前脚本程序名称 $1-$n:第n个命令行参数 $*:所有命令行参数,整体输出 $@:所有命令行参数,分别输出 $#:命令行所有参数的个数 进程$?:最后一次执行状态 $$:当前进程的进程号pid $!:后台运行的最后一个进程的进程号 awk$0:某一行的全部字段数据 $1-$n:某一行的第n个字段数据 |
|
~ |
字符串是否包含某个子串 |
awk '$2 ~ /Sc/' 第二字段中是否包含"Sc"字符 |
{} |
正则:表示范围 循环:指定循环范围 匿名函数 命令:{}中的命令,是在当前shell执行 |
1)指令
指令 |
说明 |
屏幕 |
|
clear | 清屏 |
echo |
输出内容到屏幕(详见Shell基础 - ShineLe - 博客园) |
exit |
注销 |
文件、文件夹本身绝对路径:以"/"开头 相对路径:以.或..开头 |
|
mkdir、rmdir、rm | 创建目录、删除空目录 、删除目录(可以不空) |
touch/rm | 创建/删除文件 |
cd | 跳转到目录 |
ls |
罗列 Linux:ls指令 |
grep | 文本搜索(类似于CTRL+F)并输出,可使用正则表达式 |
vim | 编辑文件(vim指令见vim:用法) |
cat | 查看文件(与vim的区别在于cat无法编辑) |
pwd | 显示当前目录 |
cp | 复制 |
mv | 移动、重命名 |
basename | 获取路径中的最后文件名 |
dirname | 获取路径中的最后目录名 |
创建文件 | touch、echo 内容 >> 文件 |
查找、搜寻 |
|
which | 查找某个指令(可执行文件)的详细路径 |
whereis | 从特定目录中查找 |
locate/updatedb | 从数据库中查找、更新数据库 |
find | 查找(从文件类型、所有者、时间、权限……查找) |
文件属性 |
|
file | 观察文件类型 |
文件内容 |
|
cat | 从首行开始显示内容 |
tac | 从尾行开始显示 |
nl | 显示时输出行号 |
more | 一页一页显示,只能往后翻页 |
less | 与more类似,可以往前翻页 |
head | 显示前几行 |
tail | 显示尾几行 |
od | 以二进制方式显示 |
权限 |
|
chmod | 改变权限 |
chgrp | 改变群组 |
chown | 改变所有者 |
umask | 默认权限 |
用户 |
|
whoami |
当前用户 |
su |
su 用户名:切换为某个用户 su -:切换为root |
sudo 指令 |
给当前用户root权限执行该命令 |
exit | 退出切换的用户 |
useradd/userdel 用户名 | 添加/删除用户 |
compgen -u | 查看全部用户 |
useradd userdel |
添加/删除用户 |
usermod |
修改用户属性 |
PATH |
|
echo $PATH | 显示所有PATH |
PATH="${PATH}:路径" | 加入新PATH |
文件系统 |
|
df | 列出文件系统的整体磁盘使用量 |
du | 评估文件系统的磁盘使用量(用于推估目录所占容量) |
进程管理 |
|
systemctl |
进程管理 进程管理,较老 |
service | |
ps |
进程状态,相当于windows任务管理器 Linux:ps指令 |
网络 |
|
ip |
IP与网关 |
route |
路由与网关 Linux:网络指令(route) |
dig nslookup |
域名解析 |
安装下载 |
|
wget |
从web下载文件 Linux:wget指令 |
压缩 解压缩 |
|
tar | 压缩 解压缩 |
2)路径
路径 |
说明 |
相对路径 | 进入某个相对路径 |
绝对路径 | 进入绝对路径下的某个文件夹 |
. | 当前目录 |
.. | 返回上一级 |
~或空 | 回到home目录 |
- | 在上一个目录和本目录来回切换 |
~user | 回到user这个用户的home目录(非根目录,根目录是/) |
/ | 回到根目录 |
家目录是~,根目录是/
3)重定向
①标准输入输出
设备 | 设备名 | 文件描述符 | 类型 |
---|---|---|---|
键盘 | /dev/stdin | 0 | 标准输入 |
显示器 | /dev/stdout | 1 | 标准输出 |
显示器 | /dev/stderr | 2 | 标准错误输出 |
②输入重定向
- 输入重定向:不使用标准输入端口(也就是①中所说的键盘)输入文件,而是使用指定的文件作为标准输入设备。
- 修改:使用"<"符来修改标准输入设备。
类型 | 符号(语法) | 功能 |
---|---|---|
标准输入 | 命令<文件1 | 命令把文件1的内容作为标准输入设备 |
标识符限定输入 | 命令<<标识符 | 命令把标准输入中读入内容,直到遇到“标识符”分解符为止 |
输入输出重定向(同时使用) | 命令< 文件1 >文件2 | 命令把文件1的内容作为标准输入,把文件2作为标准输出。 |
③输出重定向
- 输出重定向:把输出信息写入到文件中,而非控制台(显示屏)。如果没有重定向,那么默认的输出设备是控制台。
类型 |
指令 |
效果 |
标准输出重定向 | 命令 > 文件 | 覆盖,把命令的正确输出内容输出到指定的文件 |
命令 >> 文件 | 追加,把命令的正确输出内容输出到指定的文件 | |
标准错误输出重定向 | 命令 2> 文件 | 覆盖,把命令的错误输出内容输出到指定的文件 |
命令 2>> 文件 | 追加,把命令的错误输出内容输出到指定的文件 | |
正确输出和错误输出同时保存 | 命令 > 文件 2>&1 | 覆盖,把正确输出和错误输出都保存到同一个文件 |
命令 >> 文件 2>&1 | 追加,把正确输出和错误输出都保存到同一个文件 | |
命令 &> 文件 | 覆盖,把正确输出和错误输出都保存到同一个文件 | |
命令 &>> 文件 | 追加,把正确输出和错误输出都保存到同一个文件 | |
命令 >> 文件1 2>>文件2 | 追加,正确输出追加到文件1中,错误输出追加到文件2 |
- /dev/null:如果要执行某个命令,但不要在屏幕上显示结果,可以将输出重定向到/dev/null。
用法
command > file 将输出重定向到 file。 command < file 将输入重定向到 file。 command >> file 将输出以追加的方式重定向到 file。 n > file 将文件描述符为 n 的文件重定向到 file。 n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。 n >& m 将输出文件 m 和 n 合并。 n <& m 将输入文件 m 和 n 合并。 << tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
例子
echo "hello world" > test7.sh
4)通配符
*:0或多个字符;
例子 | 说明 |
ls *.txt | 查找所有txt文件 |
ls 1*.txt | 以1开头的txt文件 |
?:1个字符
其实和正则表达式通配符完全相同,所以就不再多说了
1、终端
--help:帮助手册
如果要查看某个指令的参数选择,比如rm,有了两种方式
rm --help
man rm #更全 退出时按Q
tab:自动补全指令(有多个匹配项时,可以按两次tab显示全部匹配项,Windows也适用)
HOME或ctrl+a //光标迅速回到行首 == HOME
END或ctrl+e //光标迅速回到行尾
ctrl+insert //复制命令行内容(mac系统不能使用)
shift+insert //粘贴命令行内容(mac系统不能使用)
ctrl+k //剪切(删除)光标处到行尾的所有字符
ctrl+u //剪切(删除)光标处到行首的所有字符
ctrl+w //剪切(删除)光标前的一个字符
ctrl+y //粘贴
ctrl+c //中断终端正在执行的任务并开启一个新的一行
ctrl+d //退出当前shell命令行,如果是切换过来的用户,则执行这个命令回退到原用户
ctrl+r //搜索命令行使用过的历史命令记录
ctrl+g //从ctrl+r的搜索历史命令模式中退出
ctrl+l //清楚屏幕所有的内容,并开启一个新的一行
ctrl+s //锁定终端,使之任何人无法输入
ctrl+q //解锁ctrl+s的锁定状态
ctrl+z //暂停在终端运行的任务,使用"fg"命令可以使暂停恢复
!! //执行上一条命令
!pw //这是一个例子,是执行以pw开头的命令,这里的pw可以换成任何已经执行过的字符
!pw:p //这是一个例子,是仅打印以pw开头的命令,但不执行,最后的那个“p”是命令固定字符
!num //执行历史命令列表的第num条命令,num代指任何数字(前提是历史命令里必须存在)
!$ //代指上一条命令的最后一个参数,该命令常用于shell脚本中
esc+. //注意那个".“ 意思是获取上一条命令的(以空格为分隔符)最后的部分
esc+b //移动到当前单词的开头
esc+f //移动到当前单词的结尾
2、目录与文件
1)pwd(Print Working Directory):当前目录的路径
用法:pwd [-P]
参数
只有一个-P,如果当前目录是连接档,那么加-P后,会显示正确的完整路径。
2)Linux:ls指令
3)cd:访问目录
用法:cd [绝对路径/相对路径]
参数
参数 |
说明 |
相对路径 | 进入某个相对路径 |
绝对路径 | 进入绝对路径下的某个文件夹 |
.. | 返回上一级 |
~ | 回到根目录 |
- | 在上一个目录和本目录来回切换 |
~user | 回到user这个用户的根目录 |
注意
连接符是/而不是\,这点和Windows刚好相反
4)mkdir:构建新目录
用法:mkdir [-mp] 目录名
参数
- -m:指定该目录的权限(不然会用默认权限);
- -p:递归建立该目录(包括它所在的上层目录)。
例子
- -m指定目录权限
mkdir -m 711 test1
5)rmdir:删除(空)目录
用法:rmdir [-p] 目录名
参数
- -p:递归删除这个目录(会删除所有上层空的目录)
6)cp:复制
用法:
-
cp [-adfilprsu] [--preserver=all] 源文件路径 目标文件路径
-
cp [options] 源1 源2 ... 目标文档路径
选项
选项 |
说明 |
a | 相当于-dr --preserve=all,所有特性(包括所有者)完全复制 |
d | 若源文件为链接文件,那么复制的是链接文件属性而非用文件本身的属性 |
f | 强制,若目标文件已存在,则移除后再尝试一次 |
i | 若目标文件已存在,则会在覆盖时先询问 |
l | 建立硬式连结,而非复制文件本身(此时会采用执行者的特性) |
p | 连同文件属性一起复制,而不使用新属性 |
r | 递归复制,用于目录的复制 |
s | 复制成符号链接文件,即快捷方式 |
u | 目标文件不存在或比源文件旧时才复制 |
--preserve=all | 除了-p的权限相关参数外,还加入SELinux的属性 |
说明
- 如果有多个源文件,那么目标一定是目录;
- 不同身份的人执行这个指令会有不同的结果产生;
- cp别人的文件要先有r权限;
- 默认情况下,cp后的文件所有者为指令操作者本身;
- 复制目录必须加选项-r(使用新特性,可能改变权限)或-a(保持原特性);
- 可以通过修改目标文件名的方式实现复制+改名;
- 如果执行人本身没有修改文件的拥有者与群组的权限,那么即使加上-a,他也无法为复制后的文件修改拥有者和群组(第三和第四部分)
例子
①简单复制和覆盖复制
[root@study ~]# cp ~/.bashrc /tmp/bashrc [root@study ~]# cp -i ~/.bashrc /tmp/bashrc cp: overwrite `/tmp/bashrc'? n <==n 不覆盖,y 为覆盖
复制并改名(直接修改目标文件名即可)
cp -a wtmp dmtsai_wtmp
②复制前后的属性、特性变化
[root@study ~]# cd /tmp [root@study tmp]# cp /var/log/wtmp . <==想要复制到当前目录,最后的 . 不要忘 [root@study tmp]# ls -l /var/log/wtmp wtmp -rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp -rw-r--r--. 1 root root 28416 Jun 11 19:01 wtmp
如果要保证文件特性不变,应该在复制时加入选项-a或-p,此时看起来像是源文件的镜像
[root@study tmp]# cp -a /var/log/wtmp wtmp_2 [root@study tmp]# ls -l /var/log/wtmp wtmp_2 -rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 /var/log/wtmp -rw-rw-r--. 1 root utmp 28416 Jun 11 18:56 wtmp_2
③目录复制
需要加选项-r(会改变特性)、-a或-p(保证特性不变)
[root@study tmp]# cp /etc/ /tmp cp: omitting directory `/etc' <== 如果是目录则不能直接复制,要加上 -r 的选项 [root@study tmp]# cp -r /etc/ /tmp [root@study tmp]# cp -a /etc/ /tmp
④连结档
硬链接、实体链接:-l,会使文件属性第二项[连接数]增加
符号链接、快捷方式:-s
[root@study tmp]# cp -s bashrc bashrc_slink [root@study tmp]# cp -l bashrc bashrc_hlink [root@study tmp]# ls -l bashrc* -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc <==与源文件不太一样了! -rw-r--r--. 2 root root 176 Jun 11 19:01 bashrc_hlink lrwxrwxrwx. 1 root root 6 Jun 11 19:06 bashrc_slink -> bashrc
7)rm:删除文件或目录
用法:rm [-fir] 路径/正则路径
选项
选项 |
说明 |
f | force,忽略不存在的文件,不出现警告讯息 |
i | 互动模式,删除前询问 |
r | 递归删除,用于目录删除(危险选项) |
说明
- 使用正则路径,会删除所有匹配的路径
例子
①正则删除
[root@study tmp]# rm -i bashrc* # 注意那个星号,代表的是 0 到无穷多个任意字符喔!很好用的东西!
②删除目录,与rmdir的区别
[root@study tmp]# rmdir /tmp/etc rmdir: failed to remove '/tmp/etc': Directory not empty <== 删不掉啊!因为这不是空的目录! [root@study tmp]# rm -r /tmp/etc
8)mv:移动(重命名)文件
用法
-
mv [-fiu] 源路径 目标路径
-
mv [options] 源1 源2 源3 ... 目标路径
选项
选项 |
说明 |
f | force,如果目标文件存在,则直接覆盖 |
i | 若目标文件存在,会询问是否覆盖 |
u | 若目标文件存在,且源文件较新,才会覆盖 |
说明
- 如果有多个来源文件或目录,则最后一个目标文件一定是目录
例子
①常规复制、移动
例一:复制一文件,建立一目录,将文件移动到目录中 [root@study ~]# cd /tmp [root@study tmp]# cp ~/.bashrc bashrc [root@study tmp]# mkdir mvtest [root@study tmp]# mv bashrc mvtest
②更名
范例二:将刚刚的目录名称更名为 mvtest2 [root@study tmp]# mv mvtest mvtest2
还有个rename指令,可以同时对多个文档更名
③一次移动多个文件
[root@study tmp]# mv bashrc1 bashrc2 mvtest2
9)touch:①创建文件;②修改文件时间
用法:touch [-acdmt] 文件
选项
选项 |
说明 |
a | 修改atime |
c | 修改ctime |
d |
修改a、m时间 后接指定的时间而不用当前时间,也可以用--date="日期/时间" |
m | 修改mtime |
t |
修改a、m时间 后接指定时间而不用当前时间,格式[YYYYMMDDhhmm] |
例子
①常规,新建一个空文件并观察时间
[dmtsai@study tmp]# touch testtouch
[dmtsai@study tmp]# ls -l testtouch
-rw-rw-r--. 1 dmtsai dmtsai 0 Jun 16 00:45 testtouch
②复制,并观察前后文件的时间
[dmtsai@study tmp]# touch -d "2 days ago" bashrc
[dmtsai@study tmp]# date; ll bashrc; ll --time=atime bashrc; ll --time=ctime bashrc
Tue Jun 16 00:51:52 CST 2015
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 14 00:51 bashrc
-rw-r--r--. 1 dmtsai dmtsai 231 Jun 16 00:51 bashrc
变化的是atime和mtime,而ctime没变
3、文件内容
1)cat(concatenate):查看文件内容
用法:cat [-AbEnTv] 路径
选项
选项 |
说明 |
A | 相当于-vET,可以列出一些特输出字符,而非空白 |
b | 显示行号,仅针对非空白行,跳过空白行 |
E | 将结尾的断行符$显示出来 |
n | 显示行号,包括空白行 |
T | 将[TAB]以^I的方式显示出来 |
v | 列出一些看不出来的特殊字符 |
2)tac:反向显示
用法:同cat
和cat相反,从末行到首行显示
3)nl:添加行号显示
用法:nl [-bnw] 路径
选项
选项 |
说明 |
b |
指定行号显示的方式:
|
n |
行号显示的位置:
|
w | 设置行号字段共有多少位(默认6位,不足补0,即-n rz) |
例子
①常规显示(不显示空白行行号)
[root@study ~]# nl /etc/issue 1 \S 2 Kernel \r on an \m
显示空白行行号
[root@study ~]# nl -b a /etc/issue 1 \S 2 Kernel \r on an \m 3
②行号补0
[root@study ~]# nl -b a -n rz /etc/issue 000001 \S 000002 Kernel \r on an \m 000003
③设置行号有几位
[root@study ~]# nl -b a -n rz -w 3 /etc/issue 001 \S 002 Kernel \r on an \m 003
4)more:一页一页翻页显示
cat、tac、nl是全部显示,如果文件较大则显示不了前边的数据。用法:more 路径
按键
按键 |
说明 |
空格、b | 向下翻页、向上翻页 |
Enter | 向下翻一行 |
/word | 查找word |
:f | 显示出文件名及当前行数 |
q | 退出 |
5)less:一页一页翻页显示
比more更灵活,可以往回翻页
用法:less 路径
按键
这里的按键就是vim命令模式下的按键
按键 |
说明 |
空格 | 向下翻页 |
pagedown/pageup | 向下/上翻页 |
/word | 向下查找word |
?word | 向上查找word |
n | 重复上一次查找结果,并向下移动至下一个查找到的word字符首 |
N | 重复上一次查找结果,并向上移动至下一个查找到的word字符首 |
使用/word + n/N可以实现不停地向上/向下定位到某个想要字符处 | |
g | 移动至文档首行 |
G | 移动至文档尾行 |
q | 退出less |
6)head/tail:取首/尾若干行(默认10行)
用法:
-
head/tail [-n number] 路径:取首/尾若干行(默认10行)
-
tail -f 路径:持续输出(如果某个文件有持续写入时)
例子
①常规使用
# 默认显示前面十行 [root@study ~]# head /etc/man_db.conf #显示前 20 行 [root@study ~]# head -n 20 /etc/man_db.conf
②head -n 负号:不显示后n行
tail -n 正号:不显示前n行
#不显示后100行 [root@study ~]# head -n -100 /etc/man_db.conf
#不显示前100行 [root@study ~]# tail -n +100 /etc/man_db.conf
③tail -f:持续打印
④显示中间若干行 head -n 数字 | tail -n 数字
#取11~20行 head -n 20 /etc/man_db.conf | tail -n 10
7)od:非文本文件(数据文件data file或者二进制文件binary file)
用法:od [-t TYPE] 路径
选项
TYPE(n代表每个数字占用的字符) |
输出为哪种类型 |
a | 默认字符 |
c | ASCII字符 |
d[n] | 十进制 |
f[n] | 浮点数 |
o[n] | 八进制 |
x[n] | 十六进制 |
例子
①常规使用
#将/usr/bin/passwd 的内容使用ASCII 方式来展现 [root@study ~]# od -t c /usr/bin/passwd
②多选项,对照显示
#将/etc/issue 这个文件的内容以8 进位列出储存值与ASCII 的对照表 [root@study ~]# od -t oCc /etc/issue 0000000 134 123 012 113 145 162 156 145 154 040 134 162 040 157 156 040 \ S \n K e r n e l \ r o n 0000020 141 156 040 134 155 012 012 a n \ m \n \n 0000027
4、权限
- r-4
- w-2
- x-1
新文件的默认权限为(默认无执行权限):(-rw-rw-rw-) - umask
新目录的默认权限为:(drwxrwxrwx) - umask
文件权限
- r:读取
- w:编辑、改变其中内容(而非文件本身属性)
- x:被系统执行
Linux系统下,文件可否执行,不由扩展名.exe、.bat等决定,而由是否具有权限X决定。
一般来说,文件权限有w或x,一般要有前置权限r。
目录权限
- r:读取目录结构列表(该目录下的文件名数据)的权限,可以通过ls将该目录的内容列表显示;
- w:异动目录结构列表的权限(以下操作均是对该目录下的文件和目录开展的):
- 建立新文件及目录;
- 删除文件及目录;
- 更名;
- 移动。
- x:并非可执行该目录的意思,而是是否可以通过cd进入该目录,使其成为工作目录。
目录的三个权限互相独立,就算没r权限也可以有w和x,只是没r就无法用tab进行文件名补全了。
- 在架设网站给人浏览目录时,应至少给予r、x权限,因为不给x就无法到该目录下读取文件。
- 要读某个文件时,就要具备这个文件所在目录的x权限;
- 创建文件时,应至少具有它所在目录的wx权限。
权限与指令
指令 |
目录权限(至少拥有的权限) |
文件权限(至少拥有的权限) |
cd 目录 |
x | |
cp |
源目录:x 目标目录:x、w |
r |
ls 目录 | r | |
读取文件 cat、more、less |
x | r |
修改 nano、vim |
x | r、w |
建立文件 | w(必须)、x(有时不用) | |
cd目录并执行某个指令 | x | x |
说明
文件目录是按层次排列的,例如:/home/student/www/index.html,权限也是一层层识别的,如果没有进入上层结构的权限(目录x权限),那么对下层的各种操作就都没有权限了。
1)chgrp:修改群组
用法:chgrp [-R] dirname/filename ...
选项
- -R 递归变更,持续变更目录下的所有文件
说明
- 组名必须在/etc/group中存在(不存在会报错invalid group)
2)chown:修改所有者
用法
-
chown [-R] 所有者 文件或目录
-
chown [-R] 所有者:组名 文件或目录
选项
- -R 递归变更,持续变更目录下的所有文件
说明
- 用户必须在/etc/passwd中存在
例子
容器创建时,需要修改/applog的所属用户:用户组为dcos:docker:
chown dcos:docker /applog
3)chmod:修改权限
用法:
- chmod [-R] 数字权限 文件或目录
-
chmod [-ugoa] [+-=][rwx] 文件或目录
选项
- -R 递归变更同次目录下的所有文件
- xyz 权限代表的数字,每个角色都有一个数字,rwx=7,---=0
- u:user/owner
- g:group
- o:other
- a:all
例子
①将.bashrc的所有权限都设定为启用
chmod 777 .bashrc
②将.bashrc的user权限设置为rwx,group和other权限设置为rx,即文件权限为rwxr-xr-x
chmod u=rwx,go=rx .bashrc
③将.bashrc的权限设置为-rwxr-xr--
chmod u=rwx,g=rx,o=r .bashrc
④如果只是去除权限而不修改其它权限
chmod a-x .bashrc
4)umask:建立文件或目录时的默认权限
用法
①查看
-
umask:数字形式
-
umask -S:符号形式
②修改
-
umask 3位数字权限
例子
①正常用法
[root@study ~]# umask 0022 <==与一般权限有关的是后面三个数字! [root@study ~]# umask -S u=rwx,g=rx,o=rx
数字权限中的第一个数字是特殊权限,后三个才是一般权限
5、PATH
查询:echo $PATH
修改:PATH="${PATH}:绝对路径"
说明
- 只有位于PATH下的指令可以直接通过指令访问,位于其他路径下的指令只能通过路径/指令的方式执行;
- 如果要让别的路径下的指令(也是可执行文件名)也能直接通过指令的方式访问,则要把该路径加入PATH;
- 为了安全起见,不建议把当前目录.加入PATH。
6、查找、搜寻
1)which:(在PATH下)查找命令的绝对路径
用法:which [-a] 命令
选项
- a:将所有从PATH中找到的命令全部列出,而不止第一个;
例子
①查找ifconfig
[root@study ~]# which ifconfig /sbin/ifconfig
②which which
[root@study ~]# which which alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde' /bin/alias /usr/bin/which # 竟然会有两个 which ,其中一个是 alias 这玩意儿呢!那是啥? # 那就是所谓的『命令别名』,意思是输入 which 会等于后面接的那串指令啦!
③能调用某个命令,但却查找不到,例如history
[root@study ~]# which history /usr/bin/which: no history in (/usr/local/sbin:/usr/local/bin:/sbin:/bin: /usr/sbin:/usr/bin:/root/bin)
这是因为history是bash内建的指令,而which找的是PATH下的所有目录。对于这类指令就要用type指令。
2)whereis:从一些特定目录中查找文件
用法:whereis [-lbmsu] 路径
选项
选项 |
说明 |
l | 列出查找路径 |
b | 只找binary文件 |
m | 只找在man路径下的文件 |
s | 只找source源文件 |
u | 搜寻不在上述选项中的文件 |
3)locate/updatedb:利用数据库来搜寻文件名
locate:依据/var/lib/mlocate 内的数据库记载,找出用户输入的关键词文件名;
updatedb:根据/etc/updatedb.conf 的设定去搜寻系统硬盘内的文件名,并更新/var/lib/mlocate 内的数据库文件。
用法:locate [-iclSr] 指令
选项
选项 |
说明 |
i | 忽略大小写 |
c | 仅计算数量,不详细输出 |
l | 输出几行,5行就是-l 5 |
S | locate所用数据库的信息 |
r | 后接正规表达式 |
例子
①找出系统中与passwd相关的文档,只列出5个
[root@study ~]# locate -l 5 passwd /etc/passwd /etc/passwd- /etc/pam.d/passwd /etc/security/opasswd /usr/bin/gpasswd
②查询所使用的数据库信息
[root@study ~]# locate -S Database /var/lib/mlocate/mlocate.db: 8,086 directories # 总纪录目录数 109,605 files # 总纪录文件数 5,190,295 bytes in file names 2,349,150 bytes used to store database
说明
- 支持模糊查询,指令名可以不打全
- 数据库有更新频率,所以存在查询旧版本的问题;
- 输入指令updatedb更新数据库
4)find:查找
从各个方向(类型、时间、所有人……)查找
用法:find 路径 选项 动作
选项与例子:
-
时间:atime、ctime、mtime
以 -mtime 说明,注意 +-号 -mtime n :n 为数字,意义为在 n 天之前的『一天之内』被更动过内容的文件;<=1 -mtime +n :列出在 n 天之前(不含 n 天本身)被更动过内容的文件档名;>n -mtime -n :列出在 n 天之内(含 n 天本身)被更动过内容的文件档名。<=n -newer file :file 为一个存在的文件,列出比 file 还要新的文件档名
例子
#将过去系统上面 24 小时内有更动过内容 (mtime) 的文件列出 [root@study ~]# find / -mtime 0 # 那个 0 是重点!0 代表目前的时间,所以,从现在开始到 24 小时前, # 有变动过内容的文件都会被列出来!那如果是三天前的 24 小时内? # find / -mtime 3 有变动过的文件都被列出的意思! #寻找 /etc 底下的文件,如果文件日期比 /etc/passwd 新就列出 [root@study ~]# find /etc -newer /etc/passwd # -newer 用在分辨两个文件之间的新旧关系是很有用的!
-
使用者或组名
选项
说明
-uid n UID -gid n GID -user name 用户名 -group name 组名 -nouser 寻找不属于该系统中任何人的文件 -nogroup 寻找不属于该系统中任何群组的文件
当你自行安装软件时,很可能该软件的属性当中并没有文件拥有者, 这是可能的!在这个时候,就可以使用 -nouser 与 -nogroup 搜寻。例子
#搜寻 /home 底下属于 dmtsai 的文件 [root@study ~]# find /home -user dmtsai # 这个东西也很有用的~当我们要找出任何一个用户在系统当中的所有文件时, # 就可以利用这个指令将属于某个使用者的所有文件都找出来喔! #搜寻系统中不属于任何人的文件 [root@study ~]# find / -nouser # 透过这个指令,可以轻易的就找出那些不太正常的文件。如果有找到不属于系统任何人的文件时, # 不要太紧张,那有时候是正常的~尤其是你曾经以原始码自行编译软件时。
-
文件权限
选项
说明
-name filename 文件名为filename(可用通配符) -size [+-]SIZE 比SIZE大(+)或小(-),比50KB大--size +50K -type TYPE 文件类型:f b c d l s p -perm mode 权限刚好等于mode,mode为4位的权限数字 -perm -mode 权限涵盖mode -perm /mode 包含任一mode的权限 例子
范例五:找出档名为 passwd 这个文件 [root@study ~]# find / -name passwd 范例五-1:找出文件名包含了 passwd 这个关键词的文件 [root@study ~]# find / -name "*passwd*" # 利用这个 -name 可以搜寻档名啊!默认是完整文件名,如果想要找关键词, # 可以使用类似 * 的任意字符来处理 范例六:找出 /run 目录下,文件类型为 Socket 的檔名有哪些? [root@study ~]# find /run -type s # 这个 -type 的属性也很有帮助喔!尤其是要找出那些怪异的文件, # 例如 socket 与 FIFO 文件,可以用 find /run -type p 或 -type s 来找! 范例七:搜寻文件当中含有 SGID 或 SUID 或 SBIT 的属性 [root@study ~]# find / -perm /7000 # 所谓的 7000 就是 ---s--s--t ,那么只要含有 s 或 t 的就列出,所以当然要使用 /7000, # 使用 -7000 表示要同时含有 ---s--s--t 的所有三个权限。而只需要任意一个,就是 /7000
动作
- -exec 指令:使用别的指令处理搜寻到的结果
- -print:默认,将结果打印
例子#将上个范例找到的文件使用 ls -l 列出来 [root@study ~]# find /usr/bin /usr/sbin -perm /7000 -exec ls -l {} \; # 注意到,那个 -exec 后面的 ls -l 就是额外的指令,指令不支持命令别名, # 所以仅能使用 ls -l 不可以使用 ll
对例子的说明-
{ }代表find找到的内容,上例中,find的结果会被放在{ }中;
-
由于;在bash环境下有特殊意义,因此要用/转义。
-
多条件并列查询
#多条件查询 #-a表示and -o表示or find /home -name '1*' -a -type f
说明
- 与locate和whereis相比,find要查找硬盘,因此速度不如这二者;
7、文件系统
1)df:整体磁盘使用量
用法:df [-ahikHTm] [路径]
选项
选项 |
说明 |
无 | 以KB为单位列出系统内所有的文件系统(不包括特殊内存内的文件系统和swap) |
a | 列出所有文件系统,包括系统持有的/proc等文件系统 |
k | 以KB为单位显示 |
m | 以MB为单位显示 |
h | 以较易阅读的GB、MB、KB等格式自行显示 |
H | 以M=1000K取代1024K的进位方式 |
T | 连同该partition的文件系统类型(如xfs)也显示出来 |
i | 不用磁盘容量,而用inode的数量来显示 |
例子
①列出系统中的全部文件系统
每列含义:
- Filesystem:该文件系统在哪个partition
- 1K-blocks:下边的数字单位
- Used:用掉的空间
- Available:剩下的空间
- Use%:磁盘使用率
- Mounted on:磁盘挂载目录
②将容量以易读的容量格式显示出来
③将系统内所有特殊文件格式及名称都列出来
[root@study ~]# df -aT Filesystem Type 1K-blocks Used Available Use% Mounted on rootfs rootfs 10475520 3409368 7066152 33% / proc proc 0 0 0 - /proc sysfs sysfs 0 0 0 - /sys devtmpfs devtmpfs 627700 0 627700 0% /dev securityfs securityfs 0 0 0 - /sys/kernel/security tmpfs tmpfs 637568 80 637488 1% /dev/shm devpts devpts 0 0 0 - /dev/pts tmpfs tmpfs 637568 24684 612884 4% /run tmpfs tmpfs 637568 0 637568 0% /sys/fs/cgroup .....(中间省略)..... /dev/mapper/centos-root xfs 10475520 3409368 7066152 33% / selinuxfs selinuxfs 0 0 0 - /sys/fs/selinux .....(中间省略)..... /dev/mapper/centos-home xfs 5232640 67720 5164920 2% /home /dev/vda2 xfs 1038336 133704 904632 13% /boot binfmt_misc binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc # 系统里面其实还有很多特殊的文件系统存在的。那些比较特殊的文件系统几乎 # 都是在内存当中,例如 /proc 这个挂载点。因此,这些特殊的文件系统 # 都不会占据磁盘空间喔!
④将/etc下的可用磁盘容量以易读的容量格式显示
[root@study ~]# df -h /etc Filesystem Size Used Avail Use% Mounted on /dev/mapper/centos-root 10G 3.3G 6.8G 33% / #在 df 后面加上目录或者是文件时, # df会自动的分析该目录或文件所在的 partition ,并将该 partition 的容量显示出来, # 所以,您就可以知道某个目录底下还有多少容量可以使用了!
⑤将各个partition中可用的inode数量列出
#将目前各个 partition 当中可用的 inode 数量列出 [root@study ~]# df -ih Filesystem Inodes IUsed IFree IUse% Mounted on /dev/mapper/centos-root 10M 108K 9.9M 2% / devtmpfs 154K 397 153K 1% /dev tmpfs 156K 5 156K 1% /dev/shm tmpfs 156K 497 156K 1% /run tmpfs 156K 13 156K 1% /sys/fs/cgroup # 这个范例则主要列出可用的 inode 剩余量与总容量。通常 inode 的数量剩余都比 block 还要多呢
2)du:评估文件系统的磁盘使用量
用法:du [-ahskm] 路径
选项
选项 |
说明 |
无 | 统计当前目录下的各目录容量 |
a | 列出当前目录下的所有的文件和目录容量 |
h | 以人们较易读的容量格式显示 |
s | 列出总量,而不列出个别目录占用容量 |
S | 不包括子目录下的总计 |
k | 以KB作为容量单位 |
m | 以MB作为容量单位 |
说明
- 如果要知道该目录占了多少容量的话,使用-s就可以了
- 至于-S 这个选项部分,由于du 默认会将所有文件的大小均列出,假设在/etc使用du 时, 所有的文件大小,包括/etc下的次目录容量也会被计算一次。然后最终的容量(/etc) 也会加总一次, 因此很多人会误会du分析的结果不太对劲。所以啰,如果想要列出某目录下的全部数据, 也可以加上 -S 的选项,减少次目录的加总。
例子
①列出当前目录下的所有目录容量
[root@study ~]# du 4 ./.cache/dconf <==每个目录都会列出来 4 ./.cache/abrt 8 ./.cache ....(中间省略).... 0 ./test4 4 ./.ssh <==包括隐藏文件的目录 76 . <==这个目录(.)所占用的总量 # 直接输入 du 没有加任何选项时,则 du 会分析『目前所在目录』 # 的文件与目录所占用的磁盘空间。但是,实际显示时,仅会显示目录容量(不含文件), # 因此 . 目录有很多文件没有被列出来,所以全部的目录相加不会等于 . 的容量喔!
②列出当前目录下的所有目录和文件容量
[root@study ~]# du -a 4 ./.bash_logout <==有文件的列表了 4 ./.bash_profile 4 ./.bashrc ....(中间省略).... 4 ./.ssh/known_hosts 4 ./.ssh 76 .
③检查根目录下每个目录占用的容量
[root@study ~]# du -sm /* 0 /bin 99 /boot ....(中间省略).... du: cannot access ‘/proc/17772/task/17772/fd/4’: No such file or directory du: cannot access ‘/proc/17772/fdinfo/4’: No such file or directory 0 /proc <==不会占用硬盘空间! 1 /root 25 /run ....(中间省略).... 3126 /usr <==系统初期最大就是他了啦! 117 /var # 这是个很常被使用的功能~利用通配符 * 来代表每个目录,如果想要检查某个目录下, # 哪个次目录占用最大的容量,可以用这个方法找出来。值得注意的是,如果刚刚安装好 Linux 时, # 那么整个系统容量最大的应该是 /usr 。而 /proc 虽然有列出容量,但是那个容量是在内存中, # 不占磁盘空间。至于 /proc 里头会列出一堆『No such file or directory』 的错误, # 别担心!因为是内存内的程序,程序执行结束就会消失,因此会有些目录找不到,是正确的!
3)ln:建立链接
原理:实体链接与符号链接
用法:ln [-sf] 路径1 路径2(只能文件,不能是目录)
构建链接后,访问路径2,实际上是访问路径1
选项
-
s:不加s,硬链接;加s,符号链接;
- f:如果目标文件存在,就将目标文件移除后再建立;
说明:
-
把路径2链接到路径1,两个文件除了名字不同外,别的信息都相同;
- 链接后,两个文件的第二个字段(表示链接数)都会+1;
- 实体链接前后,磁盘空间与inode的数目都不变,只是在某个目录下的block多写入一个关联数据;符号链接会改变容量与inode;
- 不能链接目录
限制
- 不能跨文件系统
- 不能链接目录
例子:
①实体链接
[root@study ~]# ll -i /etc/crontab 34474855 -rw-r--r--. 1 root root 451 Jun 10 2014 /etc/crontab [root@study ~]# ln /etc/crontab . <==建立实体链接的指令 [root@study ~]# ll -i /etc/crontab crontab 34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab 34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
②符号链接/快捷方式
[root@study ~]# ln -s /etc/crontab crontab2
[root@study ~]# ll -i /etc/crontab /root/crontab2
34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab
53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab
- 两个文件指向不同的inode,说明两个文件独立存在。
- 连结档的大小为12bytes,因为->右边的档名[/tec/crontab]共有12个英文,每个英文占用1B,因此文件大小就是12B
4)lsblk:list block device列出系统上的所有磁盘列表
用法:lsblk [-dfimpt] [device]
选项:
选项 |
说明 |
d | 仅列出磁盘本身,不会列出该磁盘的分区数据 |
f | 同时列出该磁盘内的文件系统名称(UUID) |
i | 使用ASCII的线段输出,不使用复杂编码 |
m | 同时输出该装置在/dev下的权限数据 |
p | 列出该装置的完整文件名 |
t | 列出该磁盘的详细数据 |
例子
①默认
[root@study ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 40G 0 disk # 一整颗磁盘
|-vda1 252:1 0 2M 0 part
|-vda2 252:2 0 1G 0 part /boot
`-vda3 252:3 0 30G 0 part
|-centos-root 253:0 0 10G 0 lvm / # 在 vda3 内的其他文件系统
|-centos-swap 253:1 0 1G 0 lvm [SWAP]
`-centos-home 253:2 0 5G 0 lvm /home
该系统有个sr0以及一个vda,vda之下又有三个分区,vda3之下还有因为LVM产生的文件系统。
默认输出:
- NAME:装置的文件名,会省略/dev 等前导目录!
- MAJ:MIN:主要:次要装置代码
- RM:是否为可卸除装置(removable device),如光盘、USB 磁盘等等
- SIZE:容量
- RO:是否为只读装置
- TYPE:类别,如磁盘(disk)、分区槽(partition) 、只读存储器(rom) 等
- MOUTPOINT:挂载点
②
范例二:仅列出 /dev/vda 装置内的所有数据的完整文件名
[root@study ~]# lsblk -ip /dev/vda
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
/dev/vda 252:0 0 40G 0 disk
|-/dev/vda1 252:1 0 2M 0 part
|-/dev/vda2 252:2 0 1G 0 part /boot
`-/dev/vda3 252:3 0 30G 0 part
|-/dev/mapper/centos-root 253:0 0 10G 0 lvm /
|-/dev/mapper/centos-swap 253:1 0 1G 0 lvm [SWAP]
`-/dev/mapper/centos-home 253:2 0 5G 0 lvm /home # 完整的檔名,由 / 开始写
5)blkid:列出装置的UUID等参数
用法:blkid
说明:列出装置的UUID(Universally Unique Identifier),它叫全局单一标识符,等同于lsblk -f。Linux会为系统中的所有装置给予一个独一无二的标识符,这个标识符可以用来作为挂载或者使用这个装置。
例子
[root@study ~]# blkid
/dev/vda2: UUID="94ac5f77-cb8a-495e-a65b-2ef7442b837c" TYPE="xfs"
/dev/vda3: UUID="WStYq1-P93d-oShM-JNe3-KeDl-bBf6-RSmfae" TYPE="LVM2_member"
/dev/sda1: UUID="35BC-6D6B" TYPE="vfat"
/dev/mapper/centos-root: UUID="299bdc5b-de6d-486a-a0d2-375402aaab27" TYPE="xfs"
/dev/mapper/centos-swap: UUID="905dc471-6c10-4108-b376-a802edbd862d" TYPE="swap"
/dev/mapper/centos-home: UUID="29979bf1-4a28-48e0-be4a-66329bf727d9" TYPE="xfs"
每一行都代表一个文件系统,主要列出装置名称、UUID名称、文件系统类型(TYPE)
6)parted:列出磁盘的分区表类型和分区信息
用法:parted 装置名 print
例子
[root@study ~]# parted /dev/vda print
Model: Virtio Block Device (virtblk) # 磁盘的模块名称(厂商)
Disk /dev/vda: 42.9GB # 磁盘的总容量
Sector size (logical/physical): 512B/512B # 磁盘的每个逻辑/物理扇区容量
Partition Table: gpt # 分区表的格式 (MBR/GPT)
Disk Flags: pmbr_boot
Number Start End Size File system Name Flags # 底下才是分区数据
1 1049kB 3146kB 2097kB bios_grub
2 3146kB 1077MB 1074MB xfs
3 1077MB 33.3GB 32.2GB lvm
7)磁盘分区:gdisk/fdisk
说明
-
fdisk:MBR分区
-
gdisk:GPT分区