动态构建rsync和amp;的排除列表egrep格式

时间:2013-01-25 16:18:55

标签: sed awk find rsync grep

我想知道是否有人可以协助我试图解决我的问题。

我编写了一组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_"

2 个答案:

答案 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。

您怎么看?