1.恢复时 gitlab 版本应与备份时版本一致

2.默认卸载不完全,最好同时删除以下目录


# 同时删除备份目录,注意将备份文件保存至别处,/etc/gitlab/目录最好也备份下

rm -r /opt/gitlab/sv /opt/gitlab/service /opt/gitlab/init /opt/gitlab/etc /opt/gitlab/embedded/ssl/certs /opt/gitlab/embedded/service/gitlab-shell /opt/gitlab/embedded/service/gitlab-rails/public /opt/gitlab/embedded/service/gitlab-rails/config/initializers /opt/gitlab/embedded/cookbooks /var/opt/gitlab /opt/gitlab /etc/gitlab

# 删除 systemd 启动文件,否则安装新版本后执行 gitlab-ctl reconfigure 会卡住

rm /usr/lib/systemd/system/gitlab-runsvdir.service

3. gitlab 恢复后如果进入项目 返回500错误,db_key_base 问题,将之前的 /etc/gitlab/gitlab-secrets.json 文件拿过来替换(最好备份时一同备份),然后执行 gitlab-ctl reconfigure

迅雷是越来越不能用了,卸了好多次又装,这次是终于下决心不再用了,年费超级会员就当白扔了,祝早亡。

作为替代的下载工具,qbittorrent 着实不错,代码开源,一般的做种功能就不说了。有 Web UI,可根据 Client IP 设定白名单免密码访问,觉得原版 Web UI 丑的话,甚至可以替换成自己的 Web UI,支持动态域名,提供 WebAPI,支持导入 TLS 证书,支持RSS订阅,下载完成后可以电子邮件通知,也可执行外部程序(这里我使用windows 局域网通知功能),另外Wiki 也很详细。作为 NAS 上的下载工具非常不错。

qbittorrent 支持导入外部 Tracker 功能,玩BT下载的都知道 Tracker 的重要性,但是 Tracker 地址的维护却一直是个问题,Github 上一直在维护的的 trackerslist 数目终归是太少。

想要提高下载速度,只能自己维护了。

于是自己写了个 Tracker 维护脚本,通过遍历目录下的 Torrent 文件,提取出 Tracker 地址,做连通性测试,记录有效的地址到 txt 文件中,然后去重。

代码不多,100来行,做了多线程优化,速度也还行。放在了 Github 上。

可惜的是 qbittorrent 本身的 API 不支持永久导入 Tracker 功能,只能手动,也不支持插件的方式来实现,目前只支持搜索功能的插件,当然因为开源的原因,可以理解。

当然也不是没办法,配置文件是明文,可以通过替换特定行的方式来实现,以后再说了。

 

原 E5 双路,E7 系列:铂金(Platinum)、金(Gold)、银(Silver)、铜(Bronze)。

第一位数字:8(铂金)、6/5(黄金)、4(白银)、3(青铜)

第二位数字:代表第N代

第三四位数字:具体 SKU(库存单位)编号

第五位字母后缀:

F : Fabric;集成Intel OmniPath Fabric

T :高 Tcase/扩展可靠性;

M :每 CPU 插槽支持 1.5TB 内存容量,无则为 768GB

P:采用 FPGA 封装

E5 单路,为工作站用途,命名为 Xeon W

E3 命名为 XEON E 代表Entry,入门级工作站处理器

原 Xeon D 保持不变

 

之前用的是斐讯K2路由器刷了LEDE固件,做无线AP。

但是WAN口和LAN口都是百兆,平时通过无线传个视频什么的也太慢了。

忍无可忍,最终下单了小米路由器3G。

看硬件应该也够用了。

然后就是考虑固件的事了,原厂固件什么的从不考虑,而且小米的原厂固件功能少得可怜。

LEDE 并入了OpenWrt,现在 18.06 在开发中,17.04 进入维护期,正是青黄不接的时候,小米路由器3G只有snapshot版,而且居然有4个包,还有一个tar包,这蛋疼的。

各固件对比了一下,最终决定刷 Padavan 固件。

Padavan 官方现在不再提供编译好的固件,好在支持MTK的7620和7621,自己做了一下适配,开源在 Github 上了。

 

编译方法 Github 上已经提供了,这里给出刷 breed 及固件的方法。

  1. 官网下载开发版固件,在路由器web页面上刷入。
  2. 登陆小米账号,绑定账号,并下载ssh工具包,刷入方法官方有说明。
  3. 备份数据
    cat /proc/mtd
    dev: size erasesize name
    mtd0: 07f80000 00020000 "ALL"
    mtd1: 00080000 00020000 "Bootloader"
    mtd2: 00040000 00020000 "Config"
    mtd3: 00040000 00020000 "Bdata"
    mtd4: 00040000 00020000 "Factory"
    mtd5: 00040000 00020000 "crash"
    mtd6: 00040000 00020000 "crash_syslog"
    mtd7: 00040000 00020000 "reserved0"
    mtd8: 00400000 00020000 "kernel0"
    mtd9: 00400000 00020000 "kernel1"
    mtd10: 02000000 00020000 "rootfs0"
    mtd11: 02000000 00020000 "rootfs1"
    mtd12: 03580000 00020000 "overlay"
    mtd13: 012a6000 0001f000 "ubi_rootfs"
    mtd14: 030ec000 0001f000 "data"
    
    #!/bin/bash
    dd if=/dev/mtd0 of=/extdisks/sda4/ALL.bin
    dd if=/dev/mtd1 of=/extdisks/sda4/Bootloader.bin
    dd if=/dev/mtd2 of=/extdisks/sda4/Config.bin
    dd if=/dev/mtd3 of=/extdisks/sda4/Bdata.bin
    dd if=/dev/mtd4 of=/extdisks/sda4/Factory.bin
    dd if=/dev/mtd5 of=/extdisks/sda4/crash.bin
    dd if=/dev/mtd6 of=/extdisks/sda4/crash_syslog.bin
    dd if=/dev/mtd7 of=/extdisks/sda4/reserved0.bin
    dd if=/dev/mtd8 of=/extdisks/sda4/kernel0.bin
    dd if=/dev/mtd9 of=/extdisks/sda4/kernel1.bin
    dd if=/dev/mtd10 of=/extdisks/sda4/rootfs0.bin
    dd if=/dev/mtd11 of=/extdisks/sda4/rootfs1.bin
    dd if=/dev/mtd12 of=/extdisks/sda4/overlay.bin
    dd if=/dev/mtd13 of=/extdisks/sda4/ubi_rootfs.bin
    dd if=/dev/mtd14 of=/extdisks/sda4/data.bin
    

    备份到最后一个mtd14可以会出现如下出错提示: dd: can't open '/dev/mtd14': Device or resource busy

    该分区备份不成功无所谓,关键的mtd0-mtd4备份下来就行了。

  4. 如需恢复
    mtd write /extdisks/sda4/Bootloader.bin Bootloader
    mtd write /extdisks/sda4/Config.bin Config
    mtd write /extdisks/sda4/Bdata.bin Bdata
    mtd write /extdisks/sda4/Factory.bin Factory
    mtd write /extdisks/sda4/crash.bin crash
    mtd write /extdisks/sda4/crash_syslog.bin crash_syslog
    mtd write /extdisks/sda4/reserved0.bin reserved0
    mtd write /extdisks/sda4/kernel0.bin kernel0
    mtd write /extdisks/sda4/kernel1.bin kernel1
    mtd write /extdisks/sda4/rootfs0.bin rootfs0
    mtd write /extdisks/sda4/rootfs1.bin rootfs1
    mtd write /extdisks/sda4/overlay.bin overlay
    mtd write /extdisks/sda4/ubi_rootfs.bin ubi_rootfs
    mtd write /extdisks/sda4/data.bin data
    
  5. 刷入breed

    上传breed固件:breed-mt7621-xiaomi-r3g.bin

    mtd write breed-mt7621-xiaomi-r3g.bin Bootloader

    刷入后重启路由器

    breed 控制台网关:192.168.1.1

    路由器接入有线,电脑手动设置IP:19.2.68.1.X

    按住reset键的同时开机,路由器LED疯狂闪烁时松开reset键,访问 192.168.1.1 web控制台

  6. 在 breed 内更新固件,也可在 breed 内再备份一次,恢复时更方便

NAS一直没有做备份

当初考虑成本、安全与性能,没有组RAID,只对重要文件做备份

然而一直没有找到好用的备份软件,就此搁置了。

最近用了FastCopy ,支持命令行,就打算用此做下备份。考虑定时备份,使用 Windows 计划任务来实现。

以下为脚本,执行一次后就不用管了

cmd版


@echo off

schtasks /Query /tn AutoBackup

if not {%errorlevel%} == {0} SCHTASKS /Create /TN AutoBackup /TR "'C:\Program Files\FastCopy\FastCopy64.exe' /cmd=diff /verify /auto_close /speed=autoslow 'D:\软件' 'D:\图片' 'D:\文档' 'D:\歌曲' /to='E:\BACKUP'" /SC WEEKLY /D SAT /ST 02:05:00

echo 按任意键退出
pause 
exit 

PowerShell版


# $src:要备份的文件(夹),$dst:备份存储路径

$src='D:\软件','D:\图片','D:\文档','D:\歌曲'
$dst='E:\BACKUP'

echo 检测任务是否已注册
schtasks /Query /tn AutoBackup

if ($? -eq 0) {
SCHTASKS /Create /TN AutoBackup /TR "'C:\Program Files\FastCopy\FastCopy64.exe' /cmd=diff /verify /auto_close /speed=autoslow $src /to=$dst" /SC WEEKLY /D SAT /ST 02:05:00
}
elseif ($? -eq 1) {
echo 任务已注册
SCHTASKS /Create /TN AutoBackup /TR "'C:\Program Files\FastCopy\FastCopy64.exe' /cmd=diff /verify /auto_close /speed=autoslow $src /to=$dst" /SC WEEKLY /D SAT /ST 02:05:00
}

echo 注册完成,按任意键退出
cmd /c "pause"
exit

最近又折腾了下自用的esxi服务器,记录下

最近搬家,esxi机器搬过来后,一虚拟机不能启动,提示硬盘空间不足,情急之下又插上一块SSD,增加存储空间才得以开机。

开机后发现一软件的日志文件居然有90+GB大小,始料未及,清除后虚拟机剩余可用空间并未回收(精简制备),执行命令手动空间回收。


esxcli storage vmfs unmap -u 5ad5cfdc-0106ea44-5a30-c860008c9329
vmkfstools -K Dev-Server.vmdk

然后把 ESXI 从 6.5 升级到了 6.7,数据存储由 VMFS 5 升级到了 VMFS 6 ,VMFS 6 是 vSphere 6.5 的新文件系统。该新文件系统支持 512e 高级格式化驱动器,并且采用 4098 扇区 (4K) 对齐。它还支持自动 UNMAP,其异步跟踪已释放的块并在后台将 UNMAP 发送到后端存储。

简单来说,就是支持了 4K 对齐,这对我本来就是 SSD 的情况来说性能会有明显提升,而且支持后台异步回收空间。

 

iptables现如今非常流行,使用范围也非常广泛,一般用途的防火墙,以iptables的端口转发和IP伪装为基础开发的LVS负载均衡;以NAT为基础的路由器网关等等。
但是,iptables却不是没有缺点的,大量的iptables规则会拖慢速度,更改一个规则可能需要重载所有的规则,于是便有了nf-HiPAC和ipset,保证效率

另外,iptables 也不能算得上是一款现代意义上的防火墙,设计之初并没有考虑不同的场景下需要加载不同的规则,比如公共场所,家里,和办公室等,

相比之下,类似的概念从 win7 时代的防火墙就有了,(win7的正式发布时间是2009年)

firewalld,考虑到了 iptables 这些问题,整合了iptables、ip6tables、ipset,加入了区域的概念,使其成为了一款现代意义上的防火墙。

但是,firewalld 并不属于新一代防火墙,只能算是 iptables 的衍生品,因为其核心仍旧基于iptables。真正的下一代防火墙是 nftables,关于 nftables 超出了本文的内容,略过不谈。

 

firewalld有图形化的的 firewall-config 工具,也有命令行工具 firewall-cmd。

firewalld 是动态防火墙,而非静态的。改变防火墙规则后,所有部分并不需要都重新加载。提供临时和永久两种状态,临时状态即刻生效,永久状态需重载防火墙,实际上是重新加载改变的部分,这也是动态防火墙的由来。

firewalld引入了区域和服务的概念,区域是为了应对不同的场景,服务是为了便于直观的理解

区域分为以下几种:

drop(丢弃)
任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
block(限制)
任何接收的网络连接都被 IPv4 的 icmp-host-prohibited 信息和 IPv6 的 icmp6-adm-prohibited 信息所拒绝。
public(公共)
在公共区域内使用,不能相信网络内的其他计算机不会对您的计算机造成危害,只能接收经过选取的连接。
external(外部)
特别是为路由器启用了伪装功能的外部网。您不能信任来自网络的其他计算,不能相信它们不会对您的计算机造成危害,只能接收经过选择的连接。
dmz(非军事区)
用于您的非军事区内的电脑,此区域内可公开访问,可以有限地进入您的内部网络,仅仅接收经过选择的连接。
work(工作)
用于工作区。您可以基本相信网络内的其他电脑不会危害您的电脑。仅仅接收经过选择的连接。
home(家庭)
用于家庭网络。您可以基本信任网络内的其他计算机不会危害您的计算机。仅仅接收经过选择的连接。
internal(内部)
用于内部网络。您可以基本上信任网络内的其他计算机不会威胁您的计算机。仅仅接受经过选择的连接。
trusted(信任)
可接受所有的网络连接。
firewalld 初始 默认区域为 public。
由于不同的区域概念,你可以预设每个区域的规则,开放的服务,端口等等,和 wifi 的 SSID 及有线的网络进行绑定。比如,你连上咖啡厅的wifi,或是家中的wifi,防火墙会自动切换为 public 或 home。相当方便。(使用 NetworkManager 可以实现,其它网络管理程序如 networkd 是否支持不太清楚)

 


#查看 firewalld 状态
firewall-cmd --state
#查看当前规则
firewall-cmd --list-all #这一项包含了以下四项
################################
#查看当前激活的区域
firewall-cmd --get-active-zones
#查看开放的端口
firewall-cmd --list-ports
#查看开放的服务
firewall-cmd --list-services
#查看当前的富规则
firewall-cmd --list-rich-rules
###############################

##########区域##########
#查看默认区域
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone=public # 设置默认区域为public
#查看激活的区域
firewall-cmd --get-active-zones
#查看预定义的区域
firewall-cmd --get-zones
#查看网卡所在区域
firewall-cmd --get-zone-of-interface=eno33
#查看所有区域当前的状态
firewall-cmd --list-all-zones
#获取区域的target(同iptables的target)
firewall-cmd --get-target
firewall-cmd --set-target=ACCEPT|DROP|REJECT
#查看指定区域的状态
firewall-cmd --info-zone=public
#为网卡指定区域
firewall-cmd --zone=trusted --add-interface=eno33
firewall-cmd --zone=public --add-interface=eno33
#改变网卡的所属区域
firewall-cmd --zone=home --change-interface=eno33


##########添加端口##########
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --permanent --zone=public --add-port=100-500/tcp --permanent
#查询端口是否被加入到当前规则
firewall-cmd --query-port=100-500/tcp --permanent
#删除端口
firewall-cmd --zone=public --remove-port=3306/tcp --permanent
firewall-cmd --zone=public --remove-port=100-500/tcp --permanent


##########服务##########
#查看当前区域启用的服务
firewall-cmd --list-services
#查看预定义的服务
firewall-cmd --get-services
#添加服务
firewall-cmd --add-service=http
# 查看http是否属于默认区域
firewall-cmd --query-service=http
#删除服务
firewall-cmd --query-service=ssh


##########富规则##########
#列出富规则
firewall-cmd --list-rich-rules
#添加富规则
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept" #为 114.114.114.0/28 开放全部端口
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="114.114.114.114" port port="80" protocol="tcp" accept" # 为指定IP开放指定端口,指定协议为TCP
#删除富规则
firewall-cmd --zone=public --permanent --remove-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept"
#查询富规则
firewall-cmd --zone=public --permanent --query-rich-rule="rule family="ipv4" source address="114.114.114.0/28" accept"


##########重启##########
firewall-cmd --reload
firewall-cmd --complete-reload #彻底重启(丢掉现有连接)

##########其它实用规则##########
#防暴力破解
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 0 -p tcp --dport 22 -m state --state NEW -m recent --set
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT_direct 1 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 30 --hitcount 4 -j REJECT --reject-with tcp-reset
firewall-cmd --reload

 

相关链接:https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/7/html/security_guide/sec-using_firewalls#sec-Introduction_to_firewalld

redis

redis-trib 用法:

Usage: redis-trib <command> <options> <arguments ...>

  create       host1:port1 ... hostN:portN
               --replicas <arg>
  check        host:port
  info         host:port
  fix          host:port
               --timeout <arg>
  reshard      host:port
               --from <arg>
               --to <arg>
               --slots <arg>
               --yes
               --timeout <arg>
               --pipeline <arg>
  rebalance    host:port
               --weight <arg>
               --auto-weights
               --use-empty-masters
               --timeout <arg>
               --simulate
               --pipeline <arg>
               --threshold <arg>
  add-node     new_host:new_port existing_host:existing_port
               --slave
               --master-id <arg>
  del-node     host:port node_id
 set-timeout   host:port milliseconds
 call          host:port command arg arg .. arg
  import       host:port
               --from <arg>
               --copy
               --replace
  help         (show this help)

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

#初始化:
./redis-trib.rb create --replicas 1 127.0.0.1:6391 127.0.0.1:6392 127.0.0.1:6393 127.0.0.1:6394 127.0.0.1:6395 127.0.0.1:6396

#状态检查:

redis-trib.rb check 127.0.0.1:6379

#redis-cli 用法:

redis-cli 3.2.9

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  -h <hostname>        Server hostname (default: 127.0.0.1).
  -p <port>            Server port (default: 6379).
  -s <socket>          Server socket (overrides hostname and port).
  -a <password>        Password to use when connecting to the server.
  -r <repeat>          Execute specified command N times.
  -i <interval>        When -r is used, waits <interval> seconds per command.
                       It is possible to specify sub-second times like -i 0.1.
  -n <db>              Database number.
  -x                   Read last argument from STDIN.
  -d <delimiter>       Multi-bulk delimiter in for raw formatting (default: \n).
  -c                   Enable cluster mode (follow -ASK and -MOVED redirections).
  --raw                Use raw formatting for replies (default when STDOUT is
                       not a tty).
  --no-raw             Force formatted output even when STDOUT is not a tty.
  --csv                Output in CSV format.
  --stat               Print rolling stats about server: mem, clients, ...
  --latency            Enter a special mode continuously sampling latency.
  --latency-history    Like --latency but tracking latency changes over time.
                       Default time interval is 15 sec. Change it using -i.
  --latency-dist       Shows latency as a spectrum, requires xterm 256 colors.
                       Default time interval is 1 sec. Change it using -i.
  --lru-test <keys>    Simulate a cache workload with an 80-20 distribution.
  --slave              Simulate a slave showing commands received from the master.
  --rdb <filename>     Transfer an RDB dump from remote server to local file.
  --pipe               Transfer raw Redis protocol from stdin to server.
  --pipe-timeout <n>   In --pipe mode, abort with error if after sending all data.
                       no reply is received within <n> seconds.
                       Default timeout: 30. Use 0 to wait forever.
  --bigkeys            Sample Redis keys looking for big keys.
  --scan               List all keys using the SCAN command.
  --pattern <pat>      Useful with --scan to specify a SCAN pattern.
  --intrinsic-latency <sec> Run a test to measure intrinsic system latency.
                       The test will run for the specified amount of seconds.
  --eval <file>        Send an EVAL command using the Lua script at <file>.
  --ldb                Used with --eval enable the Redis Lua debugger.
  --ldb-sync-mode      Like --ldb but uses the synchronous Lua debugger, in
                       this mode the server is blocked and script changes are
                       are not rolled back from the server memory.
  --help               Output this help and exit.
  --version            Output version and exit.

Examples:
  cat /etc/passwd | redis-cli -x set mypasswd
  redis-cli get mypasswd
  redis-cli -r 100 lpush mylist x
  redis-cli -r 100 -i 1 info | grep used_memory_human:
  redis-cli --eval myscript.lua key1 key2 , arg1 arg2 arg3
  redis-cli --scan --pattern '*:12345*'

  (Note: when using --eval the comma separates KEYS[] from ARGV[] items)

When no command is given, redis-cli starts in interactive mode.
Type "help" in interactive mode for information on available commands
and settings.

#连接集群:
redis-cli -c -h 127.0.0.1 -p 6391

#添加节点:(假设进程已启动)
./redis-trib.rb add-node 127.0.0.1:6397 127.0.0.1:6390 #添加一个节点(默认为主节点)

./redis-trib.rb check 127.0.0.1:6390 #检查状态,为的是获取新节点的id

./redis-trib.rb add-node --slave --master-id 63ec1e7d57b3e19c6e1fa07768673001cfa0d30f 127.0.0.1:8380 127.0.0.1:6379 #为刚添加的直接点添加从节点,注意--master-id

./redis-trib.rb add-node --slave 127.0.0.1:6398 127.0.0.1:6390 #从节点的另一种添加方式,注:这种方式是随机找到从节点较少的主节点,为此节点添加从节点,所以具有随机性

#删除一个节点:
./redis-trib.rb del-node 172.16.1.1:6390 12decfd0d975ef0dcd151d0ff232da7a2269a1c2 #从节点可以直接删除,但主节点需要将slots移到其它节点,然后再删除

#重新分片:
./redis-trib.rb reshard 127.0.0.1:6390 #交互式进行,需要手动指定为新节点分配多少slots

./redis-trib.rb reshard <host>:<port> --from <node-id> --to <node-id> --slots <args> --yes #非交互式

另附:
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
CLUSTER RESET reset
CLUSTER SAVECONFIG 强制节点保存集群当前状态到磁盘上。
CLUSTER SLOTS 获得slot在节点上的映射关系

CLUSTER MEET ip port 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET node_id 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE node_id 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SLAVES node_id 列出该slave节点的master节点

CLUSTER ADDSLOTS slot [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS slot [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT slot NODE node_id 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽,然后再进行指派。
CLUSTER SETSLOT slot MIGRATING node_id 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT slot IMPORTING node_id 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT slot STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。

CLUSTER KEYSLOT key 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT slot 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT slot count 返回 count 个 slot 槽中的键

READONLY 在集群中的salve节点开启只读模式
READWRITE 禁止读取请求跳转到集群中的salve节点上

参考:
https://my.oschina.net/guol/blog/506193
http://www.redis.cn/topics/cluster-tutorial.html

首先建立随机文件


#!/bin/bash

for i in {1..10000}
do
touch $(head -1 /dev/urandom | md5sum | cut -d ' ' -f 1).qas
done

1.rename

这里使用rename

rename 's/\.qas$/\.qwer' *.qas

效率最高,执行命令后,一万个文件几乎没有延迟,瞬间完成
使用time命令检测耗时:

rename 's/\.qas$/\.qwer/' *.qas 0.10s user 0.10s system 99% cpu 0.198 total

2.find命令

find . -type f -name "*.qas" | sed 's/.qas//g' | xargs -i mv {}.qas {}.qwer

耗时:


find . -type f -name "*.qas" 0.02s user 0.02s system 0% cpu 6.509 total
sed 's/.qas//g' 0.02s user 0.00s system 0% cpu 8.484 total
xargs -i mv {}.qas {}.qwer 7.69s user 2.40s system 99% cpu 10.157 total

3.shell脚本


#!/bin/bash

for i in $(ls -1)
do
first_name=$(echo $i | cut -d '.' -f 1)
last_name=$(echo $i | cut -d '.' -f 2)
if [[ $last_name == "qas" ]]
then
mv ${first_name}.qas ${first_name}.qwer
fi
done

耗时:

./changename.sh 28.95s user 5.73s system 115% cpu 30.017 total