ftp
用来设置文件系统相关功能scp
加密的方式在本地主机和远程主机之间复制文件touch
创建新的空文件rename
用字符串替换的方式批量改变文件名dirname
去除文件名中的非目录部分ln
用来为文件创建连接cat
连接文件并打印到标准输出设备上diff
比较给定的两个文件的不同which
查找并显示给定命令的绝对路径find
在指定目录下查找文件whereis
查找二进制程序、代码等相关文件路径tail
在屏幕上显示指定文件的末尾若干行head
在屏幕上显示指定文件的开头若干行less
分屏上下范爷浏览文件内容more
显示文件内容,每次显示一屏cut
用来显示行的指定部分,删除文件中的指定字段cksum
用于检查文件货数据流校验和vi
功能强大的纯文本编辑器sed
自动编辑文件,简化对文件的反复操作chmod
用来变更文件或目录的权限chown
用来变更文件或目录的拥有者或所属群组stat
用于显示文件的状态信息file
用来探测给定文件的类型grep
强大的文本搜索工具look
显示文件中以指定字符串开头的任意行tac
将文件已行为单位的反序输出sort
将文件进行排序并输出tar
Linux 下的归档使用工具,用于打包和备份gzip
用于压缩文件gunzip
用于解压缩文件zip
可以用来解压缩文件unzip
用于解压缩由 zip 命令压缩的压缩包dd
转换和复制文件scp(secure copy)用来进行文件传输。也可以用来传输目录。也有更高级的 sftp
命令。
# 本地复制远程文件# scp <remote-address> <local-address>scp username@hostname:/usr/test/test.tar.gz /temp/test.tar.gz# 远程复制本地文件# scp <local-address> <remote-address>scp /temp/test.tar.gz username@hostname:/usr/test/test.tar.gz# 本地复制远程目录# scp -r <remote-address> <loacal-address>scp -r username@hostname:/usr/test/test.tar.gz /temp/test.tar.gz# 远程目录复制至本地目录# scp -r <local-address> <remote-address>scp -r /temp/test.tar.gz username@hostname:/usr/test/test.tar.gz# 本地复制远程文件到指定目录# scp <remote-address> <local-address>scp username@hostname:/usr/test/test.tar.gz /temp/test/# 远程复制到本地文件到指定目录# scp -r <local-address> <remote-address>scp /temp/test.tar.gz username@hostname:/usr/test/test/tar.gz
ln
命令用来为文件创件连接,连接类型分为硬连接和符号连接两种,默认的连接类型是硬连接。
使用 -s
选项,则源文件可以是文件或目录。创建硬链接时,则源文件参数只能是文件。
# 将当前目录的 afile 链接到当前目录下的文件 bfileln afile bfile# 对源文件 afile 建立与 bfile 的符号连接,而非硬连接ln -s afile bfile
Linux 具有为一个文件起多个名字的功能,称为链接。被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份。另外,被链接的文件也可以有相同的文件名,但是存放在不同的目录下,这样只要对一个目录下的该文件进行修改,就可以完成对所有目录下同名链接文件的修改。对于某个文件的各链接文件,我们可以给它们指定不同的存取权限,以控制对信息的共享和增强安全性。
文件链接有两种形式,即硬链接和符号链接。
硬链接
建立硬链接时,在另外的目录或本目录中增加目标文件的一个目录项,这样,一个文件就登记在多个目录中。如上述示例所示的 m2.c
文件就在目录 mub1
和 liu
中都建立了目录项。
创建硬链接后,己经存在的文件的 I 节点号(Inode)会被多个目录文件项使用。一个文件的硬链接数可以在目录的长列表格式的第二列中看到,无额外链接的文件的链接数为 l
。
在默认情况下,ln
命令创建硬链接。ln
命令会增加链接数,rm
命令会减少链接数。一个文件除非链接数为 0
,否则不会从文件系统中被物理地删除。
对硬链接有如下限制:
符号链接
符号链接也称为软链接,是将一个路径名链接到一个文件。这些文件是一种特别类型的文件。事实上,它只是一个文本文件,其中包含它提供链接的另一个文件的路径名,如图中虚线箭头所示。另一个文件是实际包含所有数据的文件。所有读、写文件内容的命令被用于符号链接时,将沿着链接方向前进来访问实际的文件。
cat
命令用于将文本内容显示到终端。
最常用,注意,如果文件很大的话,cat
命令的输出结果会疯狂在终端上输出,可以多按几次 ctrl + c
终止
# 查看文件大小du -h file# 查看文件内容cat file
diff 命令用来比较两个文件是否的差异。当然,在 ide 中都提供了这个功能,diff 只是命令行下的原始折衷。对了,diff 和 patch 还是一些平台源码的打补丁方式,你要是不用,就 pass 吧。
which 寻找可执行文件
which ifconfig
find
命令用于在指定目录下查找文件。任何位于参数之前的字符串都将被视为欲查找的目录名。如果使用该命令时,不设置任何参数,则 find
命令将在当前目录下查找子目录与文件。并且将查找到的子目录和文件全部进行显示。
# 列出当前目录及子目录下所有文件和文件夹find .# 在 /home 目录下查找以 .txt 结尾的文件名find /home -name "*.txt"# 查找用户遗留的文件和目录find / -name ftpusername# 任意字符以 wd 结尾find /etc -regex .*wd# 找到某个文件多久以前创建的(8 小时前更新)find /etc/ -atime 8
根据文件类型进行搜索
find . type <类型参数>
类型参数列表:
f
:普通文件l
:符号连接d
:目录c
:字符设备b
:块设备s
:套接字p
:Fifo基于目录深度搜索:
# 向下最大深度限制为 3find . -maxdepth 3 -type f# 搜索出深度距离当前目录至少 2 个子目录的所有文件find . mindepth 2 -type f
tail
命令用于查看文件结尾
# 查看文件 demo 的结尾tail demo# 查看文件 demo 最后三行tail -3 demo
大多数做服务端开发的同学,都了解这么命令。比如,查看 Nginx 的滚动日志。
# 跟踪文件变化# 常用参数 -f 文件内容更新后,显示信息同步更新tail -f access.log
用 ctrl + c
退出跟踪文件变化。
tail
命令可以静态的查看某个文件的最后 n 行,与之对应的,head
命令查看文件头 n 行。但 head 没有滚动功能,就像尾巴是往外长的,不会反着往里长。
tail -n100 access.loghead -n100 access.log
head
命令用于查看文件开头。
# 输出前 100 行,再通过 pipe,输出最后一行head -100 README.md | tail -1
既然 cat 有这个问题,针对比较大的文件,我们就可以使用 less 命令打开某个文件。 类似 vim,less 可以在输入/后进入查找模式,然后按 n(N)向下(上)查找。 有许多操作,都和 vim 类似,你可以类比看下。
# 查看 /etc/passwd 文件中使用最多的 Shell 脚本cut -d ":" -f7 /etc/passwd | sort | uniq -c | sort -r
wc
命令用于统计文件内容信息。
# 查看文件 demo 行数wc -l demo
可以先用 wc
命令查看文件行数,再决定用 head
或 tail
查看文件内容。
$ cksum test.txt4038471504 75 test.txt
多模式文本编辑器
四种模式:
# 进入编辑器vi# 退出编辑器,<Enter> 为回车键:q <Enter>
插入模式
# 进入插入模式i# 进入插入模式,并且光标跳转至当前光标的下一行# 并且将原有下一行向下移动o# 与上个命令类似,只是该命令跳转为上一行<Shift> 0
光标操作
# 向左h# 向下j# 向上k# 向右l
复制粘贴
# 复制行(按下后界面没有任何提示)yy# 复制光标位置到结尾y$# 粘贴行p# 复制多行(有提示)# 示例:复制连续三行3yy# 复制局部字符# 光标移到复制字符开头# <Shift> 4# 剪切dd# 剪切光标位置到结尾d$# 撤销u# 撤销重做(返回上一次撤销)u <Ctrl> + r# 删除单个字符x# 显示行:set nu# 光标移动到指定行# 移动到第 10 行10G# 移动到当前行开头(Shift + 6)^# 移动到当前行结尾(Shift + 4)$
可视模式
三种进入可视模式的方式:
v
:字符可视模式V
:行可视模式ctrl + v
:块可视模式# 进入可视模式v
通常使用 sed
命令打印特定行
# -n:按特定格式打印# 100p:指打印第一百行sed -n 100p README.md
也可以打印一段范围的行
# 打印文件中第 100~200 行sed -n 100,200p README.md
这两个命令,都和 Linux 的文件权限 777 有关。
u
:针对属主操作g
:针对属组操作o
:针对其他用户操作a
全部操作+
:增加权限-
:减少权限=
:权限赋值r
:读w
:写x
:执行例如:
u+r
:针对属主增加读取权限g-w
:针对属组减少写进权限o=x
:针对其他用户赋予执行权限# 对 test 文件夹,属主增加「可执行」权限chmod u+x /test# 对 test 文件夹,属组增加「可执行」权限chmod g+x /test# 对 test 文件夹,属主减少「读取」权限chmod u-r /test# 数字表达(最大权限)chmod 777 /test# 毁灭性命令chmod 000 -R /# 修改 a 目录的用户和组为 benchown -R ben:ben a# 给 a.bash 文件增加执行权限(常用)chmod a+x a.bash
chown
用于更改属主、属组
# 修改 test 文件夹所属用户组为 group1chown :group1 /test
chgrp
命令可以单独更改属组,不常用。
# 修改 test 文件夹所属用户组为 group1chgrp /test group1
grep 用来对内容进行过滤,带上 --color
参数,可以在支持的终端打印彩色,参数 n 则输出具体的行数,用来快速定位。
比如:查看 nginx 日志中的 POST 请求。
grep -rn --color POST access.log
推荐每次都是用这样的参数。
如果我想要看某个异常前后相关的内容,就可以使用 ABC 参数。它们是几个单词的缩写,经常被使用。 A after 内容后 n 行 B before 内容前 n 行 C count? 内容前后 n 行
grep -rn --color Exception -A10 -B2 error.log
sort 和 uniq 经常配对使用 sort 可以是哟功能 -t
指定分隔符,使用 -k
指定要排序的列。
下面这个命令输出 nginx 日志的 ip 和每个 ip 的 pv,pv 最高的前 10。
#2019-06-26T10:01:57+08:00|nginx001.server.ops.pro.dc|100.116.222.80|10.31.150.232:41021|0.014|0.011|0.000|200|200|273|-|/visit|sign=91CD1988CE8B313B8A0454A4BBE930DF|-|-|http|POST|112.4.238.213awk -F"|" '{print $3}' access.log | sort | uniq -c | sort -nk1 -r | head -n10
为了减小传输文件的大小,一般都开启压缩。Linux 下常见的压缩文件有 tar、bzip2、zip、rar 等,7z 这种用的相对较少。
.tar
使用 tar 命令压缩或解压.bz2
使用 bzip2 命令操作.gz
使用 gzip 命令操作.zip
使用 unzip 命令解压.rar
使用 unrar 命令解压压缩率:
tar.bz2 > tar.gz > zip > tar
压缩率越高,压缩以及解压的时间也就越长
tar
gzip
和 bzip2
.tar.gz
、.tar.bz2
、.tgz
可为 Linux 的文件和目录创建档案。利用 tar
,可以为某一特定文件创建档案(备份文件),也可以在档案中改变文件,或者向档案中加入新的文件。
参数:
-c
:打包-v
:显示过程-f
:指定操作类型为文件-t
:列出备份文件的内容-x
:解包,从备份文件中还原文件-z
:通过 gzip 指令处理文件⚠️ 注意:tar
命令参数没有 -
引导符
# 打包(将 /etc 目录打包到 /tmp/etc-backup.tar)tar cf /tmp/etc-backup.tar /etctar czvf taget.tar destination# 查阅包内文件tar ztvf filename.tar.gz# 解包(将 /tmp/etc-backup.tar 解压到 /root)tar xf /tmp/etc-backup.tar -C /roottar zxvf /opt/soft/test/filename.tar.gz
可以使用 ls -l filename
查看打包后文件的权限、创建事件、包大小等。
tar
集成了 gzip
命令和 bzip2
命令。
# gziptar czf /tmp/etc-backup.tar.gz /etc# bzip2tar cjf /tmp/etc-backup.tar.bz2 /etc
压缩
# 压缩为 .gz 格式的压缩文件,源文件会消失gzip filename.txt# 压缩为 .gz 格式的压缩文件,源文件不会消失gzip -c filename.txt > filename.txt.gz# 压缩目录下的所有子文件,但是不压缩目录gzip -r /directory/
解压
# 解压缩文件,不保留压缩包gzip -d filename.txt.gz# 解压缩文件gunzip filename.gz
用来解压缩文件,或者对文件进行打包操作。
-k
保留源文件-d
解开压缩文件-r
表示递归处理,将指定目录下的所有文件及子目录一并处理-q
不显示指令执行过程-v
显示指令执行过程<压缩效率>
压缩效率是一个介于 1-9 的数值。压缩
# 将 /usr/html 目录下所有文件和文件夹打包为当前目录下的 html.zipzip -q -r filename.zip /usr/filename# 指定压缩率打包文件zip -r8 filename.zip test/*# 向压缩包增加文件(test.txt)zip -u filename.zip test.txt# 压缩时加密(密码为666666)zip -r filename.zip test1 test -P 666666# 删除压缩包的特定文件(删除 test 文件)zip -d filename.zip test
解压
# 查看压缩包文件信息unzip -l filename.zip# 解压压缩包unzip filename.zip# 解压压缩包中指定文件unzip -o filename.zip "test.txt"# 解压压缩包至指定文件夹unzip filename.zip -d dir/
例如:用空字节覆盖文件的前 512 字节。
dd if=/dev/zero of=path/to/file bs=512 count=1 conv=notrunc
转换选项 notrunc
意味着不缩减输出文件,也就是说,如果输出文件已存在,只改变指定的字节,然后退出,并保留输出文件的剩余部分。没有这个选项,dd
将创建一个 512 字节长的文件。
使用内核随机数驱动,用 100 个随机字节生成文件:
dd if=/dev/urandom of=myrandom bs=100 count=1