1. 每一秒钟,打印一次内存
cat watch_free.sh
#!/bin/bash
while [ true ]
do
/usr/bin/sleep 1
/usr/bin/free
done
2. 同步2个目录命令, 注意,是把源目录下文件向目标目录同步,只要不同就覆盖目标目录的东西,并不管时间戳. 目标目录可以比源目录文件个数多. 这是rsync 的做法.
简化成sh 脚本, 省掉输入源目录的操作.
cat sync.sh
#!/usr/bin/bash
#-P选项非常有用
# -P: same as --partial --progress, 第一个选项允许断点续传和增量传输, 第二个选项是用来显示传输进度条,
# a 归档模式, 代表同步所有,包括修改时间、群组、权限、特殊文件、也包括递归
# v verbose
# z 带压缩, 对于一些小文件, 压缩一下再传输效率更高.
rsync -avzP hjj@192.168.6.102:/home/hjj/ZGHT/multiview/ .
rsync 命令还可以用--include 过滤文件,只同步我们感兴趣的文件, 例如只同步*.cpp *.h文件
可使用用如下格式:
rsync -avzP --include="*.h" --include="*.cpp" --exclude="*" . root@192.168.6.50:/tmp/diskmanage
注意: 用--include="*.h *.cpp" 这种连写的方法是不行的, 如果想调试这条命令,可以加-v 选项
rsync -v (还可以加-vv -vvv增加更多的打印输出,一般-v 就够用了.)
rsync 在命令行中使用
––include-from=FILE 或 ––exclude-from=FILE 读取规则文件。
其中前者是匹配的要包含, 而后者是匹配的要不包含.
规则文件 FILE 的书写约定:
每行书写一条规则 RULE
以 # 或 ; 开始的行为注释行
包含(include)和排除(exclude)规则的语法如下:
include PATTERN 或简写为 + PATTERN
exclude PATTERN 或简写为 - PATTERN
举例:
# 不传输所有后缀为 .o 的文件
- *.o
# 不传输根目录下名为 foo 的文件或目录
- /foo
# 不传输名为 foo 的目录
- foo/
# 不传输 /foo 目录下的名为 bar 的文件或目录
- /foo/bar
例2:
# 传输所有目录,传输所有C语言源文件并禁止传输其他文件
+ */
+ *.c
- *
例3:
# 仅传输 foo 目录和其下的 bar.c 文件
+ foo/
+ foo/bar.c
- *
例4:
# 传输 foo 目录及其子目录下所有东西
+ foo/**
这些太细了,对于c/c++ 而言, 一般*.h,*.c,*.cpp 就差不多了,其它一般变化少
如果只想包含特定文件,则首先需要包含那些特定文件,然后排除所有其他文件:这是rsync 的执行过程.
可以用-v 选项调试
附上我的一个具体实例,两个目录之间互相同步, 背景是A机器,B机器都可能改变源文件(.c.cpp.h)文件, A机器不能连上git 服务器(git服务器在外网), B机器能连上git服务器(这时候需要更换ip), 所以就有了如下的特殊的文件同步要求.
A机器向B机器不要推送.git 目录,A机器可以向B机器同步.c,.cpp,.h 文件
# cat sync.sh
#!/bin/bash
rsync -avzP --include-from LIST . hjj@192.168.6.51:/home/hjj/multiview
[root@50 /home/zght/multiview]# cat LIST
#不包含.git 目录
- .git/
#包含所有目录
+ */
#不包含所有以moc_开始的文件
- moc_*
#包含所有c文件
+ *.c
#包含所有cpp文件
+ *.cpp
#包含所有h文件
+ *.h
#不包含其它
- *
B机器可以向A机器同步.c,.cpp,.h文件, 还要同步推送.git 目录下文件, .git 目录是单向的,只能B向A推
$ cat sync.sh
#!/bin/bash
rsync -avzP --include-from LIST . root@192.168.6.50:/home/zght/multiview
hjj@hjj-u7090:~/multiview$ cat LIST
#包含.git 目录及其子目录下所有东西
+ .git/**
#包含所有目录
+ */
#不包含所有以moc_开始的文件
- moc_*
#包含所有c文件
+ *.c
#包含所有cpp文件
+ *.cpp
#包含所有h文件
+ *.h
#不包含其它
- *
3. ffplay 指定位置和大小播放视频脚本文件
#!/bin/bash
# ffplay 指定窗口位置及大小播放程序, 供测试比较用
# 其中参数 -left -top 指定位置, -x -y 指定寬高
if [ $# -lt 2 ]
then
echo "Usage: $0 <row> <col>"
exit 1
fi
row=$1
col=$2
echo $row $col
let width=1920/$col
let height=1080/$row
url=udp://239.1.100.48:10011
for (( i=0; i<$row; i++ ))
do
for (( j=0; j<$col; j++ ))
do
echo $i $j
let left=$j*$width
let top=$i*$height
echo left=$left top=$top
ffplay -i $url -left $left -top $top -x $width -y $height &
done
done
4. 批量后缀文件改名,例如将*.txt 改成*.c
$ for var in `ls *.txt`;do mv $var ${var/.txt/.c};done
显示一下脚本编写的魅力.
#####################################################
5. 每5分钟打印一次时间,top内存使用情况,总内存使用情况.
#####################################################
用 crontab -e 添加如下入口: 实现每5分钟执行一次run.sh脚本
*/5 * * * * /root/run.sh
*/5 就是每5分钟执行一次后面的脚本.
/root/run.sh 脚本具体内容如下:
# cat /root/run.sh
#/bin/bash
date >> /tmp/1.log
echo "==================================================================================" >> /tmp/1.log
top -bn 1 -o %MEM |sed -n '7,37p' >> /tmp/1.log
free -h >> /tmp/1.log
echo "==================================================================================" >> /tmp/1.log
于是在/tmp/1.log 中将记录内存使用情况.
另说明top 的命令行使用说明.
-b 是批量模式, 与不带b的视觉区别是不带高亮,在屏幕上滚动.可理解为命令行模式.
-n 1 指明只打印一次即停止.
-o %MEM 是按内存使用率来排序.
sed -n '7,37p' 是为了跳过top 的台头,直接从进程条目开始打印,并且只选择打印了前30行
>> /tmp/1.log 是把输出追加到 /tmp/1.log 文件.
#####################################################
# 6. 读configure 文件 获取的sed 命令的使用
#####################################################
#!/bin/bash
ac_log="
This file was extended by FULL-PACKAGE-NAME $as_me VERSION, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
CONFIG_HEADERS = $CONFIG_HEADERS
CONFIG_LINKS = $CONFIG_LINKS
CONFIG_COMMANDS = $CONFIG_COMMANDS
$ $0 $@
on `(hostname || uname -n) 2>/dev/null | sed 1q`
"
as_me=`basename -- "$0" `
as_echo='printf %s\n'
{
echo # 打印一个空行
# sed 命令是脚本的关键
# h, hold,保持模式空间
# s, search replace
# p, 打印模式空间,即在行后插入
# x, 将模式空间和保留空间交换, x;p;x的意思是在行之前插入一行
# p;x;p;x 在行后及行前均插入了一行
sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX
## hahaha ... Running $as_me. ##
_ASBOX
$as_echo "$ac_log"
}
#整体运行结果, 添加了一个台头的box, 在shell 下 box 是很整齐的, csdn 下对不齐了, @^@
$ ./1.sh
## ------------------------ ##
## hahaha ... Running 1.sh. ##
## ------------------------ ##
This file was extended by FULL-PACKAGE-NAME VERSION, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES =
CONFIG_HEADERS =
CONFIG_LINKS =
CONFIG_COMMANDS =
$ ./1.sh
on hjj-u7090