Linux入门笔记
1 Linux概述
- Linux 是一套免费使用和自由传播的类 Unix 操作系统,是一个基于 POSIX 和 UNIX 的多用户、多任务、支持多线程和多 CPU 的操作系统。Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议。它支持 32 位和 64 位硬件。Linux 继承了 Unix 以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。
- 今天各种场合都有使用各种 Linux 发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用 LAMP(Linux + Apache + MySQL + PHP)或 LNMP(Linux + Nginx+ MySQL + PHP)组合。
2 Linux系统目录结构
以下是对这些目录的解释:
-
/bin:
bin 是 Binaries (二进制文件) 的缩写, 这个目录存放着最经常使用的命令。 -
/boot:
这里存放的是启动 Linux 时使用的一些核心文件,包括一些连接文件以及镜像文件。 -
/dev :
dev 是 Device(设备) 的缩写, 该目录下存放的是 Linux 的外部设备,在 Linux 中访问设备的方式和访问文件的方式是相同的。 -
/etc:
etc 是 Etcetera(等等) 的缩写,这个目录用来存放所有的系统管理所需要的配置文件和子目录。 -
/home:
用户的主目录,在 Linux 中,每个用户都有一个自己的目录,一般该目录名是以用户的账号命名的,如上图中的 alice、bob 和 eve。 -
/lib:
lib 是 Library(库) 的缩写这个目录里存放着系统最基本的动态连接共享库,其作用类似于 Windows 里的 DLL 文件。几乎所有的应用程序都需要用到这些共享库。 -
/lost+found:
这个目录一般情况下是空的,当系统非法关机后,这里就存放了一些文件。 -
/media:
linux 系统会自动识别一些设备,例如U盘、光驱等等,当识别后,Linux 会把识别的设备挂载到这个目录下。 -
/mnt:
系统提供该目录是为了让用户临时挂载别的文件系统的,我们可以将光驱挂载在 /mnt/ 上,然后进入该目录就可以查看光驱里的内容了。 -
/opt:
opt 是 optional(可选) 的缩写,这是给主机额外安装软件所摆放的目录。比如你安装一个ORACLE数据库则就可以放到这个目录下。默认是空的。 -
/proc:
proc 是 Processes(进程) 的缩写,/proc 是一种伪文件系统(也即虚拟文件系统),存储的是当前内核运行状态的一系列特殊文件,这个目录是一个虚拟的目录,它是系统内存的映射,我们可以通过直接访问这个目录来获取系统信息。
这个目录的内容不在硬盘上而是在内存里,我们也可以直接修改里面的某些文件,比如可以通过下面的命令来屏蔽主机的ping命令,使别人无法ping你的机器:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
-
/root:
该目录为系统管理员,也称作超级权限者的用户主目录。 -
/sbin:
s 就是 Super User 的意思,是 Superuser Binaries (超级用户的二进制文件) 的缩写,这里存放的是系统管理员使用的系统管理程序。 -
/selinux:
这个目录是 Redhat/CentOS 所特有的目录,Selinux 是一个安全机制,类似于 windows 的防火墙,但是这套机制比较复杂,这个目录就是存放selinux相关的文件的。 -
/srv:
该目录存放一些服务启动之后需要提取的数据。 -
/sys:
这是 Linux2.6 内核的一个很大的变化。该目录下安装了 2.6 内核中新出现的一个文件系统 sysfs 。
sysfs 文件系统集成了下面3种文件系统的信息:针对进程信息的 proc 文件系统、针对设备的 devfs 文件系统以及针对伪终端的 devpts 文件系统。
该文件系统是内核设备树的一个直观反映。
当一个内核对象被创建的时候,对应的文件和目录也在内核对象子系统中被创建。
-
/tmp:
tmp 是 temporary(临时) 的缩写这个目录是用来存放一些临时文件的。 -
/usr:
usr 是 unix shared resources(共享资源) 的缩写,这是一个非常重要的目录,用户的很多应用程序和文件都放在这个目录下,类似于 windows 下的 program files 目录。 -
/usr/bin:
系统用户使用的应用程序。 -
/usr/sbin:
超级用户使用的比较高级的管理程序和系统守护程序。 -
/usr/src:
内核源代码默认的放置目录。 -
/var:
var 是 variable(变量) 的缩写,这个目录中存放着在不断扩充着的东西,我们习惯将那些经常被修改的目录放在这个目录下。包括各种日志文件。 -
/run:
是一个临时文件系统,存储系统启动以来的信息。当系统重启时,这个目录下的文件应该被删掉或清除。如果你的系统上有 /var/run 目录,应该让它指向 run。
3 关机
-
正确的关机流程为:sync > shutdown > reboot > halt。关机指令为:shutdown ,你可以man shutdown 来看一下帮助文档。
-
sync 将数据由内存同步到硬盘中。 shutdown 关机指令,你可以man shutdown 来看一下帮助文档。例如你可以运行如下命令关机: shutdown –h 10 ‘This server will shutdown after 10 mins’ 这个命令告诉大家,计算机将在10分钟后关机,并且会显示在登陆用户的当前屏幕中。 shutdown –h now 立马关机 shutdown –h 20:25 系统会在今天20:25关机 shutdown –h +10 十分钟后关机 shutdown –r now 系统立马重启 shutdown –r +10 系统十分钟后重启 reboot 就是重启,等同于 shutdown –r now halt 关闭系统,等同于shutdown –h now 和 poweroff
4 文件
4.1 更改文件基本属性
-
在 Linux 中我们可以使用 ll 或者 ls –l 命令来显示一个文件的属性以及文件所属的用户和组
[root@www /]# ls -l total 64 dr-xr-xr-x 2 root root 4096 Dec 14 2012 bin dr-xr-xr-x 4 root root 4096 Apr 19 2012 boot
在 Linux 中第一个字符代表这个文件是目录、文件或链接文件等等。
- 当为 d 则是目录
- 当为 - 则是文件;
- 若是 l 则表示为链接文档(link file);
- 若是 b 则表示为装置文件里面的可供储存的接口设备(可随机存取装置);
- 若是 c 则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)。
接下来的字符中,以三个为一组,且均为 rwx 的三个参数的组合。其中, r 代表可读(read)、 w 代表可写(write)、 x 代表可执行(execute)。 要注意的是,这三个权限的位置不会改变,如果没有权限,就会出现减号 - 而已。
-
对于文件来说,它都有一个特定的所有者,也就是对该文件具有所有权的用户。同时,在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。文件所有者以外的用户又可以分为文件所属组的同组用户和其他用户。因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限。在以上实例中,mysql 文件是一个目录文件,属主和属组都为 mysql,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限。对于 root 用户来说,一般情况下,文件的权限对其不起作用。
-
chgrp:更改文件属组
chgrp [-R] 属组名 文件名
参数选项
- -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改。
-
chown:更改文件属主,也可以同时更改文件属组
chown [–R] 属主名 文件名 chown [-R] 属主名:属组名 文件名
-
chmod:更改文件9个属性
Linux文件属性有两种设置方法,一种是数字,一种是符号。数字设置方法:
Linux 文件的基本权限就有九个,分别是 owner/group/others(拥有者/组/其他) 三种身份各有自己的 read/write/execute 权限。我们可以使用数字来代表各个权限,各权限的分数对照表如下:
- r:4
- w:2
- x:1
每种身份(owner/group/others)各自的三个权限(r/w/x)分数是需要累加的,例如当权限为: -rwxrwx— 分数则是:
- owner = rwx = 4+2+1 = 7
- group = rwx = 4+2+1 = 7
- others= — = 0+0+0 = 0
所以等一下我们设定权限的变更时,该文件的权限数字就是 770。变更权限的指令 chmod 的语法是这样的:
chmod [-R] xyz 文件或目录
选项与参数:
- xyz : 就是刚刚提到的数字类型的权限属性,为 rwx 属性数值的相加。
- -R : 进行递归(recursive)的持续变更,以及连同次目录下的所有文件都会变更
举例来说,如果要将 .bashrc 这个文件所有的权限都设定启用,那么命令如下:
[root@www ~]# ls -al .bashrc -rw-r--r-- 1 root root 395 Jul 4 11:45 .bashrc [root@www ~]# chmod 777 .bashrc [root@www ~]# ls -al .bashrc -rwxrwxrwx 1 root root 395 Jul 4 11:45 .bashrc
符号设置方法:
可以使用 u, g, o 来代表三种身份的权限。此外, a 则代表 all,即全部的身份。读写的权限可以写成 r, w, x,也就是可以使用下表的方式来看:
如果我们需要将文件权限设置为 -rwxr-xr– ,可以使用 chmod u=rwx,g=rx,o=r 文件名 来设定:
# touch test1 // 创建 test1 文件 # ls -al test1 // 查看 test1 默认权限 -rw-r--r-- 1 root root 0 Nov 15 10:32 test1 # chmod u=rwx,g=rx,o=r test1 // 修改 test1 权限 # ls -al test1 -rwxr-xr-- 1 root root 0 Nov 15 10:32 test1
而如果是要将权限去掉而不改变其他已存在的权限呢?例如要拿掉全部人的可执行权限,则:
# chmod a-x test1 # ls -al test1 -rw-r--r-- 1 root root 0 Nov 15 10:32 test1
4.2 文件内容查看
-
cat:由第一行开始显示文件内容
语法:
cat [-AbEnTv]
选项与参数:
- -A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已;
- -b :列出行号,仅针对非空白行做行号显示,空白行不标行号!
- -E :将结尾的断行字节 $ 显示出来;
- -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同;
- -T :将 [tab] 按键以 ^I 显示出来;
- -v :列出一些看不出来的特殊字符
检看 /etc/issue 这个文件的内容:
[root@www ~]# cat /etc/issue CentOS release 6.4 (Final) Kernel \r on an \m
-
tac:tac与cat命令刚好相反,文件内容从最后一行开始显示,可以看出 tac 是 cat 的倒着写!如:
[root@www ~]# tac /etc/issue Kernel \r on an \m CentOS release 6.4 (Final)
-
nl:显示行号
语法:
nl [-bnw] 文件
选项与参数:
- -b :指定行号指定的方式,主要有两种:
-b a :表示不论是否为空行,也同样列出行号(类似 cat -n);
-b t :如果有空行,空的那一行不要列出行号(默认值); - -n :列出行号表示的方法,主要有三种:
-n ln :行号在荧幕的最左方显示;
-n rn :行号在自己栏位的最右方显示,且不加 0 ;
-n rz :行号在自己栏位的最右方显示,且加 0 ; - -w :行号栏位的占用的位数。
实例一:用 nl 列出 /etc/issue 的内容
[root@www ~]# nl /etc/issue 1 CentOS release 6.4 (Final) 2 Kernel \r on an \m
- more:一页一页翻动
[root@www ~]# more /etc/man_db.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.6d ....(中间省略).... --More--(28%) <== 重点在这一行喔!你的光标也会在这里等待你的命令
在 more 这个程序的运行过程中,你有几个按键可以按的:
- 空白键 (space):代表向下翻一页;
- Enter :代表向下翻『一行』;
- /字串 :代表在这个显示的内容当中,向下搜寻『字串』这个关键字;
- :f :立刻显示出档名以及目前显示的行数;
- q :代表立刻离开 more ,不再显示该文件内容。
- b 或 [ctrl]-b :代表往回翻页,不过这动作只对文件有用,对管线无用。
less:一页一页翻动,以下实例输出/etc/man.config文件的内容:
[root@www ~]# less /etc/man.config # # Generated automatically from man.conf.in by the # configure script. # # man.conf from man-1.6d ....(中间省略).... : <== 这里可以等待你输入命令!
less运行时可以输入的命令有:
- 空白键 :向下翻动一页;
- [pagedown]:向下翻动一页;
- [pageup] :向上翻动一页;
- /字串 :向下搜寻『字串』的功能;
- ?字串 :向上搜寻『字串』的功能;
- n :重复前一个搜寻 (与 / 或 ? 有关!)
- N :反向的重复前一个搜寻 (与 / 或 ? 有关!)
- q :离开 less 这个程序;
- -b :指定行号指定的方式,主要有两种:
-
head:取出文件前面几行
语法:
head [-n number] 文件
选项与参数:
- -n :后面接数字,代表显示几行的意思
[root@www ~]# head /etc/man.config
默认的情况中,显示前面 10 行!若要显示前 20 行,就得要这样:
[root@www ~]# head -n 20 /etc/man.config
-
tail:取出文件后面几行
语法:
tail [-n number] 文件
选项与参数:
- -n :后面接数字,代表显示几行的意思
- -f :表示持续侦测后面所接的档名,要等到按下[ctrl]-c才会结束tail的侦测
[root@www ~]# tail /etc/man.config # 默认的情况中,显示最后的十行!若要显示最后的 20 行,就得要这样: [root@www ~]# tail -n 20 /etc/man.config
5 目录
-
ls (列出目录)
在Linux系统当中, ls 命令可能是最常被运行的。
语法:
[root@www ~]# ls [-aAdfFhilnrRSt] 目录名称 [root@www ~]# ls [--color={never,auto,always}] 目录名称 [root@www ~]# ls [--full-time] 目录名称
选项与参数:
- -a :全部的文件,连同隐藏文件( 开头为 . 的文件) 一起列出来(常用)
- -d :仅列出目录本身,而不是列出目录内的文件数据(常用)
- -l :长数据串列出,包含文件的属性与权限等等数据;(常用)
将家目录下的所有文件列出来(含属性与隐藏档)
[root@www ~]# ls -al ~
-
cd (切换目录)
cd是Change Directory的缩写,这是用来变换工作目录的命令。
语法:
cd [相对路径或绝对路径] #使用 mkdir 命令创建 runoob 目录 [root@www ~]# mkdir runoob #使用绝对路径切换到 runoob 目录 [root@www ~]# cd /root/runoob/ #使用相对路径切换到 runoob 目录 [root@www ~]# cd ./runoob/ # 表示回到自己的家目录,亦即是 /root 这个目录 [root@www runoob]# cd ~ # 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思; [root@www ~]# cd ..
接下来大家多操作几次应该就可以很好的理解 cd 命令的。
-
pwd (显示目前所在的目录)
pwd 是 Print Working Directory 的缩写,也就是显示目前所在目录的命令。
[root@www ~]# pwd [-P]
选项与参数:
- -P :显示出确实的路径,而非使用连结 (link) 路径。
实例:单纯显示出目前的工作目录:
[root@www ~]# pwd /root <== 显示出目录啦~
实例显示出实际的工作目录,而非连结档本身的目录名而已。
[root@www ~]# cd /var/mail <==注意,/var/mail是一个连结档 [root@www mail]# pwd /var/mail <==列出目前的工作目录 [root@www mail]# pwd -P /var/spool/mail <==怎么回事?有没有加 -P 差很多~ [root@www mail]# ls -ld /var/mail lrwxrwxrwx 1 root root 10 Sep 4 17:54 /var/mail -> spool/mail # 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail # 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊!
-
mkdir (创建新目录)
如果想要创建新的目录的话,那么就使用mkdir (make directory)吧。
语法:
mkdir [-mp] 目录名称
选项与参数:
- -m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~
- -p :帮助你直接将所需要的目录(包含上一级目录)递归创建起来!
实例:请到/tmp底下尝试创建数个新目录看看:
[root@www ~]# cd /tmp [root@www tmp]# mkdir test <==创建一名为 test 的新目录 [root@www tmp]# mkdir test1/test2/test3/test4 mkdir: cannot create directory `test1/test2/test3/test4': No such file or directory <== 没办法直接创建此目录啊! [root@www tmp]# mkdir -p test1/test2/test3/test4
加了这个 -p 的选项,可以自行帮你创建多层目录!
实例:创建权限为 rwx–x–x 的目录。
[root@www tmp]# mkdir -m 711 test2 [root@www tmp]# ls -l drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2
上面的权限部分,如果没有加上 -m 来强制配置属性,系统会使用默认属性。
如果我们使用 -m ,如上例我们给予 -m 711 来给予新的目录 drwx–x–x 的权限。
-
rmdir (删除空的目录)
语法:
rmdir [-p] 目录名称
选项与参数:
- **-p :**从该目录起,一次删除多级空目录
删除 runoob 目录
[root@www tmp]# rmdir runoob/
将 mkdir 实例中创建的目录(/tmp 底下)删除掉!
[root@www tmp]# ls -l <==看看有多少目录存在? drwxr-xr-x 3 root root 4096 Jul 18 12:50 test drwxr-xr-x 3 root root 4096 Jul 18 12:53 test1 drwx--x--x 2 root root 4096 Jul 18 12:54 test2 [root@www tmp]# rmdir test <==可直接删除掉,没问题 [root@www tmp]# rmdir test1 <==因为尚有内容,所以无法删除! rmdir: `test1': Directory not empty [root@www tmp]# rmdir -p test1/test2/test3/test4 [root@www tmp]# ls -l <==您看看,底下的输出中test与test1不见了! drwx--x--x 2 root root 4096 Jul 18 12:54 test2
利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。
不过要注意的是,这个 rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录。
-
cp (复制文件或目录)
cp 即拷贝文件和目录。
语法:
[root@www ~]# cp [-adfilprsu] 来源档(source) 目标档(destination) [root@www ~]# cp [options] source1 source2 source3 .... directory
选项与参数:
- **-a:**相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
- **-d:**若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
- **-f:**为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
- **-i:**若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
- **-l:**进行硬式连结(hard link)的连结档创建,而非复制文件本身;
- **-p:**连同文件的属性一起复制过去,而非使用默认属性(备份常用);
- **-r:**递归持续复制,用於目录的复制行为;(常用)
- **-s:**复制成为符号连结档 (symbolic link),亦即『捷径』文件;
- **-u:**若 destination 比 source 旧才升级 destination !
用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc
[root@www ~]# cp ~/.bashrc /tmp/bashrc [root@www ~]# cp -i ~/.bashrc /tmp/bashrc cp: overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖
-
rm (移除文件或目录)
语法:
rm [-fir] 文件或目录
选项与参数:
- -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息;
- -i :互动模式,在删除前会询问使用者是否动作
- -r :递归删除啊!最常用在目录的删除了!这是非常危险的选项!!!
将刚刚在 cp 的实例中创建的 bashrc 删除掉!
[root@www tmp]# rm -i bashrc rm: remove regular file `bashrc'? y
如果加上 -i 的选项就会主动询问喔,避免你删除到错误的档名!
-
mv (移动文件与目录,或修改名称)
语法:
[root@www ~]# mv [-fiu] source destination [root@www ~]# mv [options] source1 source2 source3 .... directory
选项与参数:
- -f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;
- -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!
- -u :若目标文件已经存在,且 source 比较新,才会升级 (update)
复制一文件,创建一目录,将文件移动到目录中
[root@www ~]# cd /tmp [root@www tmp]# cp ~/.bashrc bashrc [root@www tmp]# mkdir mvtest [root@www tmp]# mv bashrc mvtest
将某个文件移动到某个目录去,就是这样做!
将刚刚的目录名称更名为 mvtest2
[root@www tmp]# mv mvtest mvtest2
6 磁盘管理
-
df命令:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息。
语法:
df [-ahikHTm] [目录或文件名]
选项与参数:
-
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统;
-
-k :以 KBytes 的容量显示各文件系统;
-
-m :以 MBytes 的容量显示各文件系统;
-
-h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示;
-
-H :以 M=1000K 取代 M=1024K 的进位方式;
-
-T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出;
-
-i :不用硬盘容量,而以 inode 的数量来显示
-
实例 1
将系统内所有的文件系统列出来!
[root@www ~]# df Filesystem 1K-blocks Used Available Use% Mounted on /dev/hdc2 9920624 3823112 5585444 41% / /dev/hdc3 4956316 141376 4559108 4% /home /dev/hdc1 101086 11126 84741 12% /boot tmpfs 371332 0 371332 0% /dev/shm
在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来!
-
实例 2
将容量结果以易读的容量格式显示出来
[root@www ~]# df -h Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% / /dev/hdc3 4.8G 139M 4.4G 4% /home /dev/hdc1 99M 11M 83M 12% /boot tmpfs 363M 0 363M 0% /dev/shm
- 实例 3
将系统内的所有特殊文件格式及名称都列出来
[root@www ~]# df -aT Filesystem Type 1K-blocks Used Available Use% Mounted on /dev/hdc2 ext3 9920624 3823112 5585444 41% / proc proc 0 0 0 - /proc sysfs sysfs 0 0 0 - /sys devpts devpts 0 0 0 - /dev/pts /dev/hdc3 ext3 4956316 141376 4559108 4% /home /dev/hdc1 ext3 101086 11126 84741 12% /boot tmpfs tmpfs 371332 0 371332 0% /dev/shm none binfmt_misc 0 0 0 - /proc/sys/fs/binfmt_misc sunrpc rpc_pipefs 0 0 0 - /var/lib/nfs/rpc_pipefs
-
实例 4
将 /etc 底下的可用的磁盘容量以易读的容量格式显示
[root@www ~]# df -h /etc Filesystem Size Used Avail Use% Mounted on /dev/hdc2 9.5G 3.7G 5.4G 41% /
?
-
-
du:Linux du 命令也是查看使用空间的,但是与 df 命令不同的是 Linux du 命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍 Linux du 命令。
语法:
du [-ahskm] 文件或目录名称
选项与参数:
- -a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。
- -h :以人们较易读的容量格式 (G/M) 显示;
- -s :列出总量而已,而不列出每个各别的目录占用容量;
- -S :不包括子目录下的总计,与 -s 有点差别。
- -k :以 KBytes 列出容量显示;
- -m :以 MBytes 列出容量显示;
实例 1
只列出当前目录下的所有文件夹容量(包括隐藏文件夹):
[root@www ~]# du 8 ./test4 <==每个目录都会列出来 8 ./test2 ....中间省略.... 12 ./.gconfd <==包括隐藏文件的目录 220 . <==这个目录(.)所占用的总量
直接输入 du 没有加任何选项时,则 du 会分析当前所在目录里的子目录所占用的硬盘空间。
实例 2
将文件的容量也列出来
[root@www ~]# du -a 12 ./install.log.syslog <==有文件的列表了 8 ./.bash_logout 8 ./test4 8 ./test2 ....中间省略.... 12 ./.gconfd 220 .
实例 3
检查根目录底下每个目录所占用的容量
[root@www ~]# du -sm /* 7 /bin 6 /boot .....中间省略.... 0 /proc .....中间省略.... 1 /tmp 3859 /usr <==系统初期最大就是他了啦! 77 /var
通配符 * 来代表每个目录。
与 df 不一样的是,du 这个命令其实会直接到文件系统内去搜寻所有的文件数据。
7 vi/vim
-
基本上 vi/vim 共分为三种模式,分别是命令模式(Command mode),输入模式(Insert mode)和底线命令模式(Last line mode)。 这三种模式的作用分别是:
命令模式:用户刚刚启动 vi/vim,便进入了命令模式。此状态下敲击键盘动作会被Vim识别为命令,而非输入字符。比如我们此时按下i,并不会输入一个字符,i被当作了一个命令。
以下是常用的几个命令:
- i 切换到输入模式,以输入字符。
- x 删除当前光标所在处的字符。
- : 切换到底线命令模式,以在最底一行输入命令。
若想要编辑文本:启动Vim,进入了命令模式,按下i,切换到输入模式。命令模式只有一些最基本的命令,因此仍要依靠底线命令模式输入更多命令。
输入模式:在命令模式下按下i就进入了输入模式。
在输入模式中,可以使用以下按键:
- 字符按键以及Shift组合,输入字符
- ENTER,回车键,换行
- BACK SPACE,退格键,删除光标前一个字符
- DEL,删除键,删除光标后一个字符
- 方向键,在文本中移动光标
- HOME/END,移动光标到行首/行尾
- Page Up/Page Down,上/下翻页
- Insert,切换光标为输入/替换模式,光标将变成竖线/下划线
- ESC,退出输入模式,切换到命令模式
底线命令模式:在命令模式下按下:(英文冒号)就进入了底线命令模式。底线命令模式可以输入单个或多个字符的命令,可用的命令非常多。
在底线命令模式中,基本的命令有(已经省略了冒号):
- q 退出程序
- w 保存文件
按ESC键可随时退出底线命令模式。
-
按键说明:第一部分:一般模式可用的光标移动、复制粘贴、搜索替换等
移动光标的方法 h 或 向左箭头键(←) 光标向左移动一个字符 j 或 向下箭头键(↓) 光标向下移动一个字符 k 或 向上箭头键(↑) 光标向上移动一个字符 l 或 向右箭头键(→) 光标向右移动一个字符 如果你将右手放在键盘上的话,你会发现 hjkl 是排列在一起的,因此可以使用这四个按钮来移动光标。 如果想要进行多次移动的话,例如向下移动 30 行,可以使用 “30j” 或 “30↓” 的组合按键, 亦即加上想要进行的次数(数字)后,按下动作即可! [Ctrl] + [f] 屏幕『向下』移动一页,相当于 [Page Down]按键 (常用) [Ctrl] + [b] 屏幕『向上』移动一页,相当于 [Page Up] 按键 (常用) [Ctrl] + [d] 屏幕『向下』移动半页 [Ctrl] + [u] 屏幕『向上』移动半页 + 光标移动到非空格符的下一行 - 光标移动到非空格符的上一行 n 那个 n 表示『数字』,例如 20 。按下数字后再按空格键,光标会向右移动这一行的 n 个字符。例如 20 则光标会向后面移动 20 个字符距离。 0 或功能键[Home] 这是数字『 0 』:移动到这一行的最前面字符处 (常用) $ 或功能键[End] 移动到这一行的最后面字符处(常用) H 光标移动到这个屏幕的最上方那一行的第一个字符 M 光标移动到这个屏幕的中央那一行的第一个字符 L 光标移动到这个屏幕的最下方那一行的第一个字符 G 移动到这个档案的最后一行(常用) nG n 为数字。移动到这个档案的第 n 行。例如 20G 则会移动到这个档案的第 20 行(可配合 :set nu) gg 移动到这个档案的第一行,相当于 1G 啊! (常用) n n 为数字。光标向下移动 n 行(常用) 搜索替换 /word 向光标之下寻找一个名称为 word 的字符串。例如要在档案内搜寻 vbird 这个字符串,就输入 /vbird 即可! (常用) ?word 向光标之上寻找一个字符串名称为 word 的字符串。 n 这个 n 是英文按键。代表重复前一个搜寻的动作。举例来说, 如果刚刚我们执行 /vbird 去向下搜寻 vbird 这个字符串,则按下 n 后,会向下继续搜寻下一个名称为 vbird 的字符串。如果是执行 ?vbird 的话,那么按下 n 则会向上继续搜寻名称为 vbird 的字符串! N 这个 N 是英文按键。与 n 刚好相反,为『反向』进行前一个搜寻动作。 例如 /vbird 后,按下 N 则表示『向上』搜寻 vbird 。 使用 /word 配合 n 及 N 是非常有帮助的!可以让你重复的找到一些你搜寻的关键词! :n1,n2s/word1/word2/g n1 与 n2 为数字。在第 n1 与 n2 行之间寻找 word1 这个字符串,并将该字符串取代为 word2 !举例来说,在 100 到 200 行之间搜寻 vbird 并取代为 VBIRD 则: 『:100,200s/vbird/VBIRD/g』。(常用) :1,$s/word1/word2/g 或 :%s/word1/word2/g 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !(常用) :1,$s/word1/word2/gc 或 :%s/word1/word2/gc 从第一行到最后一行寻找 word1 字符串,并将该字符串取代为 word2 !且在取代前显示提示字符给用户确认 (confirm) 是否需要取代!(常用) 删除、复制与贴上 x, X 在一行字当中,x 为向后删除一个字符 (相当于 [del] 按键), X 为向前删除一个字符(相当于 [backspace] 亦即是退格键) (常用) nx n 为数字,连续向后删除 n 个字符。举例来说,我要连续删除 10 个字符, 『10x』。 dd 剪切游标所在的那一整行(常用),用 p/P 可以粘贴。 ndd n 为数字。剪切光标所在的向下 n 行,例如 20dd 则是剪切 20 行(常用),用 p/P 可以粘贴。 d1G 删除光标所在到第一行的所有数据 dG 删除光标所在到最后一行的所有数据 d$ 删除游标所在处,到该行的最后一个字符 d0 那个是数字的 0 ,删除游标所在处,到该行的最前面一个字符 yy 复制游标所在的那一行(常用) nyy n 为数字。复制光标所在的向下 n 行,例如 20yy 则是复制 20 行(常用) y1G 复制游标所在行到第一行的所有数据 yG 复制游标所在行到最后一行的所有数据 y0 复制光标所在的那个字符到该行行首的所有数据 y$ 复制光标所在的那个字符到该行行尾的所有数据 p, P p 为将已复制的数据在光标下一行贴上,P 则为贴在游标上一行! 举例来说,我目前光标在第 20 行,且已经复制了 10 行数据。则按下 p 后, 那 10 行数据会贴在原本的 20 行之后,亦即由 21 行开始贴。但如果是按下 P 呢? 那么原本的第 20 行会被推到变成 30 行。 (常用) J 将光标所在行与下一行的数据结合成同一行 c 重复删除多个数据,例如向下删除 10 行,[ 10cj ] u 复原前一个动作。(常用) [Ctrl]+r 重做上一个动作。(常用) 这个 u 与 [Ctrl]+r 是很常用的指令!一个是复原,另一个则是重做一次~ 利用这两个功能按键,你的编辑,嘿嘿!很快乐的啦! . 不要怀疑!这就是小数点!意思是重复前一个动作的意思。 如果你想要重复删除、重复贴上等等动作,按下小数点『.』就好了! (常用) 第二部分:一般模式切换到编辑模式的可用的按钮说明
进入输入或取代的编辑模式 i, I 进入输入模式(Insert mode): i 为『从目前光标所在处输入』, I 为『在目前所在行的第一个非空格符处开始输入』。 (常用) a, A 进入输入模式(Insert mode): a 为『从目前光标所在的下一个字符处开始输入』, A 为『从光标所在行的最后一个字符处开始输入』。(常用) o, O 进入输入模式(Insert mode): 这是英文字母 o 的大小写。o 为在目前光标所在的下一行处输入新的一行; O 为在目前光标所在的上一行处输入新的一行!(常用) r, R 进入取代模式(Replace mode): r 只会取代光标所在的那一个字符一次;R会一直取代光标所在的文字,直到按下 ESC 为止;(常用) 上面这些按键中,在 vi 画面的左下角处会出现『–INSERT–』或『–REPLACE–』的字样。 由名称就知道该动作了吧!!特别注意的是,我们上面也提过了,你想要在档案里面输入字符时, 一定要在左下角处看到 INSERT 或 REPLACE 才能输入喔! [Esc] 退出编辑模式,回到一般模式中(常用) 第三部分:一般模式切换到指令行模式的可用的按钮说明
指令行的储存、离开等指令 :w 将编辑的数据写入硬盘档案中(常用) :w! 若文件属性为『只读』时,强制写入该档案。不过,到底能不能写入, 还是跟你对该档案的档案权限有关啊! :q 离开 vi (常用) :q! 若曾修改过档案,又不想储存,使用 ! 为强制离开不储存档案。 注意一下啊,那个惊叹号 (!) 在 vi 当中,常常具有『强制』的意思~ :wq 储存后离开,若为 :wq! 则为强制储存后离开 (常用) ZZ 这是大写的 Z 喔!如果修改过,保存当前文件,然后退出!效果等同于(保存并退出) ZQ 不保存,强制退出。效果等同于 :q!。 :w [filename] 将编辑的数据储存成另一个档案(类似另存新档) :r [filename] 在编辑的数据中,读入另一个档案的数据。亦即将 『filename』 这个档案内容加到游标所在行后面 :n1,n2 w [filename] 将 n1 到 n2 的内容储存成 filename 这个档案。 :! command 暂时离开 vi 到指令行模式下执行 command 的显示结果!例如 『:! ls /home』即可在 vi 当中察看 /home 底下以 ls 输出的档案信息! vim 环境的变更 :set nu 显示行号,设定之后,会在每一行的前缀显示该行的行号 :set nonu 与 set nu 相反,为取消行号!
8 yum
-
yum( Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。基于 RPM 包管理,能够从指定的服务器自动下载 RPM 包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。yum 提供了查找、安装、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。
-
yum 语法
yum [options] [command] [package ...]
- **options:**可选,选项包括-h(帮助),-y(当安装过程提示选择全部为 “yes”),-q(不显示安装的过程)等等。
- **command:**要进行的操作。
- **package:**安装的包名。
-
yum常用命令
-
- 列出所有可更新的软件清单命令:yum check-update
-
- 更新所有软件命令:yum update
-
- 仅安装指定的软件命令:yum install <package_name>
-
- 仅更新指定的软件命令:yum update <package_name>
-
- 列出所有可安裝的软件清单命令:yum list
-
- 删除软件包命令:yum remove <package_name>
-
- 查找软件包命令:yum search
-
- 清除缓存命令:
- yum clean packages: 清除缓存目录下的软件包
- yum clean headers: 清除缓存目录下的 headers
- yum clean oldheaders: 清除缓存目录下旧的 headers
- yum clean, yum clean all (= yum clean packages; yum clean oldheaders) :清除缓存目录下的软件包及旧的 headers
-
9 apt
-
apt(Advanced Packaging Tool)是一个在 Debian 和 Ubuntu 中的 Shell 前端软件包管理器。apt 命令提供了查找、安装、升级、删除某一个、一组甚至全部软件包的命令,而且命令简洁而又好记。apt 命令执行需要超级管理员权限(root)。
-
apt 语法
apt [options] [command] [package ...]
- **options:**可选,选项包括 -h(帮助),-y(当安装过程提示选择全部为"yes"),-q(不显示安装的过程)等等。
- **command:**要进行的操作。
- package:安装的包名。
-
apt 常用命令
-
列出所有可更新的软件清单命令:sudo apt update
-
升级软件包:sudo apt upgrade
列出可更新的软件包及版本信息:apt list --upgradeable
升级软件包,升级前先删除需要更新软件包:sudo apt full-upgrade
-
安装指定的软件命令:sudo apt install <package_name>
安装多个软件包:sudo apt install <package_1> <package_2> <package_3>
-
更新指定的软件命令:sudo apt update <package_name>
-
显示软件包具体信息,例如:版本号,安装大小,依赖关系等等:sudo apt show <package_name>
-
删除软件包命令:sudo apt remove <package_name>
-
清理不再使用的依赖和库文件: sudo apt autoremove
-
移除软件包及配置文件: sudo apt purge <package_name>
-
查找软件包命令: sudo apt search
-
列出所有已安装的包:apt list --installed
-
列出所有已安装的包的版本信息:apt list --all-versions
-
10 同步命令
- scp:scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。
语法:
scp [-1246BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program]
[[user@]host1:]file1 [...] [[user@]host2:]file2
参数说明:
- -1: 强制scp命令使用协议ssh1
- -2: 强制scp命令使用协议ssh2
- -4: 强制scp命令只使用IPv4寻址
- -6: 强制scp命令只使用IPv6寻址
- -B: 使用批处理模式(传输过程中不询问传输口令或短语)
- -C: 允许压缩。(将-C标志传递给ssh,从而打开压缩功能)
- -p:保留原文件的修改时间,访问时间和访问权限。
- -q: 不显示传输进度条。
- -r: 递归复制整个目录。
- -v:详细方式显示输出。scp和ssh(1)会显示出整个过程的调试信息。这些信息用于调试连接,验证和配置问题。
- -c cipher: 以cipher将数据传输进行加密,这个选项将直接传递给ssh。
- -F ssh_config: 指定一个替代的ssh配置文件,此参数直接传递给ssh。
- -i identity_file: 从指定文件中读取传输时使用的密钥文件,此参数直接传递给ssh。
- -l limit: 限定用户所能使用的带宽,以Kbit/s为单位。
- -o ssh_option: 如果习惯于使用ssh_config(5)中的参数传递方式,
- -P port:注意是大写的P, port是指定数据传输用到的端口号
- -S program: 指定加密传输时所使用的程序。此程序必须能够理解ssh(1)的选项。
用法示例:
# 复制当前主机的fyq文件夹到远程主机上的/media/目录下
scp -r /media/fyq F@192.168.10.1:/media/
# 也可以同时操作两台远程主机
scp -r F@192.168.10.1:/media/fyq F@192.168.10.2:/media/
- rsync 是一个常用的 Linux 应用程序,用于文件同步。它可以在本地计算机与远程计算机之间,或者两个本地目录之间同步文件(但不支持两台远程计算机之间的同步)。它也可以当作文件复制工具,替代
cp
和mv
命令。它名称里面的r
指的是 remote,rsync 其实就是“远程同步”(remote sync)的意思。与其他文件传输工具(如 FTP 或 scp)不同,rsync 的最大特点是会检查发送方和接收方已有的文件,仅传输有变动的部分(默认规则是文件大小或修改时间有变动)。
安装
# Ubuntu
sudo apt-get install rsync
# Red Hat/CentOs
sudo yum install rsync
# Arch Linux
sudo pacman -S rsync
使用参数
-
-r:-r表示递归,即包含子目录。
# 本机使用 rsync 命令时,可以作为cp和mv命令的替代方法,将源目录拷贝到目标目录。-r表示递归,即包含子目录。注意,-r是必须的,否则 rsync 运行不会成功。source目录表示源目录,destination表示目标目录。 rsync -r source destination # 有多个文件或目录需要同步 rsync -r source1 source2 destination
-
-a:-a参数可以替代-r,除了可以递归同步以外,还可以同步元信息(比如修改时间、权限等)。由于 rsync 默认使用文件大小和修改时间决定文件是否需要更新,所以-a比-r更有用。
# 目标目录destination如果不存在,rsync 会自动创建。执行命令后,源目录source被完整地复制到了目标目录destination下面,即形成了destination/source的目录结构。 rsync -a source destination # 如果只想同步源目录source里面的内容到目标目录destination,则需要在源目录后面加上斜杠。 rsync -a source/ destination
-
-n:如果不确定 rsync 执行后会产生什么结果,可以先用
-n
或--dry-run
参数模拟执行的结果。上面命令中,-n
参数模拟命令执行的结果,并不真的执行命令。-v
参数则是将结果输出到终端,这样就可以看到哪些内容会被同步。rsync -anv source/ destination
-
–delete:默认情况下,rsync 只确保源目录的所有内容(明确排除的文件除外)都复制到目标目录。它不会使两个目录保持相同,并且不会删除文件。如果要使得目标目录成为源目录的镜像副本,则必须使用
--delete
参数,这将删除只存在于目标目录、不存在于源目录的文件。rsync -av --delete source/ destination
-
–exclude:有时,我们希望同步时排除某些文件或目录,这时可以用
--exclude
参数指定排除模式。# 排除所有txt文件 rsync -av --exclude='*.txt' source/ destination 或者 rsync -av --exclude '*.txt' source/ destination # rsync 会同步以“点”开头的隐藏文件,如果要排除隐藏文件,可以这样写--exclude=".*" rsync -av --exclude=".*" source/ destination # 如果要排除某个目录里面的所有文件,但不希望排除目录本身,可以写成下面这样。 rsync -av --exclude 'dir1/*' source/ destination # 多个排除模式,可以用多个--exclude参数。 rsync -av --exclude 'file1.txt' --exclude 'dir1/*' source/ destination # 多个排除模式也可以利用 Bash 的大扩号的扩展功能,只用一个--exclude参数。 rsync -av --exclude={'file1.txt','dir1/*'} source/ destination # 如果排除模式很多,可以将它们写入一个文件,每个模式一行,然后用--exclude-from参数指定这个文件。 rsync -av --exclude-from='exclude-file.txt' source/ destination
-
–include:
--include
参数用来指定必须同步的文件模式,往往与--exclude
结合使用。# 上面命令指定同步时,排除所有文件,但是会包括 TXT 文件。 rsync -av --include="*.txt" --exclude='*' source/ destination
-
-a,–archive:
-a
、--archive
参数表示存档模式,保存所有的元数据,比如修改时间(modification time)、权限、所有者等,并且软链接也会同步过去。 -
–append:
--append
参数指定文件接着上次中断的地方,继续传输。 -
–append-verify:
--append-verify
参数跟--append
参数类似,但会对传输完成后的文件进行一次校验。如果校验失败,将重新发送整个文件。 -
-b,–backup:
-b
、--backup
参数指定在删除或更新目标目录已经存在的文件时,将该文件更名后进行备份,默认行为是删除。更名规则是添加由--suffix
参数指定的文件后缀名,默认是~
。 -
–backup-dir:
--backup-dir
参数指定文件备份时存放的目录,比如--backup-dir=/path/to/backups
。 -
–bwlimit:
--bwlimit
参数指定带宽限制,默认单位是 KB/s,比如--bwlimit=100
。 -
-c,–checksum:
-c
、--checksum
参数改变rsync
的校验方式。默认情况下,rsync 只检查文件的大小和最后修改日期是否发生变化,如果发生变化,就重新传输;使用这个参数以后,则通过判断文件内容的校验和,决定是否重新传输。 -
--delete
参数删除只存在于目标目录、不存在于源目标的文件,即保证目标目录是源目标的镜像。-e
参数指定使用 SSH 协议传输数据。--exclude
参数指定排除不进行同步的文件,比如--exclude="*.iso"
。--exclude-from
参数指定一个本地文件,里面是需要排除的文件模式,每个模式一行。--existing
、--ignore-non-existing
参数表示不同步目标目录中不存在的文件和目录。-h
参数表示以人类可读的格式输出。-h
、--help
参数返回帮助信息。-i
参数表示输出源目录与目标目录之间文件差异的详细情况。--ignore-existing
参数表示只要该文件在目标目录中已经存在,就跳过去,不再同步这些文件。--include
参数指定同步时要包括的文件,一般与--exclude
结合使用。--link-dest
参数指定增量备份的基准目录。-m
参数指定不同步空目录。--max-size
参数设置传输的最大文件的大小限制,比如不超过200KB(--max-size='200k'
)。--min-size
参数设置传输的最小文件的大小限制,比如不小于10KB(--min-size=10k
)。-n
参数或--dry-run
参数模拟将要执行的操作,而并不真的执行。配合-v
参数使用,可以看到哪些内容会被同步过去。-P
参数是--progress
和--partial
这两个参数的结合。--partial
参数允许恢复中断的传输。不使用该参数时,rsync
会删除传输到一半被打断的文件;使用该参数后,传输到一半的文件也会同步到目标目录,下次同步时再恢复中断的传输。一般需要与--append
或--append-verify
配合使用。--partial-dir
参数指定将传输到一半的文件保存到一个临时目录,比如--partial-dir=.rsync-partial
。一般需要与--append
或--append-verify
配合使用。--progress
参数表示显示进展。-r
参数表示递归,即包含子目录。--remove-source-files
参数表示传输成功后,删除发送方的文件。--size-only
参数表示只同步大小有变化的文件,不考虑文件修改时间的差异。--suffix
参数指定文件名备份时,对文件名添加的后缀,默认是~
。-u
、--update
参数表示同步时跳过目标目录中修改时间更新的文件,即不同步这些有更新的时间戳的文件。-v
参数表示输出细节。-vv
表示输出更详细的信息,-vvv
表示输出最详细的信息。--version
参数返回 rsync 的版本。-z
参数指定同步时压缩数据。
远程同步
-
rsync 除了支持本地两个目录之间的同步,也支持远程同步。它可以将本地内容,同步到远程服务器。
-
# 将本地内容,同步到远程服务器。 rsync -av source/ username@remote_host:destination # 将远程内容同步到本地。 rsync -av username@remote_host:source/ destination # 早期 rsync 不使用 SSH 协议,需要用-e参数指定协议,后来才改的。所以,下面-e ssh可以省略。 sync -av -e ssh source/ user@remote_host:/destination # 如果 ssh 命令有附加的参数,则必须使用-e参数指定所要执行的 SSH 命令。 rsync -av -e 'ssh -p 2234' source/ user@remote_host:/destination
-
除了使用 SSH,如果另一台服务器安装并运行了 rsync 守护程序,则也可以用
rsync://
协议(默认端口873)进行传输。具体写法是服务器与目标目录之间使用双冒号分隔::
。rsync -av source/ 192.168.122.32::module/destination # 注意,上面地址中的module并不是实际路径名,而是 rsync 守护程序指定的一个资源名,由管理员分配。 # 如果想知道 rsync 守护程序分配的所有 module 列表,可以执行下面命令。 rsync rsync://192.168.122.32 # rsync 协议除了使用双冒号,也可以直接用rsync://协议指定地址。 rsync -av source/ rsync://192.168.122.32/module/destination z
增量备份
-
rsync 的最大特点就是它可以完成增量备份,也就是默认只复制有变动的文件。除了源目录与目标目录直接比较,rsync 还支持使用基准目录,即将源目录与基准目录之间变动的部分,同步到目标目录。具体做法是,第一次同步是全量备份,所有文件在基准目录里面同步一份。以后每一次同步都是增量备份,只同步源目录与基准目录之间有变动的部分,将这部分保存在一个新的目标目录。这个新的目标目录之中,也是包含所有文件,但实际上,只有那些变动过的文件是存在于该目录,其他没有变动的文件都是指向基准目录文件的硬链接。
# --link-dest参数用来指定同步时的基准目录。 rsync -a --delete --link-dest /compare/path /source/path /target/path # 上面命令中,--link-dest参数指定基准目录/compare/path,然后源目录/source/path跟基准目录进行比较,找出变动的文件,将它们拷贝到目标目录/target/path。那些没变动的文件则会生成硬链接。这个命令的第一次备份时是全量备份,后面就都是增量备份了。
11 ps
12 lsof
13 netstat
14 awk
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!