文章目录
- 基础知识与常用命令
-
- Linux的文件与目录结构
- help,man(帮助)
- ls (查看文件清单命令)
- cat、more、less、head、tail(浏览文件命令)
- wc(文件统计命令)
- cd(改变当前工作目录命令)
- mkdir(创建目录命令)
- cp(复制命令 )
- mv(重命名或移动命令)
- ln(创建符号链接和硬链接命令)
- pwd (显示当前目录命令)
- touch (产生空文件或者改变文件时间戳命令)
- whoami、id 和 groups(查看账户名及其所属组的命令)
- 文件与目录的权限
- chmod (改变权限命令)
- chown (设置文件所有者和文件关联组)
- chgrp (变更文件或目录的所属群组)
- stat(查看文件的三种时间)
- rm 与 rmdir(删除命令)
- vim,vi(文本编辑器)
- echo (用于显示的命令)
- file(查看文件类型命令)
- find(查找命令)
- ps (显示当前进程的状态)
- grep(查找文件里符合条件的字符串)
- systemctl(Systemd 的主命令,用于管理系统)
- rpm(管理套件)
- date(时间查看)
- scp(传输文件)
- df,du(查看磁盘空间)
- free(查看内存)
- wc(统计行数、单词数、字符个数,文件个数)
- sudo, su(权限提升)
- tar 压缩解压缩文件
- cronb定时任务
基础知识与常用命令
Linux的文件与目录结构
linux包括普通文件、目录和特殊文件(如符号链接文件、设备文件)。linux不根据文件扩展名表示其类型,而是根据文件头的内容来识别其类型。为了增加可读性可以使用扩展名,但是没有实际用途。Linux系统只有一个根目录,用斜杠“/”表示。
目录 | 描述 |
---|---|
/bin | 最主要的可执行文件存放的地方,这些可执行文件大多是Linux系统里最常用的命令 |
/boot | 包括内核和其他系统启动时使用的文件 |
/dev | 存放设备文件。Linux系统把所有的外设都看成是一个文件,对代表某设备的文件的操作就表示对该设备的操作 |
/etc | 存放系统的配置文件。在该目录及子目录下有很多关于配置的文本文件,如后缀为conf的文件 |
/home | 系统默认的普通用户的主目录为/home/<account_name>,保存用户文件,包括用户自己的配置文件、文档、数据等 |
/lib | 包含许多由/bin和/sbin中的程序使用的共享库文件。/usr/lib中包含更多用于用户程序的库文件 |
/lost+found | 在系统修复过程中恢复的文件 |
/mnt | 文件系统挂载点。一般用于安装移动介质,其他文件系统的分区、网络共享文件系统或者任何可安装的文件系统 |
/opt | 存放可选择安装的文件和程序。主要由第三方开发者用于安装和卸载他们的软件包 |
/proc | 这个目录中的文件其实不是存放在磁盘上的,该目录的文件系统叫做内存映像文件系统,是系统内核的映像。该目录里面的文件是存放在系统内存里面,可以通过察看这些文件来了解系统的运行情况/sbin |
/root | 系统管理员、超级用户root的默认主目录 |
/sbin | 存放可执行文件,这里的可执行文件主要供超级用户管理系统时使用,普通用户几乎没有权限执行其中的程序。/usr/sbin中也包括许多系统命令 |
/tmp | 临时目录,当系统重启时,该目录中的文件会被自动清空 |
/usr | 包括与系统用户直接相关的文件和目录,一些主要的应用程序也保存在该目录下 |
/var | 包含经常改变的文件,如假脱机(spool)目录、日志目录、锁文件、临时文件等 |
help,man(帮助)
-
命令 --help
,例如date --help
,获取date命令的详细选项和参数,在命令的语法当中,中括号内的选项或者参数为可选的(不是必选的),竖线表示或的意思。 -
man 命令
,man命令提供的帮助信息是分页显示的,按回车键显示下一行,按空格键显示下一页, 按键返回到(backwards)上一页,按键退出(quit)
ls (查看文件清单命令)
-
ls
令用来列出(list)当前目录下包含的文件和子目录,它相当于DOS的dir命令。ls命令的选项-l最常用,-l是long的意思,用于列出详细信息。 -
ls -l
列出的信息有七个部分。- 第一部分有10个字符,首字符表示类型,“d"表示目录,”-"表示普通文件;
- 第二部分,对于文件,表示硬链接数(参见ln命令),对于目录,则表示其所含的子目录数,包括隐藏目录;
- 第三部分表示文件的所有者;
- 第四部分表示其所属的组;
- 第五部分表示大小,即字节数;
- 第六部分为文件的修改时间(用
ls -lu
看到的是访问时间,ls -lc
看到的是状态改变时间); - 第七部分为文件名本身。
-
ls 命令的选项-i 或者–inode 用来显示文件的 inode 号,它像是一个不能重复的标号一样,每个文件或目录对应一个 inode 号。
-
ls -a
或者--all
用来查看目录下所有的文件和目录,会看到隐藏文件,隐藏文件中还有两个特殊的东西,一个是“.”,另一个是“…”。“.”表示当前目录,“…”表示当前目录的父目录,即上一级目录。Linux下的任何一个目录,一定包含这两个特殊的隐藏目录。这些选项可以混合使用,ls的选项-t表示按照修改时间由新到旧列出文件,则ls -lat
的作用就是,按照修改时间由新到旧、列出包括隐藏文件和隐藏目录在内的所有文件和目录的详细信息。
Linux命令的选项并非都可以随意组合,有些选项不能一起使用,有的选项依赖于其他选项。
扫描二维码关注公众号,回复: 15386279 查看本文章
cat、more、less、head、tail(浏览文件命令)
-
cat /etc/passwd
, cat命令是一股脑地显示文件的全部内容,文件较长时,用cat命令查看长文件文件有些不方便。最好使用more命令。 -
more命令它将长文件分页显示,每显示一页,more命令就会等待用户的进一步指令。在用more分页显示文件时,用户常用的指令有:按回车键,显示下一行;按空格键,显示下一页;按B键,返回到上一页;按Q键,退出,不再查看余下的内容。
-
less命令,less命令的使用与more命令比较相似,可分页显示长文件。
-
head命令用来查看文件开头的部分,默认显示文件的前10行,可以用选项-n加参数K来显示文件的前K行,-n K可以缩写为-K。例如,
head -n 5 /etc/passwd
等效于head -5 /etc/passwd
。 -
tail命令与head命令呼应,它默认显示文件的最后10行,用-n K或者-K来显示文件的最后K行。tail命令有一个比较常用的选项-f,使用它,可以看见文件尾部内容的增长或变化。当一个文件的内容在不断地变化时(如日志文件,调试脚本时,脚本打印的调试信息等),可以运行
tail -f filename
,它会把filename里最尾部的内容显示在屏幕上,并且不断刷新,从而显示最新的文件内容
wc(文件统计命令)
wc 命令用来统计出文件的行数、单词数(word counts)和字节数。连续的非空白字符为一个单词(空白字符包括空格、键、换行符等),每个字母、空格,换行符(\n)和标点符号各占一个字节。
wc /etc/passwd
,依次展示行,单词书,字节数,文件名称,例如: 28 50 1306 /etc/passwd,表示28行,50个单词,1306个字节。wc -l /etc/passwd
,显示文件的行数,例如:28 /etc/passwd,表示28行。wc -w /etc/passwd
,显示文件单词数,例如:50 /etc/passwd,表示50个单词。wc -c /etc/passwd
,显示文件字节数,例如:1306/etc/passwd,表示1306个字符。wc -m /etc/passwd
,显示文件字符数,字符数与字节数是一致的。如果一个文件包含全角标点或者汉字,那么它的字符数与字节数将不一致。
cd(改变当前工作目录命令)
cd 命令用于改变当前的工作路径(change working directory),或者说 cd 命令用于进入某目录。
- 假设当前目录为**/home/kiramario**,运行
cd shell
(前提是当前目录下有shell这个目录),则会进入**/home/kiramario/shell**。 - “…”表示父目录,
cd ..
就表示进入父目录,例如当前目录为**/home/kiramario/shell**,运行命令后,当前目录为**/home/kiramario**,…/…表示父目录的父目录,可以一直推导下去。 - cd 的参数都是相对路径,也可以使用绝对路径(从根目录开始的全路径),例如
cd /usr/bin/
,直接从当前目录**/home/kiramario进入到/usr/bin**。 - 使用参数“-”可以回到刚才的路径。在前面的例子中,在进入**/usr/bin** 之前,路径为**/home/kiramario**,所以运行
cd -
就回到了**/home/kiramario** 目录。 - 不带任何选项和参数的 cd 命令,表示进入当前账户的主目录。假设当前账户名为user,主目录就是**/home/user**。例如我的用户名为kiramario,主目录为**/home/kiramario**。
- ~<account_name>表示账户 account_name 的主目录,例如
cd ~kiramario
,表示进入该账户的主目录。cd ~
和cd
的效果一致,但在一个脚本里,cd ~的意义明显,可读性更好。
cd命令可以使用相对路径和绝对路径,具体视情况而定,相对路径和绝对路径的概念比较简单,稍加搜索和思考便可掌握。
mkdir(创建目录命令)
-
mkdir 命令用来创建目录(make directories)。例如,在当前目录下创建一个名字为dir1的目录
mkdir dir1
。 -
mkdir 命令可以同时创建两个或者多个目录,例如在当前目录下创建目录dir1,dir2,dir3,
mkdir dir1 dir2 dir3
。 -
mkdir命令在创建深层次的目录的时候,需要一层一层的创建,步骤比较繁琐,这时候可以加速选项-p 或 者–parents 可以快速创建,例如:
mkdir -p /home/kiramario/test1/test2/test3
,会依次产生**/home/kiramario/test1**,/home/kiramario/test1/test2,/home/kiramario/test1/test2/test3目录,mkdir -p 命令中的各级目录,可能都不存在,可能某一级或者某几级已经存在,也可能都已经存在,这几种情况,mkdir -p 命令都不会出错。从上层目录到最后一级目录,哪一级目录不存在就创建哪一级,如果都已经存在,相当于 mkdir -p 做了一个空操作。
mkdir的参数可是相对路径,也可以是觉得路径。
cp(复制命令 )
cp 命令用于文件和目录的复制,也叫“拷贝”(copy),它的最基本的命令格式有两个参数,分别是“源”和“目的”。用选项**-f** 或**–force** 就可以强行覆盖,且不会遇到权限不足的提示,用选项-i 或–interactive,在某文件被覆盖之前会得到提示。这时,输入 y 或者 Y,按回车键,复制动作将继续;直接回车或者按<Ctrl+C>键,则取消该复制动作。
-
将 a.txt 复制(另存)为同一个目录下的 b.txt:
cp a.txt b.txt
。 -
将 a.txt 复制到/tmp 目录下:
cp a.txt /tmp
。需要注意的是当将 a.txt 复制到/tmp/dir1目录下,运行cp a.txt /tmp/dir1
。当目录/tmp/doc 存在时,复制没问题,当目录/tmp/dir1不存在(而/tmp 肯定存在)时,a.txt 被复制为/tmp 目录下的名字为dir1的文件。 -
将 a.txt 复制到/tmp 目录下,同时名字改为 e.txt:
cp a.txt /tmp/e.txt
。 -
将其他目录下的的文件复制到当前目录:
cp /tmp/a.txt .
或者cp /tmp/a.txt ./
。 -
将分布在不同的目录下的多个文件复制到某个目录下,例如:
cp ../mike/a.txt ../jack/b.txt /tmp/c.txt /home/kiramario/shell
。 -
命令
cp -r dir1 dir2
用来复制目录,将目录 dir1 里面的东西复制到目录 dir2。-r 代表recursively,就是递归复制,cp 命令的选项-r 还可以换为-R 或者–recursive,这三种选项作用是相同的。dir1 里面可能不仅有文件,还有子目录,甚至有多层子目录,都会原封不动地复制到 dir2 之中。如果 dir2 不存在,则它会先被创建。 -
cp 命令的选项-b 有备份作用(backup),已经存在的目标文件的名字后会自动加波浪号~并得到备份。考虑这种场景,文件 b.txt 存在,执行 cp a.txt b.txt 之后,原来的 b.txt 的内容消失了,被替换为 a.txt 的内容。执行
cp -b a.txt b.txt
之后,b.txt 被备份为 b.txt~,a.txt 的内容覆盖 b.txt。
mv(重命名或移动命令)
mv 命令的基本格式为mv file1 file2
,mv 是 move 的意思,file1 和 file2 分别是“源”和“目的”。源和目的,可以是文件与文件,可以是文件与目录,也可以是目录与目录,但不能是目录与文件。
执行命令 mv file1 file2 时,也可能会因为权限不足而遇到与 cp 命令相同的情况,处理方法及选项**-i** 与**-f** 的使用方法与 cp 的完全相同。例如,将文件 a.c 移入目录 sourcecode 时,如果目录 sourcecode 中已经有同名文件,使用选项**-i**,会得到提示。
mv a.txt b.txt
:将文件 a.txt 重命名为 b.txt。$ mv a.c sourcecode
:将文件 a.c 移入 sourcecode 目录,要先确保目录 sourcecode 存在,否则,a.c 将被重命名为文件 sourcecode。mv a.txt b.txt c.txt /tmp
:将三个文件移入到某个目录下。mv ../mike/a.txt ../jack/b.txt /tmp/c.txt /home/maggie/document
:将三个分布在不同的目录下的文件移入到某个目录下。mv test1 test2
这条命令可能会有两种结果:如果目录 test2 不存在,目录 test1 被重命名为test2;如果目录 test2 存在,目录 test1 被移入 test2,test1 变为 test2 的子目录。
ln(创建符号链接和硬链接命令)
-
ln -s a.txt sym_a.txt
:ln -s 目标文件(源文件) 链接文件,建立符号链接时,选项-s 或者–symbolic 是必须的。建立一个名字为 sym_a.txt、目标为文件 a.txt 的符号链接。用 ls 命令查看sym_a.txt 所在的那一行的第一个字符为小写字母 l,l 表示文件类型是符号链接。源文件 a.txt 如果不存在(这种情况叫做断链),命令也可以成功执行。 -
ln -s /home/kiramario/shell sys_shell
:针对目录建立符号链接
ln a.txt a_hard.txt
:表示创建一个a.txt的硬链接,修改 a.txt(或者 a_hard.txt)的内容,那么 a_hard.txt(或者a.txt)也随之变化,它们的内容和修改时间总是保持一致的,实际上,它们互为硬链接。用ls -l
查看的话发现信息的第二部分的数值为2,表示硬链接数量,a_hard.txt的信息的首字符为“-”而不是小写字母 l,表明它是普通文件。再创建一个a.txt 的硬链接的话,这个数字将变为 3。需要注意的是建立硬链接之前,“源”文件必须存在,否则会出错。
如果某文件不小心被删除了,而它的硬链接文件仍然存在的话,那么“源”的内容可以很容易地找回来。而符号链接,如果“源”不小心被彻底删除了,那么其内容几乎无法找回。如果希望两个或多个不一定在同一目录下的文件的内容总保持一致,并且希望相互备份,就可以使用硬链接。硬链接就是:一个文件,多个文件名,每删除一个链接文件则减少一个名字(链接数减少 1),当最后一个链接被删除后,文件才被删除。
硬链接有一个限制,链接在一起的文件必须处在同一个文件系统*(用df查看)*,否则,当链接它们时,ln 命令会出错,而符号链接没有这个限制,有的 Linux 不允许建立目录的硬链接,有的 Linux 只允许超级账户(如 root)建立目录的硬链接。
pwd (显示当前目录命令)
pwd 命令有用的选项,-P和-L。pwd -P 显示的是实际路径,即物理路径;pwd -L 显示的是“表面上”的路径,即逻辑路径。如果当前目录及其各级父目录都不是符号链接,那么当前的物理路径和逻辑路径是相同的,否则不同。
如果是目录的符号链接,进入此目录,运行pwd -L
显示的是在此符号链接的目录,而pwd -P
显示真实路径。例如上面图片所示sys_shell是/home/kiramario/shell的符号链接。
touch (产生空文件或者改变文件时间戳命令)
-
touch z.txt
:运行 touch file 命令,如果 file 不存在,会产生一个空文件 file。例如,先确定 z.txt 不存在,再运行 touch z.txt,则会创建一个字节数为 0 的文件 z.txt。无论 file 是否事先存在,运行 touch file 命令后,file 的修改时间均被设定为当前时间。不带选项的 touch 命令将文件的访问时间、修改时间和状态改动时间都设定为了当前时间,用选项**-a** 设定访问(access)时间;用选项**-m**设定修改(modification)时间。touch 命令可以带上时间参数,将文件的修改时间设为特定时间。
whoami、id 和 groups(查看账户名及其所属组的命令)
whoami
:查看当前的账户名。id -un
:查看当前的账户名。groups
:groups 命令输出中的第一个组叫做首要组,其他叫次要组。id -a
:查询当前账户属于那些组,同时可查看账户号 uid 和各个组的组号 gid。
要查询其他账户属于哪些组,带上账户名参数即可。例如,查询账户 kiramario属于哪些组,可运行 groups kiramario
或者 id kiramario
。
文件与目录的权限
执行命令 ls -l 查看文件第一部分后面的 9 个字符表示文件权限。r、w 和 x 分别表示读、写和执行权限,**“-”**表示无相应权限。第 2 个到第 4 个字符表示文件所有者的权限;第 5 个到第 7 个字符表示文件所属组的权限;第 8 个到第 10 个字符表示所有其他账户的权限。
例如,rw-r–r–,表示所有者对文件有读写权限,其他账户有读权限;rwxr-x—,表示所有者对文件有读写和执行权限,所属组的成员有读和执行权限,其他账户则没有任何权限。
chmod (改变权限命令)
chmod 命令用来改变文件和目录的权限,选项为:”[ ugoa ] [ ±= ] [ rwx- ]”,其中 u 表示文件的所有者(user),g 表示文件的所属组(group),o 表示除所有者和所属组组员以外的其他账户(other),a 表示所有账户(all),+、-、=分别表示对权限的增加、减少、定义。
chmod u+rw a.txt
:给文件的所有者增加读写权限。chmod o+rwx a.txt
:给其他账户增加读写和执行权限。chmod o-rwx a.txt
:去掉其他账户的读写和执行权限。chmod g=r a.txt
:将读权限赋给文件的所属组。chmod a=rwx a.txt
:赋给所有账户读写和执行权限。chmod g=rx a.txt
:将读和执行权限赋给文件的所属组。chmod go=- a.txt
:去掉所属组的所有权限,并去掉其他账户的所有权限。chmod a=- a.txt
:去掉所有账户的所有权限。
改变文件的权限,还有一种“数值”的方法。r、w、x、-可以分别用 4、2、1、0 表示,它们可以组成 0~7 这 8 种数值,分别表示不同的权限控制。例如,3=2+1 表示且仅表示-wx,7=4+2+1 表示且仅表示rwx 等,见表 2-2。用 chmod ugo file
命令来控制 file 的权限,这里的 ugo 与前面的用法不同,u、g、o 可以取 0~7 的任一数值,分别表示 file 的所有者、所属组、其他账户的权限。
-
chmod 444 a.txt
:4 表示 r–,那么 444 表示 r–r–r–,将文件的读权限赋给所有账户。 -
chmod 012 a.txt
:取消当前用户u的所有权限,设置所属组g执行权限,设置其他账户o写权限。数值 相应权限 0 — 1 –x 2 -w- 3 -wx 4 r– 5 r-x 6 rw- 7 rwx
如果我们仅仅想改变目录的权限,使用chmod不用加任何参数。如果想把目录下的文件和子目录也同时改变,需要使用**-R**参数。
SUID(其他账户在执行时具有文件所有者的权限)
SUID权限,其表现形式为在文件所有者的执行权限的地方可以看见 s,而不是 x,它就是 SUID,SUID 是 set uid 的缩写,SUID 仅对可执行的二进制文件起作用。
SUID 仅对可执行的二进制文件起作用。其作用是:其他账户在执行时具有文件所有者的权限。我们以命令 passwd 为例来理解 SUID 的作用。执行命令 passwd 就是执行/usr/bin/passwd,修改密码之后,文件**/etc/shadow**会被更新,因为加密之后的密码在/etc/shadow 中。查看一下它的权限后发现只有root有读写权限。
-rw-r----- 1 root shadow 991 Feb 5 2021 /etc/shadow
然而任何账户都可以使得/etc/shadow 的内容更新(因为任何账户都可以运行 passwd 来修改自己的密码),这是因为passwd的执行权限被设置为s。
-rwsr-xr-x. 1 root root 27832 Jun 10 2014 /usr/bin/passwd
因此其他账户在执行passwd命令的时候,就获取root权限,对/etc/shadow有写操作。
chmod u+s a.sh
:对文件所有者(u)增加 SUID 属性(+s)。chmod 4755 a.sh
:其实 chmod 后面可以跟四位八进制数,最前面一位为 4 时,表示设置 SUID 属性。这里表示的是-rwsr-xr-x
。
设置 SUID 要同时保证文件对于所有者有执行权限。
SGID(其他账户在执行时具有文件所属组的权限)
它是 set gid 的缩写。可以对一个可执行二进制文件设置 SGID。SGID 的作用是:其他账户在执行时具有文件所属组的权限。具体理解可以参照SUID。首先查找具有SGID属性的可执行文件ls -l /usr/bin | grep '^......s'
。
---x--s--x 1 root nobody 382216 Aug 9 2019 ssh-agent
-r-xr-sr-x. 1 root tty 15344 Jun 10 2014 wall
-rwxr-sr-x 1 root tty 19536 Apr 13 2017 write
任何账户都可以运行 write命令,/usr/bin/write所属组为 tty,任何账户在执行 write命令时,都临时具有了属于 tty组时所具有的权限。
SGID可以作用在一个目录,这时SGID 的作用是:任何账户如果可以在该目录内建立新文件或者新的子目录,那么新建的文件或子目录的所属组与该目录的所属组保持一致。
# 将/home/kiramario/shell加上为SGID。
drwxrwsr-x 2 kiramario kiramario 4096 Oct 23 13:02 shell
此时用root在shell中创建文件时,其所属组和父目录保持一致。
-rw-r--r-- 1 root kiramario 0 Oct 23 13:05 root_a1.txt # shell目录设置SGID后创建的文件
-rw-r--r-- 1 root root 0 Oct 23 13:02 root_a.txt # shell目录未设置SGID之前创建的文件
chmod g+s shell
:为shell设置SGID。chmod 2777 shell
,chmod 后面跟四位八进制数,最前面一位为 2 时,表示设置 SGID 属性。
与 SUID 同样道理,设置 SGID 属性要同时确保目录或者文件对于所属组有执行权限。
SBIT(粘滞位,防删除位)
SBIT 的属性只有目录可以设置,在一个大家都有权限的目录下,某个账户不再可以随便删除别人的文件或目录了。
比如目录/tmp/picture的权限为777,所有用户都可以进行操作,user1进入创建的文件所属user1,user2进入对其进行删除,当设置了SBIT后,user2便无法对属于user1的文件进行删除。
chmod o+t picture
:为picture设置SBIT。chmod 1777 picture
:chmod 后面跟四位八进制数,最前面一位为 1时,表示设置 SBIT 属性。
与 SUID 和 SGID 同样道理,设置 SBIT 属性要先确保目录对于其他账户有执行权限。
SUID、SGID 和 SBIT 可以同时设置。4、2、1 分别表示设置 SUID、SGID、SBIT,而4、2 和 1 可以组成 1~7 之间的数值,例如,3=2+1,3 表示同时设置 SGID 和 SBIT;6=4+2,6 表示同时设置 SUID 和 SGID。例如:chmod 3777 picture
chown (设置文件所有者和文件关联组)
chown kirammario a.txt
:把a.txt的所有者设置 kiramario。chown kiramario:kiramarioGroup a.txt
:将文件 a.txt 的拥有者设为 kiramario,群体的使用者 kiramarioGroup。chown -R kiramario:kiramarioGroup*
:将当前前目录下的所有文件与子目录的拥有者皆设为 kiramario,群体的使用者 kiramarioGroup。chown :1001 a.txt
:把a.txt 的关联组设置为 1001(关联组ID),不改变所有者。
chgrp (变更文件或目录的所属群组)
chgrp kiramario a.txt
:改变文件a.txt的群组属性为kiramario,如果文件是硬链接,则对应得硬链接文件属性也改变。chgrp --reference=a.txt b.txt
:改变b.txt的群组属性为和a.txt一致。**–reference=<参考文件或目录>**选项的意思就是把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同。
stat(查看文件的三种时间)
Access、Modify 和 Change 分别表示访问时间、修改时间和状态改动时间。也可以用 ls -lu、ls -l、ls -lc 命令分别查看文件的访问时间、修改时间和状态改动时间,只是时间不如 stat 的精确。
当文件的权限、所有者、所属组或硬链接数发生改变时,即运行 chmod、chown、chgrp或 ln 命令时,文件的状态改动时间将改变。当文件内容改变时,即修改时间变化时,状态改动时间也随之变化。
-
stat b.txt
:File: ‘b.txt’ Size: 0 Blocks: 0 IO Block: 4096 regular empty file Device: fd01h/64769d Inode: 918256 Links: 1 Access: (0644/-rw-r--r--) Uid: ( 1000/kiramario) Gid: ( 1001/kiramario) Access: 2021-10-23 11:35:52.422466385 +0800 Modify: 2021-10-23 11:35:52.422466385 +0800 Change: 2021-10-23 11:36:11.367606848 +0800
-
stat --printf="%x\n%y\n%z\n" b.txt
,用来显示文件的三种时间。其中,%x、%y和%z 分别对应访问时间、修改时间和状态改动时间。2021-10-23 11:35:52.422466385 +0800 2021-10-23 11:35:52.422466385 +0800 2021-10-23 11:36:11.367606848 +0800
rm 与 rmdir(删除命令)
rm a.txt b.txt c.log
:一次删除多个文件。rm -f a.txt b.txt c.log
:删除只读文件时会遇到提示,如果不希望看见“只读/写保护”的提示,也就是确定后强制删除,就用**-f或者–force**。rm -i a.txt b.txt c.log
:删除文件的时候,无论文件的权限是什么,希望总是得到提示的话,可使用选项**-i** 或 者**–interactive**。rmdir temp
:rmdir 命令用来删除目录,但它只能用来删除空目录。rm -r temp
:使用带选项-r、或者-R、或者–recursive 的 rm 命令即可将非空目录直接删除。如果不希望看见“只读/写保护”的提示,加上选项-f,两个选项合并为-rf: rm -rf temp 。
vim,vi(文本编辑器)
vim 是 vi improved 的意思,即增强版的 vi。一般地,vi 就够用,如果想使用代码加亮的话可以选择 vim。现在,有的 Linux 系统的 vi 就是 vim。
vi 有 3 个模式:命令模式(command mode)、插入模式(insert mode)和底行模式(last line mode)。
基本操作:运行 vi test.txt,进入命令模式。刚进入 vi是处在命令模式,按**键,进入插入模式,则可以输入内容。然后按键盘左上角的键,回到命令模式,再按<:>**键,进入底行模式,输入 wq,然后按回车键,即可存盘退出。
-
保存文件和退出 vi 的命令:
-
:w
:保存文件,不退出 vi 。 -
:w
:readme.txt :保存至(另存为)readme.txt 文件。 -
:q
:退出 vi 编辑器(如果文件无修改)。 -
:q
!: 退出 vi 编辑器,且放弃保存。 -
:wq
:退出 vi 编辑器,且保存文件。
-
-
命令模式移动光标:
**键向左、键向下、键向上、键向右;空格键向右、键向左、键移动到下一行首、<->**键移动到上一行首。
-
常用的删除与恢复删除操作:
-
x
:删除当前字符。 -
nx
:删除从光标开始的 n 个字符,n 为整数。 -
dd
: 删除当前行。 -
ndd
: 向下删除当前行在内的 n 行,n 为整数。 -
u
: 撤销上一步操作。 -
U
:撤销对当前行的所有操作。
-
-
插入文本或行的操作:
a
:在当前光标位置的右边添加文本。i
:在当前光标位置的左边添加文本。A
:在当前行的末尾位置添加文本。I
:在当前行的非空白字符的行首添加文本。O
:在当前行的上面新建一行。o
: 在当前行的下面新建一行。
echo (用于显示的命令)
-
echo -n morning
,有选项-n 时,它的作用是去掉行尾的换行符(no trailing newline)。用 echo 显示参数时,行尾默认都是有换行符的。[kiramario@izm115efh0abcdefg31tccccz shell]$ echo Morning Morning [kiramario@izm115efh0abcdefg31tccccz shell]$ echo -n Morning Morning[kiramario@izm115efhabcdefg31tccccz shell]$ # Monring和随后的提示符在同一行
-
echo -e "123\c456789"
:当使用选项-e 时,一些反斜杠转义字符在 echo 命令里生效。123$ # 因为没有换行符,123 和命令提示符在同一行
echo命令的转义字符:
\a
: 响铃。\b
:退格。\c
:取消该字符之后的输出。\e
:键。\f:
换页。\n
:新行。\r
:回车键。\t
:键(横向)。\v
:竖向键。\
:反斜杠本身。\0NNN ASCII
:码为一到三位八进制数对应的字符。\xHH ASCII
:码为一到两位十六进制数对应的字符。
file(查看文件类型命令)
-
file /bin/ls
:/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=3d705971a4c4544545cb78fd890d27bf792af6d4, stripped
find(查找命令)
命令 find 的常用格式为: find [起始目录] 选项及寻找条件 [操作] 。命令 find 默认为递归查找,从起始目录开始的每一层子目录都会进入查找。当没有指定起始目录时,默认从当前目录开始查找。默认的操作是-print,就是将找到的内容显示在屏幕上。
find . -name "*.txt" -print
:从当前目录下开始查找后缀名为.txt 的文件。find /tmp/code -name "test1.c" -mtime +3 -user kiramaio -perm 755 -type f
:从/tmp/code 目录里面开始,查找名字为 test1.c、最后一次修改时间在 3 天以上、所有者为账户kiramaio 、权限为 755 的普通文件(不是符号链接或其他类型)。find ! -newer a.txt
:查找比 a.txt 更老的文件或者修改时间与 a.txt 相同的文件,!表示条件取反,!的取反功能可用在其他查找条件上。find shell -name "*.txt" -exec ls -l {} \;
:查找 shell 目录里面的后缀名为.txt 的文件,并用 ls -l 命令列出。命令 find 找到文件后的操作,除了有默认的-print,常用的还有**“-exec 命令 {} \;”,{}代表找到的文件,结尾为\;,注意}**与\之间要有空格。find shell -name "*.txt" -ok rm {} \;
:将找到的文件删除,得到提示时,输入 n,不删除文件,输入 y,则文件被删除。find shell -name "*.txt" | xargs chmod 700
:将找到的文件的权限改为 700。使用管道及 xargs 命令对查找到的文件进行操作。find /export/Logs/ -type f -name "*log*" -mtime +30 -exec rm -rf {} \;
将/export/Logs/目录下所有30天前带".log"的文件删除。
find 命令常用选项:
选项及参数 | 含 义 |
---|---|
-name filename | 按照名字 filename 查找,可使用通配符(如,*代表多个字符,?代表一个字符) |
-perm mode | 按照权限 mode 查找 |
-user account_name | 查找所有者为某个账户的文件,-user 后面跟账户号 uid 也可以 |
-group group_name | 查找所属组为某个组的文件,-group 后面跟组号 gid 也可以 |
-mtime {-n|+n} | 用-n(+n)时,查找修改时间距现在 n 天之内(之前)的文件 |
-type {b|d|c|p|l|f} | 查找某一类型的文件, b、d、c、p、l 和 f 分别表示块设备、目录、字符设备、管道、符号链接、普通文件 |
-newer file | 查找修改时间比某个文件新的文件,! -newer 表示取反 |
ps (显示当前进程的状态)
命令用于显示当前进程的状态,类似于 windows 的任务管理器。
ps aux | grep kafka
ps -ef | grep kafka
ps -ef|grep php|grep -v 'grep'
grep(查找文件里符合条件的字符串)
grep 指令用于查找内容包含指定的范本样式的文件,如果发现某文件的内容符合所指定的范本样式,预设 grep 指令会把含有范本样式的那一列显示出来。若不指定任何文件名称,或是所给予的文件名为 -,则 grep 指令会从标准输入设备读取数据。
grep test a*
:查找前缀有“a”的文件包含“test”字符串的文件 。grep -r test/home/kirmario/shell
:以递归的方式查找“/home/kirmario/shell”下包含“test”的文件。grep -v test *a*
:反向查找,查找文件名中包含a的文件中不包含test 的行。
systemctl(Systemd 的主命令,用于管理系统)
systemctl reboot
:重启系统 。systemctl poweroff
:关闭系统,切断电源。systemctl halt
:CPU停止工作。systemctl suspend
:暂停系统。systemctl hibernate
:让系统进入冬眠状态。systemctl hybrid-sleep
:让系统进入交互式休眠状态。systemctl rescue
:启动进入救援状态(单用户状态)。systemctl enable crawler_test.service
:使自定义的服务crawler_test自动启动。systemctl disable crawler_test.service
:使自定义的服务crawler_test不自动启动。systemctl status crawler_test.service
:查看服务状态。systemctl start crawler_test.service
:启动服务。systemctl stop crawler_test.service
:停止服务。systemctl restart crawler_test.service
:重新启动服务。
rpm(管理套件)
对系统中已安装软件的查询:
rpm -q 软件名
:查询系统已安装的软件。rpm -qa |more
:分页查看系统中所有已经安装的包。rpm -qf 文件名
:查询一个已经安装的文件属于哪个软件包。rpm -ql lynx
或者rpmquery -ql lynx
:查询已安装软件包都安装到何处。rpm -qi 软件名
:查询一个已安装软件包的信息。rpm -qc 软件名
:查看一下已安装软件的配置文件。rpm -qd 软件名
:查看一个已经安装软件的文档安装位置。rpm -qR 软件名
:查看一下已安装软件所依赖的软件包及文件。
对于未安装的软件包的查看:
rpm -qpi file.rpm
:查看一个软件包的用途、版本等信息。rpm -qpl file.rpm
:查看一件软件包所包含的文件。rpm -qpd file.rpm
:查看软件包的文档所在的位置。rpm -qpc file.rpm
:查看一个软件包的配置文件。rpm -qpR file.rpm
:查看一个软件包的依赖关系
软件包的安装、升级、删除等:
rpm -vih file.rpm
:这个是用来安装一个新的rpm 包。rpm -Uvh file.rpm
:这是用来升级一个rpm 包。rpm -e lynx
:如果有依赖关系,您也可以用–nodeps 忽略依赖的检查来删除。
date(时间查看)
-
date
:输出Sun Oct 10 11:53:51 CST 2021
-
date +%
F:输出2021-10-10
-
date +%T
:输出11:57:08
-
cal
: 输出
scp(传输文件)
scp local_file remote_username@remote_ip:remote_folder
scp local_file remote_username@remote_ip:remote_file
df,du(查看磁盘空间)
df -h
du -ach *
:这个能看到当前目录下的所有文件占用磁盘大小和总大小。du -sh
:查看当前目录总大小。du -sh *
:查看所有子目录大小。du -sh | sort -nr
:倒序查看文件大小。du -t 100M /var
:查看var目录下大于100M的文件。du -t 100M
:查看当前目录下大于100M的文件。du -ch logs
:查看当前目录下logs文件夹大小。df -h
:查看磁盘使用状况。
free(查看内存)
free -b
:以Byte为单位显示内存使用情况。free -k
:以KB为单位显示内存使用情况。free -m
:以MB为单位显示内存使用情况free -g
:以GB为单位显示内存使用情况。free -o
:不显示缓冲区调节列。free -s <间隔秒数>
:持续观察内存使用状况。free -t
:显示内存总和列。free -V
:显示版本信息。
我们运营free的时候,发现了有buffer/cache。这里的buffer指Linux内存的:Buffer cache。这里的cache指Linux内存中的:Page cache。
磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。假设我们通过文件系统操作文件,那么文件将被缓存到Page Cache,如果需要刷新文件的时候,Page Cache将交给Buffer Cache去完成,因为Buffer Cache就是缓存磁盘块的。也就是说,直接去操作文件,那就是Page Cache区缓存,用dd等命令直接操作磁盘块,就是Buffer Cache缓存的东西。
Buffer(Buffer Cache)以块形式缓冲了块设备的操作,定时或手动的同步到硬盘,它是为了缓冲写操作然后一次性将很多改动写入硬盘,避免频繁写硬盘,提高写入效率。
Cache(Page Cache)以页面形式缓存了文件系统的文件,给需要使用的程序读取,它是为了给读操作提供缓冲,避免频繁读硬盘,提高读取效率。
Linux内核会在内存将要耗尽的时候,触发内存回收的工作,以便释放出内存给急需内存的进程使用。一般伴随系统IO飙高。内核要先对比cache中的数据和对应硬盘文件上的数据是否一致,如果不一致需要写回,之后才能回收。
wc(统计行数、单词数、字符个数,文件个数)
wc -l
:统计有多少行。wc -w
: 统计有多少个单词。wc -c
: 统计有多少个字符。ls | wc -w
: 查看目录下有多少个文件及文件夹。ls -l |wc -l
: 查看文件夹下有多少个文件。ls -l |grep ^-|wc -l
: 查看文件的个数。
sudo, su(权限提升)
sudo -i
:将普通用户提权。su - 用户名
:切换到别的用户。sudo [命令]
:用来执行需要提升权限(通常是作为 root 用户)的命令,例如sudo rm -f a.txt
一个用户要能使用 sudo ,应该在 /etc/sudoers 文件里有一条跟该用户相关的信息。
tar 压缩解压缩文件
tar -cvzf xxx.tar myDir/
: 打包压缩一个 tar。tar -xvzf xxx.tar
: 解压一个tar。tar -zxvf xxx.tar.gz -C /xxx/
: 解压一个tar到目标位置。
- z:通过gzip支持压缩或解压缩。还有其他的压缩或解压缩方式,比如j表示bzip2的方式。
- x:解压缩。c是压缩。
- v:在压缩或解压缩过程中显示正在处理的文件名。
- f:f后面必须跟上要处理的文件名。也就是说你不能写成这样tar -zxfv xxx.tar.gz。
- -C:指定目录,后续跟的也就是目标目录。
cronb定时任务
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行(一般需要root权限,systemctl restart crond.service
)。
-e
: 执行文字编辑器来设定时程表,内定的文字编辑器是 VI,在你的 .bashrc 文件中设置你常用的编辑器,比如:export EDITOR=vim
,后续编辑的时候就不会弹出其他陌生的编辑器了。-r
: 删除目前的时程表。-l
: 列出目前的时程表。
编辑格式:f1 f2 f3 f4 f5 program
。
- f1: 分钟 (0 - 59)。
- f2: 小时 (0 - 23)。
- f3:一个月中的第几天 (1 - 31)。
- f4:月份 (1 - 12)
- f5:星期中星期几 (0 - 6) (星期天 为0)
- program: 执行命令,比如一段可执行脚本
/[somepath]/canExecute.py
,date >> /tmp/test.txt
(记录当前日期到test.txt)。
或者查看线上cron表达式编辑器。