我想知道是否有人可以协助我试图解决我的问题。
我编写了一组shell脚本,目的是根据审计服务器上的GOLD构建审计远程文件系统。
作为其中的一部分,我执行以下操作:
1)使用rsync计算出任何新文件或目录,任何已修改或删除的文件
2)在本地和地区使用find ${source_filesystem} -ls
远程计算权限差异
现在作为其中的一部分,我排除了某些文件或目录,即日志,跟踪文件等。
所以为了达到这个目的,我使用了两种方法:
1)RSYNC - 我有一个使用--exclude-from
标志
2)find -ls
- 我使用egrep -v
语句排除与rsync排除列表相同的内容:
e.g。 find -L ${source_filesystem} -ls | egrep -v "$SEXCLUDE_supt"
所以我的问题是我必须保留2个单独的列表,这有点像管理员的噩梦。
我正在寻找一些帮助或一些建议,如果可以动态构建可用于rsync或find -ls
的exlus的列表?
以下是排除列表的格式::
RSYNC:
*.log
*.out
*.csv
logs
shared
tracing
jdk*
8.6_Code
rpsupport
dbarchive
inarchive
comms
PR116PICL
**/lost+found*/
dlxwhsr*
regression
tmp
working
investigation
Investigation
dcsserver_weblogic_*.ear
dcswebrdtEAR_weblogic_*.ear
FIND:
SEXCLUDE_supt="\.log|\.out|\.csv|logs|shared|PR116PICL|tracing|lost\+found|jdk|8\.6\_Code|rpsupport|dbarchive|inarchive|comms|dlxwhsr|regression|tmp|working|investigation|Investigation|dcsserver_weblogic_|dcswebrdtEAR_weblogic_"
答案 0 :(得分:0)
您无需为find
命令创建第二个列表。 grep
可以使用-f
标志处理模式列表。从手册:
-f FILE, --file=FILE
Obtain patterns from FILE, one per line. The empty file contains zero
patterns, and therefore matches nothing. (-f is specified by POSIX.)
这就是我要做的事情:
find -L ${source_filesystem} -ls | grep -Evf your_rsync_exclude_file_here
这也适用于包含换行符和空格的文件名。请告诉我它是怎么回事。
答案 1 :(得分:0)
最后grep -Evf有点噩梦,因为rsync不支持正则表达式,它使用正则表达式但不一样。
因此,我通过解析rsync排除列表并动态构建变量以传递到egrep来追求我为动态构建egrep排除列表的另一个想法。
这是我使用的方法:
#!/bin/ksh
# Create Signature of current build
AFS=$1
#Create Signature File
crSig()
{
find -L ${SRC} -ls | egrep -v **"$SEXCLUDE"** | awk '{fws = ""; for (i = 11; i <= NF; i++) fws = fws $i " "; print $3, $6, fws}' | sort >${BASE}/${SIFI}.${AFS}
}
#Setup SRC, TRG & SCROOT
LoadAuditReqs()
{
export SRC=`grep ${AFS} ${CONF}/fileSystem.properties | awk {'print $2'}`
export TRG=`grep ${AFS} ${CONF}/fileSystem.properties | awk {'print $3'}`
export SCROOT=`grep ${AFS} ${CONF}/fileSystem.properties | awk {'print $4'}`
**export BEXCLUDE=$(sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' ${CONF}/exclude-list.${AFS} | tr "\n" "|")**
**export SEXCLUDE=$(echo ${BEXCLUDE} | sed 's/\(.*\)|/\1/')**
}
#Load Properties File
LoadProperties()
{
. /users/rpapp/rpmonit/audit_tool/conf/environment.properties
}
#Functions
LoadProperties
LoadAuditReqs
crSig
所以使用这些新变量:
**export BEXCLUDE=$(sed -e 's/[*/]//g' -e 's/\([._+-]\)/\\\1/g' ${CONF}/exclude-list.${AFS} | tr "\n" "|")**
**export SEXCLUDE=$(echo ${BEXCLUDE} | sed 's/\(.*\)|/\1/')**
我用它们来删除“*”和“/”,然后匹配我的特殊字符并在前面添加“\”以逃避它们。
然后使用“tr”用“|”替换换行符然后重新运行该输出以删除尾随“|”使变量$ SEXCLUDE用于crSig函数中使用的egrep。
您怎么看?