有用的shell脚本记录

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值