加载配置/定义/文件
将函数或者变量替换定义在一个文件中,如函数可以定义在.fun文件中,然后在.sh脚本中,用“."加载,然后直接调用函数,如果:db.fun。定义函数可带参数,函数中的 $1,$2,$3…… 表示接受的第一个,第二个,第三个……参数。如:create_station_db 20 11 $1就是20 $2就是 11.
脚本中加载文件语句是:
GLOBAL_CFG_FILE = `find ./ |gropbal_config.sh` #注意 "`"不是单引号
. ${GLOBAL_CFG_FILE} #加载文件
${} 和$() 的区别
${NAME}和$NAME 都是引用替换变量NAME的替换内容,但是${}的好处就是限定了替换范围,不然${AB}C 用$ABC就容易产生歧义。
$(find ./ |grep global.cfg)和 `find ./ |grep global.cfg` 效果是一样的,但是有些shell上并不支持$()
删除指定范围内的字符串
sed -i ‘/#hwBegin/,/#hwEnd/d' readme.txt #就是将#hwBegin和#hwEnd 之间含#hwBegin/和/#hwEnd/
删除掉
覆盖和追究字符串
echo “hello” > readme.txt #用hello覆盖 readme.txt的内容
echo “hello” 》readme.txt #在 readme.txt的结尾追加“hello” 字符串
判断文件的后缀名是否是
if[ "$
{sqlfile##*.}" ="sql" ]; then #判断文件的后缀名是否是sql,是就执行
来源:http://bbs.chinaunix.net/thread-624345-1-1.html
shell中的if else 语句
注意if、elif 和“[”之间要有空格
if [ ${SERVER_NAME} == ${HOPE_CLOUD_SERVER_NAME} ]; then
……
elif [ ${SERVER_NAME} == ${HOPE_VIEW_SERVER_NAME} ]; then
……
else
……
fi
shell脚本带参数
shell 脚本可以跟着参数,在编写脚本的时候,在脚本中用$1表示跟着脚本命令后的第1个参数
$2 表示跟着脚本命令后的第2个参数
#如:执行 $2 指定的文件夹下面的(含子文件夹下面)的所以sql脚本的shell脚本如下:
function run_all_sql_script()
{
for
sqlfile
in `ls $2` #$2为第二个参数
do
if [ -d $2'/'${
sqlfile} ]; then #
sqlfile
如果是个子文件夹 则 进入文件夹 递归
run_all_sql_script() $2'/'${
sqlfile}
else
if[ "$
{sqlfile##*.}" ="sql" ]; then #判断文件的后缀名是否是sql,是就执行
mysql -u${MYSQL_USER} -p${MYSQL_PASSWORD} $1< $2/${
sqlfile}
fi
fi
done
}
shell 循环输出目录下所有文件
#!/bin/sh
function scandir(){
for filename in `ls $1`
do
if [ -d $1'/'$filename ] ; then
echo $1'/'$filename
scandir $1'/'$filename
else
echo $filename
fi
done
}
read file
scandir $file
shell bash判断文件或文件夹是否存在
#如果文件夹不存在,创建文件夹
if [ ! -d
"
/myfolder
" ];
then
mkdir /
myfolder
fi
#shell判断文件,目录是否存在或者具有权限 folder=
"
/var/www/
"
file=
"
/var/www/log
"
# -
x 参数判断 $folder 是否存在并且是否具有可执行权限
if [ ! -x
"
$folder
"];
then
mkdir
"
$folder
"
fi
# -
d 参数判断 $folder 是否存在
if [ ! -d
"
$folder
"];
then
mkdir
"
$folder
"
fi
# -f 参数判断 $
file
是否存在
if [ ! -f
"
$file
" ];
then
touch
"
$file
"
fi
# -
n 判断一个变量是否有值
if [ ! -n
"
$var
" ];
then
echo
"
$var is empty
"
exit
0
fi
# 判断两个变量是否相等
if [
"
$var1
" =
"
$var2
" ];
then
echo
'
$var1 eq $var2
'
else
echo
'
$var1 not eq $var2
'
fi
来源:http://www.cnblogs.com/emanlee/p/3583769.html
shell bash判断程序是否在运行
V1:
#!/bin/bash
ps_out=`ps -ef | grep $1 | grep -v 'grep' | grep -v $0`
result=$(echo $ps_out | grep "$1")
if [[ "$result" != "" ]];then
echo "Running"
else
echo "Not Running"
fi
$0 是命令本身 $1是第一个参数。-v 就是忽略到 -v后面含指定的内容行
V2:
processExist=`ps aux|grep processName|grep -v "grep" `
if [ -z $processExist ];then
exec processName
else
echo "process is running"
fi
if判断中的参数含义:
-z 是否为空
-d 是否为目录
类似这样的文件操作在shell编程中用处很大:我总结有一些一些经常使用
-d :判断制定的是否为目录
-z:判断制定的变量是否存在值
-f:判断制定的是否为文件
-L:判断制定的是否为符号链接
-r:判断制定的是否可读
-s:判断存在的对象长度是否为0
-w:判断制定的是否可写
-x:判断存在的对象是否可以执行
!:测试条件的否定符号
这些文件操作很多时候给脚本编程带来方便,尤其是用在if条件语句中
shell 查找并删除找到的文件/文件夹
删除指定目录下指定文件
find 要查找的目录名 -name .svn |xargs rm -rf
删除指定名称的文件或文件夹: find -type d | grep .svn$ | xargs rm -r
分析:
find -type d | grep .svn$ 通过此命令查找文件夹 过滤正则表达式中的目录
| xargs rm -r 执行删除指令
删除目录下所有exe文件
find . -name '*.exe' -type f -print -exec rm -rf {} ;
(1) "." 表示从当前目录开始递归查找
(2) “ -name '*.exe' "根据名称来查找,要查找所有以.exe结尾的文件夹或者文件
(3) " -type f "查找的类型为文件
(4) "-print" 输出查找的文件目录名
(5) 最主要的是是-exec了,-exec选项后边跟着一个所要执行的命令,表示将find出来的文件或目录执行该命令。
exec选项后面跟随着所要执行的命令或脚本,然后是一对儿{},一个空格和一个,最后是一个分号
find语句,每天运行以删除某个目录下7天以前的文件或目录
/bin/find /enterprisedb_backup/postgresql/ -mtime +7 -exec /bin/rm -rf '{}' \;
以上命令可能报错No such file or directory,需改成如下:
/bin/find /enterprisedb_backup/postgresql/ -mtime +7 -maxdepth 1 -exec /bin/rm -rf {} \;
详细解释见:http://m.blog.csdn.net/article/details?id=32151167
- 通过以上操作我们可以看到,find命令不单查询了/enterprisedb_backup/postgresql/目录,并且遍历了所有子目录,而此时子目录已经随着上一步母文件夹的删除而删除,所以找不到了。
解决方案:
- 整理思路后,可以确认,如果find只找出所需操作目录的第1层文件及目录即可解决此问题
- 通过伟大的 man 命令我们得到以下信息
- 测试操作确认修改为:
这里意思是说:-mtime找到的信息可能会操过-maxdepth的范围,在find操作中建议-maxdepth放在所有其他参数的前面
shell 删除某个文件外的其他文件全部删除的命令
Linux反选删除文件
最简单的方法是
# shopt -s extglob (打开extglob模式)
# rm -fr !(file1)
如果是多个要排除的,可以这样:
# rm -rf !(file1|file2)
Linuxrm删除指定文件外的其他文件方法汇总
一、Linux下删除文件和文件夹常用命令如下: 删除文件: rm file
删除文件夹: rm -rf dir
需要注意的是, rmdir 只能够删除 空文件夹。 二、删除制定文件(夹)之外的所有文件呢?
1、方法1,比较麻烦的做法是:
复制需要保留的文件到其他文件夹,然后将该目录删除, 然后将需要保留的移动 回来。 mv keep ../ #保留文件(夹) keep
rm -rf * #删除当前文件夹里的所有文件 mv ../keep ./ #将原来的东西移动回来
2、方法2,需要在当前文件夹中进行:
rm -rf !(keep) #删除keep文件之外的所有文件
rm -rf !(keep1 | keep2) #删除keep1和keep2文件之外的所有文件
3、方法3,当前文件夹中结合使用grep和xargs来处理文件名: ls | grep -v keep | xargs rm #删除keep文件之外的所有文件
说明: ls先得到当前的所有文件和文件夹的名字, grep -v keep,进行grep正则匹配查找keep,-v参数决定了结果为匹配之外的结果,也就是的到了keep之外的所有文件名,然后 xargs用于从 标准输入获得参数 并且传递给后面的命令,这里使用的命令是 rm,然后由rm删除前面选择的文件。
好处:使用了grep来正则表达式来匹配文件名字,可以一次保留多个文件,从而进行更加准确的处理。
4、方法4,使用find命令代替ls,改进方法3从而能够处理制定文件夹的文件:
find ./test/ | grep -v keep | xargs rm #删除当前test文件夹中keep文件之外的所有文件
说明,用grep而不用find -name选取名字,因为find选取名字时比较麻烦,对正则表达式支持不够,无法排除指定文件名。
5、方法5,直接使用find命令删除其他文件:
find ./ -name '[^k][^e][^e][^p]*' -exec rm -rf {} \; #删除keep以外的其他文件。 find ./ -name '[^k][^e][^e][^p]*' | xargs rm -rf #删除keep以外的其他文件。推荐!
说明:上面第二行的代码效率高些,原因在于删除多个文件时 -exec会启动多个进程来处理,而xargs会启动一个rm进程来处理。
关于find 执行命令的效率和借用xargs启动的命令效率的比较,详情请参考:http://www.linuxsir.org/main/?q=node/137
Linux文件查找命令find,xargs详述 http://www.linuxsir.org/main/?q=node/137 本文转载自:http://blog.sina.com.cn/s/blog_70ffb5c501011rrk.html
rm删除除去指定文件的剩余所有文件 (rm 反向删除)
zhou@zhou:~/LinuxC/file/test$ ls
1 23sdfwe 88888888 aabb ag ghdda mmm
2 3 aaaaaaaa abc asdg llllllll wwwww
zhou@zhou:~/LinuxC/file/test$
然后我想删除除了包含字符串aa外所有的文件,也就是想留下aabb,aaaaaaaa,这两个文件,
其他
的全部删除
下面是我的命令:
zhou@zhou:~/LinuxC/file/test$
rm `ls | grep -v"aa"`
zhou@zhou:~/LinuxC/file/test$ ls
aaaaaaaa aabb
zhou@zhou:~/LinuxC/file/test$
所以了,成功了。
简单的解释一下那条命令吧:rm 删除后面指定的文件
`ls | grep -v "aa" ` 记得外面是反引号(反引号的位置就在标准键盘的数字1的左边),
ls:查看当
前目录下所有的文件,使用grep命令过滤一下grep -v "aa" 就是找出字符串中不带“aa”的。
整体再顺一下:列出文件名不带“aa”串的文件,然后删除他们。OK。
其实说起来简单,当时我也做了好长时间,因为以前没怎么接触grep,因此一开始我想到的办法是使用正则表
达式,但是在做的过程中突然发现了grep使个不错的东西,因此就使用了。
上面的命令使删除带有“aa”串的文件,那如果我只想留下文件aa呢?很简单
zhou@zhou:~/LinuxC/file/test$rm `ls | grep -v"^aa$" `
在aa前面加上^,后面加上$表示结束符的意思,这个就是完全匹配了。
好了,就这么多。但愿以后能用到这个有用的命令
转自:http://blog.sina.com.cn/s/blog_67e34ceb01014930.html
linux 删除其他文件
http://zhidao.baidu.com/link?url=uvHfrb3kSnM_8p5ILhZyc39U0h3md-Ncrm3iaygeYTLU-zjthNBlqO674VulVGTnPiNcl2nj7wo5vn08N4481_
求教 linux centos我想删除某目录中文件名不符合"*20100330*"这样规则的文件应该怎么删除?
假设目录名为myTest且为当前目录的下一级目录,使用如下命令即可:
cd ./myTest && rm `ls | grep -v '20100330'` && cd ..
进入myTest目录,删除文件后返回当前目录。
grep的-v参数表示反向选择。
一般使用rm删除文件的时候会有确认提示,如果不要确认,直接强制删除,可以使用rm的-f参数。
其他1条回答
find ./ -type f \! -name "*20100330*" -exec rm -rf {} \;
如何反向选择文件并删除
http://bbs.csdn.net/topics/390077765
案例:一个文件夹下我想删除 除了abc文件 之外的所有文件,命令怎么写(linux下)
find . -maxdepth 1 -type f -not -name 'abc' -exec rm '{}' ';'
ls | grep -v abc | xargs -i rm -rf {}
rm -f `ls | grep -v abc`
如果文件很多的情况下,不要用这种方法……
要用2楼的方法……
mv abc /tmp
rm *
mv /tmp/abc .
反向显示文件
使用ls命令仅仅显示当前目录不包括.的文件.
ls加grep过滤的方式:ls -al | grep -v '\.'(ls --ignore=.* -al也可实现)。
在打开extglob模式下(缺省是打开的),ls也可以实现,而且更加灵活.
shopt -u extglob #关闭
shopt -s extglob #打开
ls -al !(*.*)
ls -al -d !(*.*)
删除文件时排除特定文件
删除当前目录下所有 *.txt文件,除了test.txt
1
2
3
4
5
6
7
8
|
rm
`
ls
*.txt|
egrep
-
v
test
.txt`
#或者
rm
`
ls
*.txt|
awk
'{if($0 != "test.txt") print $0}'
`
#排除多个文件
rm
`
ls
*.txt|
egrep
-
v
'(test.txt|fff.txt|ppp.txt)'
`
rm
-f `
ls
*.log.1|
egrep
-
v
'(access-2010-09-06.log|error-2010-09-06.log)'
`
rm
-f `
ls
*.log|
egrep
-
v
'(access-2010-09-06.log|error-2010-09-06.log)'
`
rm
-f `
ls
*.log|
egrep
-
v
'(20100906.log)'
`
|
注意:上面所用的符号是‘`’,而不是单引号
这里是用ls得到原始数据,也可以用find命令
rm `find . -name *.txt | egrep -v ‘(test.txt|fff.txt|ppp.txt)'`
==========================================
egrep是grep的扩展, egrep除了具备grep的基本功能外还可以使用附加的正则表示式元字符, 如
[a-z]+A
[a-z]?A
[a-z]|[a-z]
abc(d|e)
等, 另外egrep不允许使用\(\)和\{\}(摘自:http://www.pythontab.com/html/2013/linuxkaiyuan_0205/214.html)
《Shell while read命令完成用户的交互输入》
http://blog.csdn.net/sz_zh/article/details/7876232