一、 Linux命令格式
1.1 命令提示符
[root@localhost ~] #
其中:
root:当前登录用户
localhost:主机名
~:当前所在目录(家目录)(pwd查看路径)
超级用户的家:/root
普通用户的家:/home/user1
#:超级用户的提示符,普通用户为 $
1.2 命令格式
命令 [选项] [参数] (个别命令不遵循)
1.3 查询目录中的内容:ls
ls [选项] [文件或目录]
选项:
-a显示所有文件,包括隐藏文件(all)
-l显示详细信息
-d查看目录属性(directory)
-h人性化显示文件大小,显示为kb大小,不是bit(human)
-i显示inode(文件inode编号)
-t按修改时间排序(最新的在最前面)
-r(反序)
示例:
ls -l # 别名为ll
ls -a
ls -lh
ls -ld # 查看当前目录的属性
ls -ld /etc/ # 查看etc目录的属性
ls -l | grep mongo # 过滤只看包含mongo的文件/夹
ls -lrt # 按照时间升序
ls -lt # 按照时间降序(最新修改的排在前面)
1.4 文件系统和权限
示例:
位数:1 + 3 + 3 + 3
- rw- r-- r--
d rwx r-x r-x
A、第一部分表示文件类型(共7种):
-文件(-普通文件)
d目录(directory目录)
l软链接(link软链接,即快捷方式)
c字符设备(char字符设备文件:即串行端口的接口设备,例如键盘、鼠标等等)
b块设备(block块设备文件 :就是存储数据以供系统存取的接口设备,简单而言就是硬盘)
s套接字文件(s在网络中客户端通过套接字来进行数据通信)
p管道(piping主要的目的是解决多个程序同时存取一个文件所造成的错误,如FIFO先进先出)
B、 后面3部分表示权限:
rw- r-- r--
u所有者 g所属组 o其他人
user group other
C、权限
r:读
w:写
x:执行
D、读、写、运行三项权限可以用数字表示:
r=4, w=2, x=1(二进制转十进制数字)
如:rw-r--r--用数字表示就是644,最高权限数字表示为777
如:sudo chmod -R 777 /usr/local/lib/node_modules/(给nodejs的安装目录赋予最高权限)
1.5 help帮助文档
ls --help(显示ls命令的帮助文档,两个杠)
mkdir --help(显示mkdir命令的用法)
二、 Linux目录处理命令
2.1 建立目录:mkdir(make directories)
mkdir -p [目录名]
选项:
-p递归创建
示例:
mkdir -p a/b # (a和b目录会被同时创建)
2.2 切换所在目录:cd(change directory)
cd [目录]
简化操作:
cd ~ 进入当前用户的家目录
cd 同cd ~
cd - 进入上次目录
cd .. 进入上一级目录
cd . 进入当前目录(实际没什么意义)
2.3 查询当前用户所在目录:pwd(print working directory)
pwd
2.4 删除空目录:rmdir(remove empty directories)(很少使用)
rmdir [目录名]
2.5 删除文件或目录:rm(remove)
rm -rf [文件或目录]
选项:
-r 删除目录
-f 强制(force不给是否确认删除提示,最好别这样操作)
rm -rf / 这个段子你一定听过吧,删除所有,包括系统本身!
2.6 复制命令:cp(copy)
cp [选项] [原文件或目录] [目标目录]
选项:
-r 复制目录,不加r表示复制文件
-f 强制(经常中复制整个文件夹时使用)
-i 覆盖时给出询问
-p 连带文件属性复制,(使创建时间一致)
-d 若原文件是链接文件,则复制链接属性
-a 全部,相当于 -pdr,一般这样操作就可以了
如:
# 复制springframework到org目录下
cp -rf ~/Desktop/springframework /org # 强制覆盖
# 复制文件abc到tmp目录下(创建时间为当前时间)
cp abc /tmp/ # 默认,不保留原文件的创建时间,注意使用场景
# 复制文件abc到tmp目录下(创建时间为原来文件的时间)
cp -a abc /tmp/ # 比如复制某个jar包,为了保留它的原始创建时间,建议加上-a或-p参数
cp -a test1.json test2.json # 复制文件test1.json到当前目录下命名为test2.json
cp -a t1 t2 # 复制文件夹t1到t2,包括t1下的全部文件均复制过去
2.7 剪切或重命名(改名)命令:mv(move)
mv [原文件或目录] [目标目录]
如果目标目录和原文件在同一目录则为改名
选项:
-i 若指定目录已有同名文件,则先询问是否覆盖旧文件
-f 在 mv 操作要覆盖某已有的目标文件时不给任何指示
# 将文件aaa.txt更名为bbb.txt
mv aaa bbb
# 将info目录放入logs目录中。注意,如果logs目录不存在,则该命令将info改名为logs
mv info/ logs
# 将/usr/student下的所有文件和目录移到当前目录
mv /usr/student/* .
2.8 链接命令:ln(link)
ln [选项] [原文件] [目标文件]
选项:
-s 创建软链接
如:
ln -s /root/abc.cfg /tmp/def.cfg
特征总结:软链接的原文件一定要写绝对路径,硬连接一般不推荐使用。
A、软链接特征,简单理解就是windows快捷方式
1、类似windows快捷方式
2、软链接有自己的i节点和block块,但数据块中只保存原文件的文件名和i节点号,并无实际文件数据
3、lrwxrwxrwx 软链接文件的权限都一样
4、修改任意文件,另一个都改变
5、删除原文件,软链接无法使用
B、硬链接特征,简单理解就是复制保存了一个文件副本但是不占用空间
1、拥有相同的i节点和存储block块,可以作为同一个文件(文件链接数+1,删除则-1,当减到0时系统会真正回收删除)
2、可通过i节点识别(优势,删除任意一个,另一个还可以使用)
3、不能跨分区(硬伤)
4、不能针对目录使用(只能对文件使用)
三、 Linux文件搜索、查找、查看命令
先汇个总,本节主要涉及的命令有:
1、最强大的搜索命令:find
2、快速查找文件或目录:locate
3、搜索命令所在的目录及别名信息:which
4、搜索命令所在的目录及帮助文档路径:whereis
5、对文件进行关键字查找:grep
6、查看一个文件:cat
7、分页显示一个文件并且可以回头:less
8、分页显示一个文件或任何输出结果:more
9、指定显示前多少行文件内容:head
10、指定显示文件后多少行内容:tail
11、查看文件内容多少字符多少行多少字节:wc
12、排序文件内容:sort
13、命令别名:alias (简化命令)
14、远程文件拷贝命令:scp
3.1 最强大的搜索命令:find
查找各种文件的命令:
可以按照搜索层级、文件类型查找、时间戳、文件权限来查找、文件名和inode查找、文件所属组或所属人、组合条件等来查找,常用参数:
find [搜索目录] [参数] [搜索字符]:
-name:按照文件名称查找,-name区分大小写,-iname不区分大小写
-size:按照文件大小查找
-user:按照用户分类查找
如:
# 精准搜索,名字必须为 init 才能搜索的到
find /etc -name init
# 模糊搜索:*匹配任意内容,?匹配任意一个字符,[]匹配任意一个中括号内的字符
find /etc -name *.conf # 以 .conf 结尾的文件或目录名
find /etc -name abc.con?
find /etc -name abc.con[fg]
# 搜索当前目录中,所有文件名以my开头的文件,并显示它们的详细信息
find . -name 'my*' -ls
# 搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录
find . -type f -mmin -10
# 按文件大小
find / -size 10M # 等于10M
# 组合搜索:-a为and,-o为or
find / -size +10M -a -size -20M # 大于10M且小于20M
# 按所有者
find /home -user root # root用户拥有权限的文件
find /home -nouser # 查找没有所有者的文件
# 按时间搜索:atime文件访问时间,ctime改变文件属性时间,mtime修改文件内容时间
find /root -mtime +10 # +10为十天前修改的文件,-10为十天内修改的文件,10为十天当天修改的文件
# 查找最近一天以内修改的文件:
find / -mtime -1 -ls | more
# 对搜索结果执行操作:-exec [命令] {} \; (固定格式中间有空格哦)
find / -size +10M -a -size -20M -exec ls -lh {} \;
# 删除当前目录下所有以txt结尾的文件
find ./ -name “*.txt” | xargs rm
# 查找指定路径下,文件内容包含cront的文件
find /root/.md/ | xargs grep 'cront'
# 查找指定路径下文件名包含.sh,文件内容包含cront的文件
find /root/.md/ -name .sh | xargs grep 'cront'
缺点:
在硬盘上遍历当前工作目录及其子目录,非常耗硬盘资源,查找效率相比locate较低
3.2 查找文件或目录:locate
locate命令要比find -name快得多,原因在于它不搜索具体目录,而是搜索一个数据库/var/lib/mlocate/mlocate.db
locate [文件名或目录]
选项:
-i 不区分大小写
-n N 只列举前N个项目
-r 支持正则表达式
如:
locate locate # 模糊搜索含locate的文件名,可以找到mlocate数据库哦
locate /etc/my # 搜索etc目录下所有以my开头的文件,查找结果为/etc/my.cnf
特点:
速度快,数据库索引一天一更新
缺点,只能按文件名搜索
配置:
手动更新数据库:updatedb,可以立即生效
数据库所在位置:/var/lib/mlocate
配置不搜索的项:/etc/updatedb.conf配置文件
PRUNE_BIND_MOUNTS = "yes" #开启搜索限制
PRUNEFS = "9p afs bdev ncpfs nfs nfs4 nfsd pipefs proc" #不搜索的文件系统
PRUNENAMES = ".git .hg .svn" #不搜索的文件类型
PRUNEPATHS = "/afs /media /net /sfs /tmp /var/tmp" #不搜索的路径
注意:配置文件对which、whereis命令同样有效
3.3 搜索命令所在的目录及别名信息:which
which #有别名的话which可查出
which pwd # 查找结果为 /bin/pwd
which ll # 查找结果为 ll: aliased to ls -lh
注意:which 查找的可执行文件,必须是要在 PATH 下的可执行文件,即使他是可执行文件,但是没有加入到系统搜索路径,他仍然无法被 which 发现
3.4 搜索命令所在的目录及帮助文档路径:whereis
whereis #搜索命令所在路径及帮助文档所在位置
选项:
-b:只查找可执行二进制文件binary
-m:只查找帮助文件man
-s:只查找源代码文件source
如果省略参数,则返回所有信息
如:
whereis pwd
# 查找结果为pwd: /bin/pwd /usr/include/pwd.h /usr/share/man/mann/pwd.n.gz /usr/share/man/man1/pwd.1.gz /usr/share/man/man1p/pwd.1p.gz
可以看到:whereis不仅找到了 ls 可执行文件的位置,还找到了其 man 帮助文件,可见其搜索范围比较广,不局限于PATH
3.5 对文件进行关键字查找:grep 和 |(管道符)
grep [参数] 关键字 源文件
常用的参数:
n:显示关键字所在文件的行号
i:忽略大小写查询关键字
#查找前缀有test的文件包含"test"字符串的文件
grep test test*
# 查找日志文件中包含特定字符串的文件,并打印出该字符串的行
grep -n '2019-10-24 00:01:11' *.log
# 递归方式查找指定目录/etc/acpi及其子目录下所有文件中包含字符串"update"的文件
grep -r update /etc/acpi
# 反向查找,通过"-v"参数可以打印出不符合条件行的内容
grep -v test *test*
|(管道符)
在使用grep指令的时候,往往会配合管道符使用,管道符的作用就是连接其他指令,将一个指令的返回结果,交给另一个指令处理。
例如:
cat /tmp/my.log | grep -n "error"
# 以上的命令是将cat指令查看log文件的内容交给grep指令处理,grep指令筛选出含有"error"关键字的内容
xargs常和管道一起使用
xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。
[一些传递参数结果的命令] | xargs [-选项] [后续命令]
# 批量将dos文件转为unix格式
find . -name 'xxx_env' | xargs dos2unix
# 假如你有一个文件包含了很多你希望下载的 URL,你能够使用 xargs下载所有链接:
cat url-list.txt | xargs wget -c
# -n 选项多行输出,test.txt中内容为:a b c d e f g h i
cat test.txt | xargs -n3
a b c
d e f
g h i
3.6 查看一个文件:cat
适合小文件
cat filename 一次显示整个文件,加载整个文件,-n 带行号(小写n)
grep 结合定位查找:
cat log.txt | grep 'ERROR' -A 5 # 查找ERROR字符,并显示ERROR所在行的之后5行
cat log.txt | grep 'ERROR' -B 5 # 之前5行
cat log.txt | grep 'ERROR' -C 5 # 前后5行
cat log.txt | grep 'ERROR' -C 0 # 仅显示全部错误所在行内容
cat log.txt | grep -v 'ERROR' # 排除ERROR所在的行
3.7 分页显示一个文件并且可以回头:less
适合读取固定大文件
less -N filename 分页显示整个文件,不提前加载整个文件(大写N)
空白键(space)下一页,b 键(back)上一页,
搜寻字串
:q退出
3.8 分页显示一个文件或任何输出结果:more
同less区别是支持实时滚动,读取固定文件可以用less替代
more -N filename 分页显示整个文件,但是提前加载整个文件(大写N)
空白键(space)下一页,b 键(back)上一页,
搜寻字串
3.9 指定显示前多少行文件内容:head
head [选项] [文件名]
选项:
-f 用于监视File文件增长,实时读取最新的内容
-n<行数> 显示文件的前n行内容
-c<数目> 显示文件的前n个字节
示例:
# 显示filename,默认为前10行
head filename
# 显示filename前20行
head -20 filename
# 抽取前10行日志到文件(>清空并写入,>>表示追加)
head -10 access.log > 10_access.log
wc -l 10_access.log # 查看文件行数
3.10 指定显示文件后多少行内容:tail
tail [选项] [文件名]
选项:
-f 用于监视File文件增长,实时读取最新的内容
-n<行数> 显示文件的尾部n行内容
-c<数目> 显示的字节数
示例:
# 监视filename文件的尾部内容(默认10行),刷新显示在屏幕上,按CTRL+C退出
tail -f filename
# 监视filename文件的尾部内容最后20行
tail -f 20 filename
# 显示filename最后20行
tail -n 20 filename
# 显示filename第10行以后的内容
tail -n +10 filename
# 显示filename的最后10个字符
tail -c 10 filename
3.11 查看文件内容多少字符多少行多少字节:wc
wc [选项][文件名]
选项:
-l 显示总行数(lines)
-c 显示Bytes总字节数(chars)
-w 显示总字数(words)
# 显示filename总行数
wc -l filename
3.12 排序文件内容:sort
sort [选项][文件名]
选项:
-r 以相反的顺序来排序
-n 依照数值的大小排序
-b 忽略每行前面开始出的空格字符
-f 排序时,将小写字母视为大写字母
# 默认方将按第一列以ASCII码的次序排列
sort filename
# 反序排列
sort -r filename
# 列出当前目录下所有文件/文件夹的大小,按照大小倒序, 取前10个结果
du -sh *|sort -rh|head -10
3.13 命令别名 :alias (简化命令)
语法:alias [选项][别名]=[指令名称]
执行alias可以看到当前系统已经定义的别名,形如:
-='cd -' # cd -是返回到上一次的工作目录
...=../.. # cd ..是返回上一层目录
_='sudo '
ll='ls -lh'
la='ls -lAh'
md='mkdir -p' # 递归创建目录
vpn='~/shell/twvpn.sh' # 执行执行脚本,很方便哦
命令示例:
alias gc='git clone'
alias vpn='~/shell/twvpn.sh'
alias cdhd='cd software/hadoop-3.1.1'
- unalias 取消别名,-a 取消所有别名:
unalias gc
- 一般都是直接添加到.bashrc文件中:
alias vpn="~/shell/twvpn.sh"
永久生效配置文件:.bashrc
仅对当前用户:~ /.bash
对所有用户:/etc/bash
注意事项:
需要刷新才会生效哦:source .bashrc
sh执行脚本:
1.注意用户和文件权限的问题
2.给执行的脚本文件加777权限 chmod 777 xxx.sh
3.脚本里面的命令要判断是否加sudo,例如git的更新操作如不是之前定好的用户则会报错。
3.14 远程文件拷贝命令:scp
语法:
scp [选项] 源文件/目录 目标文件/目录
选项:
-P 大写的,指定端口号
-r 递归复制整个目录
-v 显示所有 debug 信息
-q 不显示传输进度
-C 大写的,启用压缩
-4 使用 IPv4 地址
-6 使用 IPv6 地址
A. 本地复制到远程:
scp -r local_folder remote_username@remote_ip:remote_folder
或者
scp -r local_folder remote_ip:remote_folder
第1个指定了用户名,命令执行后需要再输入密码;
第2个没有指定用户名,命令执行后需要输入用户名和密码;
示例:
# 复制文件
scp /root/test.txt root@192.168.1.10:/root/
# 复制文件并重命名
scp /root/test.txt root@192.168.1.10:/root/test1.txt
# 复制整个目录(递归复制)
scp -r /root/test/ root@192.168.1.10:/root/
B. 远程复制到本地:
远程复制到本地与从本地复制到远程命令类似,不同的是远程文件作为源文件在前,本地文件作为目标文件在后。
示例:
scp root@192.168.1.10:/root/test.txt /root/test.txt
C. 避免每次都输入远程密码:
- 方法一:
# 首先在本机上生成配对密钥(一路回车键即可)
ssh-keygen -t rsa
# 其中公共密钥保存在 ~/.ssh/id_rsa.pub
# 私有密钥保存在 ~/.ssh/id_rsa
# 然后将本机上的公钥文件拷贝到远程机器,并命名为 authorized_keys
scp /root.ssh/id_rsa.pub root@192.168.1.10:/root/.ssh/authorized_keys
- 方法二:
# 安装sshpass,scp结合sshpass可带上密码传输文件
sshpass -p mima scp root@149.xx.xx.xx:/var/log/tpcc_mysql.rtx a.rtx
# 这个方法有个缺点,还是需要每次都输且会暴露明文密码
说明:
- 上面的ip也都可以直接使用绑定的域名哦
- 如果远程服务器防火墙有为scp命令设置了指定的端口,我们需要使用 -P 参数来设置命令的端口号,命令格式如下:
#scp 命令使用端口号 4588
scp -P 4588 root@www.myweb.com:/root/test.txt /root/test.txt
- 使用scp命令要确保使用的用户具有可读取远程服务器相应文件的权限,否则scp命令是无法起作用的。
四、 Linux压缩命令
常见压缩格式有:.zip、.gz.、bz2、.tar、.tar.gz、.tar.bz2 等。
4.1 .zip 格式压缩
与windwos通用,如果是windows传文件给linux,建议使用zip,不使用rar。
- zip 压缩
zip [选项] 压缩文件名 源文件或目录
选项:
-r 递归处理,将指定目录下的所有文件和子目录一并处理
-q 不显示指令执行过程
示例:
# 压文件
zip cat.zip cat.php
# 压目录
zip -q -r flink.zip /home/flink # 将/home/flink/目录下所有文件和文件夹打包为当前目录下的 flink.zip
zip -q -r flink.zip * # 如果当前目录在 /home/flink 下,可用*号替代,执行此命令
# 只看,不解压文件
zip -sf flink.zip
- unzip 解压
zip [选项] 压缩文件名
选项:
-q 执行时不显示任何信息
-l 显示压缩文件内所包含的文件
-d<目录> 指定文件解压缩后所要存储的目录
示例:
# 解压flink.zip到当前目录
unzip flink.zip
# 不显示解压过程信息
unzip -q flink.zip
# 查看flink.zip中包含的文件
unzip -l flink.zip
4.2 .gz 格式压缩
通常跟打包命令 tar 合用,因为自己只能压缩单个文件,单独使用较少。
另外,不指定-c保留则源文件都会消失。
gzip [选项] 源文件或目录
选项:
-d 解开压缩文件
-l 列出压缩文件的相关信息
-r 递归处理,将指定目录下的所有文件及子目录一并处理
-c 保留源文件,gzip -c 源文件 > 压缩文件
示例:
- 压文件
# 不保留源文件
gzip a.java # 源文件压缩后会消失,无需指定压缩名,为源文件+.gz格式构成
# 批量压文件
# 若当前目录下有文件 a.java b.xml
gzip * # 执行结果为:a.java.gz b.xml.gz
# 保留源文件
gzip -c a.java > a.java.gz # 源文件不会消失
- 压目录中的全部子文件
gzip -r 目录(压缩目录下所有子文件,但不能压目录,将自动忽略掉)
# 压目录
gzip -r testdir # 结果为testdir.gz
# 显示压缩文件的信息
gzip -l *
- 解压文件
gzip -d 压缩文件 # -d参数为解压
或
gunzip 压缩文件 - 解压目录
gunzip -r 目录 # 将目录中.gz压缩文件全部解压,压缩文件会消失
4.3 .bz2 格式压缩
与 .gz 格式类似,但是不能压缩目录(除非先打包为.tar),故单独使用较少。
通常跟打包命令 tar 合用,另外,不指定-k保留则源文件都会消失。
bzip2 [选项] 源文件
选项:
-d 解开压缩文件
-k 保留源文件,gzip -k 源文件 > 压缩文件
- 不保留源文件
bzip2 源文件 - 保留源文件
bzip2 -k 源文件 - 解压
bzip2 -d 压缩文件
或
bunzip2 压缩文件
4.4 .tar 打包后压缩
- tar [选项] [打包文件名] [源文件]
选项:
-c:打包(copy复制备份,记忆为压缩)
-x: 解开打包(x是剪开,记忆为解压)
-v:显示过程(view)
-f:指定打包后的文件名(file)
# 解开打包
tar -xvf test.tar
# 打包
tar -cvf test.tar test
# 接着可执行前面的压缩命令如:
bzip2 test.tar
# 只看,不解压文件
tar -tf test.tar #只展示名字
tar -tvf test.tar #展示文件详细列表,也可以用参数-ztvf,是.tar和.tar.gz通用的
4.5 .tar.gz 格式压缩
本质上是先打包为.tar格式,再压缩为.gz格式
虽然无强制要求.tar.gz后缀,但推荐这样命名
- 压缩
tar -zcvf [压缩包名.tar.gz] [源文件]
选项:
-z: 压缩为.tar.gz格式 - 解压
tar -zxvf [压缩包名.tar.gz]
选项:
-x: 解压缩.tar.gz格式 - 查看
tar -ztvf [压缩包名.tar.gz]
-t: 只看包中内容,不解压 - 指定解压目录(-C 指定目录)
如:tar -zxvf mongodb-linux1804.tar.gz -C /usr/local/mongodb
4.6 .tar.bz2 格式压缩
本质上是先打包为.tar格式,再压缩为.bz2格式
- 压缩
tar -jcvf [压缩包名.tar.bz2] [源文件]
选项:
-z: 压缩为.tar.bz2格式 - 解压
tar -jxvf [压缩包名.tar.bz2]
选项:
-x: 解压缩.tar.bz2格式 - 查看
tar -ztvf [压缩包名.tar.bz2]
-t: 只看包中内容,不解压 - 压缩多个源文件(用空格隔开)
tar -jcvf [压缩包名.tar.bz2] [源文件1] [源文件2] - 指定解压目录(-C 指定目录)
如:tar -jcvf test.tar.bz2 -C /tmp/ -
总结:
.zip可与windows通用,建议平时的工作文档可以选择这样压缩,方便传输;
.tar.gz在linux中普及,建议程序包打成这样的格式;
牢记:
-zcvf:打包 (.tar.gz格式)(c就是复制备份,记忆为压缩)
-zxvf:解压包(.tar.gz格式)(x是剪开,记忆为解压)
-ztvf:只看不解(通用)(t为temp,临时查看一下)