分类: 经验

  • rpm 安装教程

    下面讲解一下,如何使用 rpm 命令对 RPM 二进制包进行安装、卸载和升级操作。我们以安装 apache 程序为例。

    RPM包默认安装路径

    通常情况下,RPM 包采用系统默认的安装路径,所有安装文件会按照类别分散安装到下表所示的目录中。

    RPM 包默认安装路径
    安装路径 含 义
    /etc/ 配置文件安装目录
    /usr/bin/ 可执行的命令安装目录
    /usr/lib/ 程序所使用的函数库保存位置
    /usr/share/doc/ 基本的软件使用手册保存位置
    /usr/share/man/ 帮助文件保存位置

    RPM 包的默认安装路径是可以通过命令查询的。

    除此之外,RPM 包也支持手动指定安装路径,但此方式并不推荐。因为一旦手动指定安装路径,所有的安装文件会集中安装到指定位置,且系统中用来查询安装路径的命令也无法使用(需要进行手工配置才能被系统识别),得不偿失。

    与 RPM 包不同,源码包的安装通常采用手动指定安装路径(习惯安装到 /usr/local/ 中)的方式。既然安装路径不同,同一 apache 程序的源码包和 RPM 包就可以安装到一台 Linux 服务器上(但同一时间只能开启一个,因为它们需要占用同一个 80 端口)。

    实际情况中,一台服务器几乎不会同时包含两个 apache 程序,管理员不好管理,还会占用过多的服务器磁盘空间。

    RPM 包的安装

    安装 RPM 的命令格式为:

    [root@localhost ~]# rpm -ivh 包全名

    注意一定是包全名。涉及到包全名的命令,一定要注意路径,可能软件包在光盘中,因此需提前做好设备的挂载工作。

    此命令中各选项参数的含义为:

    • -i:安装(install);
    • -v:显示更详细的信息(verbose);
    • -h:打印 #,显示安装进度(hash);

    例如,使用此命令安装 apache 软件包,如下所示:

    1. [root@localhost ~]# rpm -ivh \
    2. /mnt/cdrom/Packages/httpd-2.2.1515.el6.centos.1.i686.rpm
    3. Preparing…
    4. ####################
    5. [100%]
    6. 1:httpd
    7. ####################
    8. [100%]

    注意,直到出现两个 100% 才是真正的安装成功,第一个 100% 仅表示完成了安装准备工作。

    此命令还可以一次性安装多个软件包,仅需将包全名用空格分开即可,如下所示:

    [root@localhost ~]# rpm -ivh a
    .rpm b
    .rpm c
    .rpm

    如果还有其他安装要求(比如强制安装某软件而不管它是否有依赖性),可以通过以下选项进行调整:

    • -nodeps:不检测依赖性安装。软件安装时会检测依赖性,确定所需的底层软件是否安装,如果没有安装则会报错。如果不管依赖性,想强制安装,则可以使用这个选项。注意,这样不检测依赖性安装的软件基本上是不能使用的,所以不建议这样做。
    • -replacefiles:替换文件安装。如果要安装软件包,但是包中的部分文件已经存在,那么在正常安装时会报”某个文件已经存在”的错误,从而导致软件无法安装。使用这个选项可以忽略这个报错而覆盖安装。
    • -replacepkgs:替换软件包安装。如果软件包已经安装,那么此选项可以把软件包重复安装一遍。
    • -force:强制安装。不管是否已经安装,都重新安装。也就是 -replacefiles 和 -replacepkgs 的综合。
    • -test:测试安装。不会实际安装,只是检测一下依赖性。
    • -prefix:指定安装路径。为安装软件指定安装路径,而不使用默认安装路径。

    apache 服务安装完成后,可以尝试启动:

    [root@localhost ~]# service 服务名 start|stop|restart|status

    各参数含义:

    • start:启动服务;
    • stop:停止服务;
    • restart:重启服务;
    • status: 查看服务状态;

    例如:

    [root@localhost ~]# service httpd start #启动apache服务

    服务启动后,可以查看端口号 80 是否出现。命令如下:

    1. [root@localhost ~]# netstat -tlun | grep 80
    2. tcp 0 0 :::80 :::* LISTEN

    RPM包的升级

    使用如下命令即可实现 RPM 包的升级:

    [root@localhost ~]# rpm -Uvh 包全名

    -U(大写)选项的含义是:如果该软件没安装过则直接安装;若已经安装则升级至最新版本。

    [root@localhost ~]# rpm -Fvh 包全名

    -F(大写)选项的含义是:如果该软件没有安装,则不会安装,必须安装有较低版本才能升级。

    RPM包的卸载

    RPM 软件包的卸载要考虑包之间的依赖性。例如,我们先安装的 httpd 软件包,后安装 httpd 的功能模块 mod_ssl 包,那么在卸载时,就必须先卸载 mod_ssl,然后卸载 httpd,否则会报错。

    软件包卸载和拆除大楼是一样的,本来先盖的 2 楼,后盖的 3 楼,那么拆楼时一定要先拆除 3 楼。

    如果卸载 RPM 软件不考虑依赖性,执行卸载命令会包依赖性错误,例如:

    1. [root@localhost ~]# rpm -e httpd
    2. error: Failed dependencies:
    3. httpd-mmn = 20051115 is needed by (installed) mod_wsgi-3.21.el6.i686
    4. httpd-mmn = 20051115 is needed by (installed) php-5.3.33.el6_2.8.i686
    5. httpd-mmn = 20051115 is needed by (installed) mod_ssl-1:2.2.1515.el6.
    6. centos.1.i686
    7. httpd-mmn = 20051115 is needed by (installed) mod_perl-2.0.410.el6.i686
    8. httpd = 2.2.1515.el6.centos.1 is needed by (installed) httpd-manual-2.2.
    9. 1515.el6.centos.1 .noarch
    10. httpd is needed by (installed) webalizer-2.21_023.3.el6.i686
    11. httpd is needed by (installed) mod_ssl-1:2.2.1515.el6.centos.1.i686
    12. httpd= 0:2.2.1515.el6.centos.1 is needed by(installed)mod_ssl-1:2.2.1515.el6.centos.1.i686

    RPM 软件包的卸载很简单,使用如下命令即可:

    [root@localhost ~]# rpm -e 包名

    -e 选项表示卸载,也就是 erase 的首字母。

    RPM 软件包的卸载命令支持使用“-nocteps”选项,即可以不检测依赖性直接卸载,但此方式不推荐大家使用,因为此操作很可能导致其他软件也无法征程使用。

  • 正则表达式 – 修饰符

    正则表达式中常用的模式修正符有i、g、m、s、U、x、a、D、e 等。它们之间可以组合搭配使用。

    修饰符 含义 描述
    i ignore – 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
    g global – 全局匹配 查找所有的匹配项。
    m more – 多行匹配 使边界字符 ^ 和 $ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
    s 特殊字符圆点 . 中包含换行符 \n 默认情况下的圆点 . 是 匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

    i 不区分(ignore)大小写

    例如: /abc/i 可以匹配 abc、aBC、Abc

    g 全局(global)匹配

    如果不带g,正则过程中字符串从左到右匹配,找到第一个符合条件的即匹配成功,返回

    如果带g,则字符串从左到右,找到每个符合条件的都记录下来,知道字符串结尾位置

    例如:

    var str = ‘aaaaaaaa’

    var reg1 = /a/; str.match(reg1) // 结果为:[“a”, index: 0, input: “aaaaaaaa”]

    var reg2 = /a/g; str.match(reg2) // 结果为:[“a”, “a”, “a”, “a”, “a”, “a”, “a”, “a”]

    m 多(more)行匹配

    若存在换行\n并且有开始^或结束$符的情况下,和g一起使用实现全局匹配,

    因为存在换行时默认会把换行符作为一个字符任务匹配字符串是个单行,

    g只匹配第一行,添加m之后实现多行,每个换行符之后就是开始

    var str = “abcggab\nabcoab”;

    var preg1 = /^abc/gm; str.match(preg1) // 结果为:[“abc”, “abc”]

    var preg2 = /ab$/gm; str.match(preg2) // 结果为:[“ab”, “ab”]

    s 特殊字符圆点 . 中包含换行符

    默认的圆点 . 是 匹配除换行符 \n 之外的任何单字符,加上s之后, . 中包含换行符

    $str = “abggab\nacbs”;

    $preg = “/b./s”;

    preg_match_all($preg, $str,$matchs);

    print_r($matchs);//Array ( [0] => Array ( [0] => bg [1] => b [2] => bs ) )

    U 只匹配最近的一个字符串;不重复匹配;

    $mode=”/a(.*?)c/”;

    $preg=”/a.*c/U”;//这两个正则返回相同的值

    $str=”abcabbbcabbbbbc” ;

    preg_match($mode,$str,$content); echo $content[0];//abc

    preg_match($preg,$str,$content); echo $content[0];//abc

    修正符:x 将模式中的空白忽略; 修正符:A 强制从目标字符串开头匹配; 修正符:D 如果使用$限制结尾字符,则不允许结尾有换行; 修正符:e 配合函数preg_replace()使用, 可以把匹配来的字符串当作正则表达式执行;

  • 正则表达式-元字符

    正则表达式-元字符

    字符 描述
    \ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个向后引用、或一个八进制转义符。例如,“n”匹配字符“n”。“\n”匹配一个换行符。串行“\\”匹配“\”而“\(”则匹配“(”。
    ^ 匹配输入字符串的开始位置。如果设置了RegExp对象的Multiline属性,^也匹配“\n”或“\r”之后的位置。
    $ 匹配输入字符串的结束位置。如果设置了RegExp对象的Multiline属性,$也匹配“\n”或“\r”之前的位置。
    * 匹配前面的子表达式零次或多次。例如,zo*能匹配“z”以及“zoo”。*等价于{0,}。
    + 匹配前面的子表达式一次或多次。例如,“zo+”能匹配“zo”以及“zoo”,但不能匹配“z”。+等价于{1,}。
    ? 匹配前面的子表达式零次或一次。例如,“do(es)?”可以匹配“does”或“does”中的“do”。?等价于{0,1}。
    {n} n是一个非负整数。匹配确定的n次。例如,“o{2}”不能匹配“Bob”中的“o”,但是能匹配“food”中的两个o。
    {n,} n是一个非负整数。至少匹配n次。例如,“o{2,}”不能匹配“Bob”中的“o”,但能匹配“foooood”中的所有o。“o{1,}”等价于“o+”。“o{0,}”则等价于“o*”。
    {n,m} m和n均为非负整数,其中n<=m。最少匹配n次且最多匹配m次。例如,“o{1,3}”将匹配“fooooood”中的前三个o。“o{0,1}”等价于“o?”。请注意在逗号和两个数之间不能有空格。
    ? 当该字符紧跟在任何一个其他限制符(*,+,?,{n},{n,},{n,m})后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串“oooo”,“o+?”将匹配单个“o”,而“o+”将匹配所有“o”。
    . 匹配除“\ n”之外的任何单个字符。要匹配包括“\ n”在内的任何字符,请使用像“(.|\n)”的模式。
    (pattern) 匹配pattern并获取这一匹配。所获取的匹配可以从产生的Matches集合得到,在VBScript中使用SubMatches集合,在JScript中则使用$0…$9属性。要匹配圆括号字符,请使用“\(”或“\)”。
    (?:pattern) 匹配pattern但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。
    (?=pattern) 正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
    (?!pattern) 正向否定预查,在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
    (?<=pattern) 反向肯定预查,与正向肯定预查类拟,只是方向相反。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。
    (?<!pattern) 反向否定预查,与正向否定预查类拟,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。
    x|y 匹配x或y。例如,“z|food”能匹配“z”或“food”。“(z|f)ood”则匹配“zood”或“food”。
    [xyz] 字符集合。匹配所包含的任意一个字符。例如,“[abc]”可以匹配“plain”中的“a”。
    [^xyz] 负值字符集合。匹配未包含的任意字符。例如,“[^abc]”可以匹配“plain”中的“p”。
    [a-z] 字符范围。匹配指定范围内的任意字符。例如,“[a-z]”可以匹配“a”到“z”范围内的任意小写字母字符。
    [^a-z] 负值字符范围。匹配任何不在指定范围内的任意字符。例如,“[^a-z]”可以匹配任何不在“a”到“z”范围内的任意字符。
    \b 匹配一个单词边界,也就是指单词和空格间的位置。例如,“er\b”可以匹配“never”中的“er”,但不能匹配“verb”中的“er”。
    \B 匹配非单词边界。“er\B”能匹配“verb”中的“er”,但不能匹配“never”中的“er”。
    \cx 匹配由x指明的控制字符。例如,\cM匹配一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的“c”字符。
    \d 匹配一个数字字符。等价于[0-9]。
    \D 匹配一个非数字字符。等价于[^0-9]。
    \f 匹配一个换页符。等价于\x0c和\cL。
    \n 匹配一个换行符。等价于\x0a和\cJ。
    \r 匹配一个回车符。等价于\x0d和\cM。
    \s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。
    \S 匹配任何非空白字符。等价于[^ \f\n\r\t\v]。
    \t 匹配一个制表符。等价于\x09和\cI。
    \v 匹配一个垂直制表符。等价于\x0b和\cK。
    \w 匹配包括下划线的任何单词字符。等价于“[A-Za-z0-9_]”。
    \W 匹配任何非单词字符。等价于“[^A-Za-z0-9_]”。
    \xn 匹配n,其中n为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,“\x41”匹配“A”。“\x041”则等价于“\x04&1”。正则表达式中可以使用ASCII编码。.
    \num 匹配num,其中num是一个正整数。对所获取的匹配的引用。例如,“(.)\1”匹配两个连续的相同字符。
    \n 标识一个八进制转义值或一个向后引用。如果\n之前至少n个获取的子表达式,则n为向后引用。否则,如果n为八进制数字(0-7),则n为一个八进制转义值。
    \nm 标识一个八进制转义值或一个向后引用。如果\nm之前至少有nm个获得子表达式,则nm为向后引用。如果\nm之前至少有n个获取,则n为一个后跟文字m的向后引用。如果前面的条件都不满足,若n和m均为八进制数字(0-7),则\nm将匹配八进制转义值nm。
    \nml 如果n为八进制数字(0-3),且m和l均为八进制数字(0-7),则匹配八进制转义值nml。
    \un 匹配n,其中n是一个用四个十六进制数字表示的Unicode字符。例如,\u00A9匹配版权符号(©)。
  • 正则表达式 – 语法

    正则表达式是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为“元字符”)。模式描述在搜索文本时要匹配的一个或多个字符串。

    1.正则表达式基本语法

    两个特殊的符号’^’和’$’。他们的作用是分别指出一个字符串的开始和结束。例子如下:

    "^The":表示所有以"The"开始的字符串("There","The cat"等); "of despair$":表示所以以"of despair"结尾的字符串; "^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了; "notice":表示任何包含"notice"的字符串。

    象最后那个例子,如果你不使用两个特殊字符,你就在表示要查找的串在被查找串的任意部分——你并 不把它定位在某一个顶端。

    其它还有’*’,’+’和’?’这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或 更多”,“一次或更多”还有“没有或一次”。下面是几个例子:

    "ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……); "ab+":表示一个字符串有一个a后面跟着至少一个b或者更多; "ab?":表示一个字符串有一个a后面跟着零个或者一个b; "a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

    你也可以使用范围,用大括号括起,用以表示重复次数的范围。

    "ab{2}":表示一个字符串有一个a跟着2个b("abb"); "ab{2,}":表示一个字符串有一个a跟着至少2个b; "ab{3,5}":表示一个字符串有一个a跟着3到5个b。

    请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,’*’,’+’和 ‘?’相当于"{0,}","{1,}"和"{0,1}"。 还有一个’¦’,表示“或”操作:

    "hi¦hello":表示一个字符串里有"hi"或者"hello"; "(b¦cd)ef":表示"bef"或"cdef"; "(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

    ‘.’可以替代任何字符:

    "a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字; "^.{3}$":表示有任意三个字符的字符串(长度为3个字符);

    方括号表示某些字符允许在一个字符串中的某一特定位置出现:

    "[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b"); "[a-d]":表示一个字符串包含小写的’a’到’d’中的一个(相当于"a¦b¦c¦d"或者"[abcd]"); "^[a-zA-Z]":表示一个以字母开头的字符串; "[0-9]%":表示一个百分号前有一位的数字; ",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。

    你也可以在方括号里用’^’表示不希望出现的字符,’^’应在方括号里的第一位。(如:"%[^a-zA-Z]%"表 示两个百分号中不应该出现字母)。

    为了逐字表达,你必须在"^.$()¦*+?{\"这些字符前加上转移字符’\’。

    请注意在方括号中,不需要转义字符。

    2.正则表达式验证控制文本框的输入字符类型

    1.只能输入数字和英文的:

    <input onkeyup="value=value.replace(/[\W]/g,”) " onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))" ID="Text1" NAME="Text1">

    2.只能输入数字的:

    <input onkeyup="value=value.replace(/[^\d]/g,”) " onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\d]/g,”))" ID="Text2" NAME="Text2">

    3.只能输入全角的:

    <input onkeyup="value=value.replace(/[^\uFF00-\uFFFF]/g,”)" onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\uFF00-\uFFFF]/g,”))" ID="Text3" NAME="Text3">

    4.只能输入汉字的:

    <input onkeyup="value=value.replace(/[^\u4E00-\u9FA5]/g,”)" onbeforepaste="clipboardData.setData(‘text’,clipboardData.getData(‘text’).replace(/[^\u4E00-\u9FA5]/g,”))" ID="Text4" NAME="Text4">

    3.正则表达式的应用实例通俗说明


    //校验是否全由数字组成

    /^[0-9]{1,20}$/

    ^ 表示打头的字符要匹配紧跟^后面的规则

    $ 表示打头的字符要匹配紧靠$前面的规则

    [ ] 中的内容是可选字符集

    [0-9] 表示要求字符范围在0-9之间

    {1,20}表示数字字符串长度合法为1到20,即为[0-9]中的字符出现次数的范围是1到20次。 /^ 和 $/成对使用应该是表示要求整个字符串完全匹配定义的规则,而不是只匹配字符串中的一个子串。


    //校验登录名:只能输入5-20个以字母开头、可带数字、“_”、“.”的字串

    /^[a-zA-Z]{1}([a-zA-Z0-9]|[._]){4,19}$/

    ^[a-zA-Z]{1} 表示第一个字符要求是字母。

    ([a-zA-Z0-9]|[.]){4,19} 表示从第二位开始(因为它紧跟在上个表达式后面)的一个长度为4到9位的字符串,它要求是由大小写字母、数字或者特殊字符集[.]组成。


    //校验用户姓名:只能输入1-30个以字母开头的字串

    /^[a-zA-Z]{1,30}$/


    //校验密码:只能输入6-20个字母、数字、下划线

    /^(\w){6,20}$/

    \w:用于匹配字母,数字或下划线字符


    //校验普通电话、传真号码:可以“+”或数字开头,可含有“-” 和 “ ”

    /^[+]{0,1}(\d){1,3}[ ]?([-]?((\d)|[ ]){1,12})+$/

    \d:用于匹配从0到9的数字;

    “?”元字符规定其前导对象必须在目标对象中连续出现零次或一次

    可以匹配的字符串如:+123 -999 999 ; +123-999 999 ;123 999 999 ;+123 999999等


    //校验URL

    /^http[s]{0,1}:\/\/.+$/ 或 /^http[s]{0,1}:\/\/.{1,n}$/ (表示url串的长度为length(“https://”) + n )

    \ / :表示字符“/”。

    . 表示所有字符的集

    • 等同于{1,},就是1到正无穷吧。
  • 如何在Windows 10上用cmd批量重命名多个文件

    如何使用命令提示符重命名多个文件

    也可以使用 ren(或rename)命令来批量更改单个文件的名称以及多个文件和扩展名。

    使用以下步骤在所需的文件夹位置打开命令提示符,并使用要重命名的文件:

    1. 打开文件浏览器
    2. 浏览到包含要重命名的所有文件的文件夹。
    3. 在地址栏中,键入cmd并按Enter键
    1. 快速提示:您可以按照以下步骤将“在此处打开命令窗口”选项返回到Windows 10的上下文菜单。

    在文件夹位置,您可以使用 renrename命令以多种方式批量重命名文件:

    1. ren “old-filename.txt” “new-filename.txt”

    重命名单个文件

    要仅重命名一个文件,请使用以下命令语法并按 Enter键:命令语法示例:

    ren "215155.docx"
    "nutou66.com"

    值得注意的是,您可以在没有引号的情况下运行命令,但如果您尝试更改包含一个或多个空格的文件的名称,则需要它们。

    重命名多个文件

    要重命名多个文件,请使用此命令语法并按 Enter键

    ren .ext1 ???-new_filename_part.

    命令语法示例:

    ren .pptx ????-嘤嘤嘤.

    在命令语法示例中,星号(*)是一个通配符,它​​告诉 ren命令匹配.jpg扩展名的所有内容。问号(?)也是通配符,但它表示原始文件名的字符。因此,在语法中,我们使用三个问号,这意味着输出文件名将包含原始文件的前三个字符(作为唯一标识符以避免重复)以及您之后使用的任何名称问号。

    例如,如果您使用此命令语法重命名 弹头分享 .PPTX木头分享-呵呵哒.PPTX,则输出将如下所示:弹头分享-嘤嘤嘤.pptx木头分享-嘤嘤嘤.pptx

    使文件名更短

    如果您有一长串使用长名称的文件,并且只是想让它们更短,您可以使用以下命令语法:

    ren . ?????.*

    在命令语法示例中,星号(*)匹配文件夹中的所有文件名和扩展名,问号(?)表示用于文件名的字符数。在这种情况下,如果文件名少于五个字符,则名称不会更改。(如果要使文件名更长,请添加额外的问号。)

    更改文件名的一部分

    要重命名类似文件的部分文件名,请使用以下命令语法结构并按 Enter键

    ren old_filename_part. new_filename_part.

    命令语法示例:

    >ren 木头分享. 嘻嘻嘻.

    更改文件扩展名

    如果您有许多具有特定文件扩展名的文件,并且您想将其更改为另一个兼容的扩展名,则可以使用以下命令:

    ren .ext1 .ext2

    命令语法示例:

    ren .txt .doc

  • Minio文件镜像同步配置

    背景

    项目中由于会使用到minio对象存储,在需要满足项目多点灾备的情况下,记录下使用mirror和replicate来实现minio同步和镜像的相关功能,作为后续配置参考。

    mirror和replicate的区别

    mc mirror 用于在两个minio server中的桶之间进行数据同步。mc mirror 命令类似于 Unix rsync 命令,会对源和目标地址进行比较,并只将新增或修改的内容从源复制到目标,可以实现将源目录快速同步到目标目录。

    mc replicate 用于配置 Minio 服务器上的桶(replication rules)用于在区域间自动复制对象。这通常用于地理冗余和跨区域数据复制。最大的优势是在源桶和目标桶之间实现自动、异步的对象复制。

    1
    mc replicate add <source-bucket> --priority <arg> --remote-bucket <arg> --storage-class <value> --tags <value> --prefix <string> --arn <string>

    replicate配置

    两者的主要区别在于mc replicate 适用于设置自动跨区域复制规则,而 mc mirror 则更适合于手动的、一次性的数据迁移或备份。

    配置别名(源节点和备节点)

    alias主要的作用是方便好记,方便后续配置。

    1
    2
    3
    mc alias set minio-server http://10.8.40.1:9000 minio password --api s3v4 
    mc alias set minio-backup http://10.8.40.2:9000 minio password --api s3v4 
    mc alias ls

     

    创建bucket(源节点)

    1
    2
    3
    4
    mc mb -p minio-server/ucap 
    mc mb -p minio-backup/ucap 
    mc version enable minio-server/ucap 
    mc version enable minio-backup/ucap

    配置双向同步的主主复制(源节点)

    1
    2
    3
    4
    5
    #主节点上配置 
    mc replicate add --remote-bucket http://minio:password@10.8.40.2:9000/ucap --replicate "delete,delete-marker,existing-objects" --sync minio-server/ucap --limit-upload 200Mi  
    
    #备份节点配置-如果是灾备,只有执行1条即可。 
    mc replicate add --remote-bucket http://minio:password@10.8.40.1:9000/ucap --replicate "delete,delete-marker,existing-objects" --sync minio-backup/ucap --limit-upload 200Mi

    测试效果

    用以下方法测试在多点写入,是否都可以访问。

    1
    2
    3
    4
    5
    6
    mc cp /etc/hosts minio-server/ucap 
    mc cp /etc/alias minio-backup/ucap 
    curl http://10.8.40.1:9000/ucap/hosts 
    curl http://10.8.40.2:9000/ucap/hosts 
    curl http://10.8.40.1:9000/ucap/alias 
    curl http://10.8.40.2:9000/ucap/alias

     

    replicate相关状态查看

    命令 描述
    mc replicate add 添加服务器端复制配置规则
    mc replicate edit 修改现有的服务器端复制配置规则
    mc replicate ls 列出服务器端复制配置规则
    mc replicate status 显示服务器端复制状态
    mc replicate resync 重新复制所有以前复制的对象
    mc replicate export 导出服务器端复制配置
    mc replicate import 以 JSON 格式导入服务器端复制配置
    mc replicate rm 删除服务器端复制配置规则

    mirror后续再补…..

    mirror后续再补…..

  • NPS-比frp还简单易用的内网穿透及端口映射工具

    为什么要使用NPS

    1. 1. frp手动编写映射规则配置文件。nps在浏览器中可视化配置。
    2. 2. frp新增映射规则需要重启客户端。nps无需重启客户端,所有配置均在服务端进行配置立即生效。
    3. 3. frp需要手动设置开机自启。nps安装后自动注册到系统服务,随系统启动而启动。

    教程内容比较多,总体下来部署非常快,除去安装的过程需要命令操作安装完成后就完全脱离了终端操作。

    搭建教程

    客户端与服务端下载地址:https://github.com/ehang-io/nps/releases github镜像 下载地址 https://githubfast.com/ehang-io/nps/releases/ 一定要选择适合自己服务器内核的版本!一定要选择适合自己服务器内核的版本!一定要选择适合自己服务器内核的版本! 要是不知道自己的服务器是什么内核,linux用arch命令查看,显示aarch64 的就是arm64内核

    在Linux上搭建

    下载服务端文件

    mkdir nps && cd nps
    # 下载服务端
    wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_server.tar.gz
    # 解压
    tar -zxvf linux_amd64_server.tar.gz

    编辑配置文件

    vim conf/nps.conf

    常用配置:

    • • http_proxy_port:域名代理http代理监听端口。
    • • https_proxy_port:域名代理https代理监听端口。
    • • https_just_proxy:为false时仅代理https转发,为true则可以配置站点的ssl证书。
    • • web_port:web管理端口。
    • • web_username:web界面管理账号。
    • • web_password:web界面管理密码。

    安装服务端

    # 进行安装
    ./nps install
    # 启动nps
    nps start

    安装完成后,nps的配置文件会存放在 /etc/nps目录下。

    在windows上搭建

    下载服务端文件并存放解压:

    https://github.com/ehang-io/nps/releases/download/v0.26.10/windows_amd64_server.tar.gz

    编辑配置文件

    使用记事本或者你任意喜欢的文本编辑器编辑 conf/nps.conf文件,配置文件的内容与Linux中部署是一样的道理。

    安装服务端

    我们需要使用 管理员权限来运行cmd终端:

    640

    进入到存放 nps目录的地方执行命令安装:

    nps.exe install
    640-1

    如果跟我一样出现:

    load config file error the target config file: C:\Program Files\nps\conf\nps.conf don't exist

    相似的错误,只需要将 nps下的conf目录完整的拷贝至 C:\Program Files\nps\目录下,然后重新执行nps.exe install来安装,安装完成后使用以下命令来启动。

    # 需要使用管理员模式下的cmd执行启动
    net start nps

    访问web控制台

    通过访问 http://127.0.0.1:8080来进入到控制台登录界面,使用配置的web_usernameweb_password来进行登录。

    创建客户端

    一台需要映射的机器视作一个客户端,我们需要先在控台创建好客户端,才能对需要穿透的主机进行穿透。我们点击左侧的 客户端进入到客户端管理界面。点击新增客户端添加一个需要映射客户端的基本信息:

    640-2

    填写 备注基本就可以了,填写完成点击新增按钮即可添加成功,新增完会自动回到客户端列表,此时刷新即可看到新增的客户端:

    640
    1. 1. ID:id是用来区分主机的,胚子的域名绑定和端口映射都是跟id挂钩的。
    2. 2. 备注:用于方便区分不同的机器。
    3. 3. 版本:内网机器安装的客户端版本。
    4. 4. 唯一验证密钥:内网机器安装的客户端通过这个密码可以找到与平台挂钩的映射配置,唯一且只能被一个客户端引用。

    配置端口映射

    在每个客户端后面也就是右侧中有两个按钮,在 隧道中可以配置端口映射规则,进入到隧道我们新增一个隧道:

    640-1

    依次来看:

    1. 1. 模式:映射的端口走的什么协议,比如(TCP,UDP)等等。一般映射网站也可以使用TCP协议。
    2. 2. 客户端ID:这个映射规则被哪个客户端所使用,一般情况下也可以直接修改现有规则的客户端ID将规则移动到指定客户端下。
    3. 3. 备注:给自己看的,用于分别映射用途。
    4. 4. 服务端端口:即搭建NPS服务器的自身端口,不可重复使用同一个端口。
    5. 5. 目标(IP:端口):指内网客户端需要映射的端口,如(127.0.0.1:3389),也可以是内网其他机器如(192.168.1.100:3389)。

    点击下方 新增按钮即可立即生效。

    配置域名访问

    如果内网存在网站这种服务,想要使用域名访问内网的网站则可以配置 主机映射,同样的在客户单列表中选择指定的客户端右侧的主机按钮进入到域名配置页面,点击新增按钮:

    640

    继续来看每一个作用重复的内容不再赘述:

    1. 1. 主机:即需要是什么域名来访问咱们的服务,填写域名即可。
    2. 2. 模式:这里分(http、https)。
    3. 3. URL路由:则是区分不同的路由访问不同的服务类似nginx代理(http://a.com/a、http://a.com/b)。

    如果经常使用域名访问服务,还是比较推荐使用域名泛解析 *来解析道NPS服务器的IP上。

    安装客户端

    Linux上安装

    mkdir npc && cd npc
    wget https://github.com/ehang-io/nps/releases/download/v0.26.10/linux_amd64_client.tar.gz
    tar -zxvf linux_amd64_client.tar.gz
    # 安装命令
    ./npc install -server=127.0.0.1:8024 -vkey=8x95ia9d2zjwjvco -type=tcp
    # 启动客户端开始映射
    npc start
    1. 1. -server:这里是你NPS服务器的IP地址。
    2. 2. -vkey:是指定客户端的唯一验证密钥,即安装成功后可以看到当前客户端处于在线状态。

    windows上安装

    下载客户端文件并存放解压:

    https://github.com/ehang-io/nps/releases/download/v0.26.10/windows_amd64_client.tar.gz

    同理,以 管理员权限打开cmd进入存放客户单的目录下执行:

    # 安装命令
    npc.exe install -server=127.0.0.1:8024 -vkey=8x95ia9d2zjwjvco -type=tcp
    # 启动映射
    net start npc

    这里需要注意:在windwos上可能会被杀毒软件误杀,找回文件放入白名单即可。


    至此,所有的安装和配置过程均已结束。后面添加映射规则只需要前往 web控制台操作即可,每一条规则添加完成后都是立即生效的无需重启任何服务。服务端和客户端如若出现电脑重启的情况也没关系,等系统启动后映射服务会自动启动,无需担心穿透失联。

  • 畅网微控 X86-P1软路由N3160迷你主机 如何安装系统

    畅网微控 X86-P1软路由N3160迷你主机 如何安装系统

    第一步:制作U盘启动 下载安装 Ventoy ,注意 分区类型选择:GPT

    58d00a39c003d340d585cbfc8f641ca4

    下载地址:https://github.com/ventoy/Ventoy/releases/download/v1.0.99/ventoy-1.0.99-windows.zip

    第二步:制作完成把相应的系统iso镜像拷贝到U盘

    5bbf07f8e61574783b012a8eeca05a2a

    第三步:启动主机 ,按 F11  进入选择启动引导页面,

    4884121aa5b58ca3c2bdb467ad7fe3f6
  • jq 元素绑定事件重复

    在使用 jQuery (jq 是 jQuery 的简写) 为元素绑定事件时,如果不注意,可能会遇到事件重复绑定的问题。这意味着每次代码执行时,都会向元素添加一个新的事件监听器,而不是替换之前的事件监听器。这会导致事件被触发多次,每次触发都会执行相同的事件处理函数,次数等于它被绑定的次数。

    例如,如果你有以下代码:

    javascriptCopy Code
    $('#myButton').click(function() { alert('Button clicked!'); });

    每次这段代码执行时(可能在某个函数内,该函数被多次调用),click 事件都会被再次绑定到 #myButton 元素上。如果用户点击按钮,alert 会显示多次,具体次数取决于 click 事件被绑定的次数。

    为了避免这种情况,可以使用 .off() 方法来先移除之前绑定的事件,然后再绑定新的事件:

    javascriptCopy Code
    $('#myButton').off('click').click(function() { alert('Button clicked!'); });

    这样,每次执行代码时,都会先移除 #myButton 上的 click 事件(如果它存在),然后再绑定新的事件处理函数。这样,无论代码执行多少次,点击按钮时只会触发一次 alert

    如果你正在使用 jQuery 的 .on() 方法来绑定事件,同样可以使用 .off() 方法来避免重复绑定。.on() 方法是一个非常强大的事件绑定方法,它允许你绑定事件到当前或未来的元素上(通过选择器)。

    javascriptCopy Code
    $('#myButton').off('click').on('click', function() { alert('Button clicked!'); });

    通过这种方式,你可以有效地管理 jQuery 事件绑定,避免重复绑定导致的问题。

  • linux 无法删除文件解决办法

    Linux下如何强制删除文件

    在Linux系统中,有时候我们可能遇到无法正常删除文件的情况。这可能是因为文件被其他进程锁定、权限问题或文件系统损坏等原因。在这种情况下,我们可以使用一些强制删除文件的方法来解决问题。 以下是几种常见的强制删除文件的方法:
    [root@new-home 103]# rm -f base-103-disk-0.raw 
    rm: 无法删除"base-103-disk-0.raw": 不允许的操作
    1. 使用rm命令 rm命令是Linux下用于删除文件或目录的命令,但默认情况下它不会删除只读文件或目录。要强制删除文件,可以使用”-f”选项。例如:
      rm -f filename
      ```
      
      这将强制删除名为"filename"的文件,即使它是只读文件或目录。
      
      
    2. 使用chattr命令 chattr命令用于更改文件的属性。我们可以使用chattr命令将文件属性更改为可写,并随后使用rm命令删除文件。以下是具体步骤: 首先,使用chattr命令将文件属性更改为可写:
      chattr -i filename
      ```
      
      然后,使用rm命令删除文件:
      
      
      rm filename