1

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

我编写了一组 shell 脚本,目的是基于审计服务器上的 GOLD 构建审计远程文件系统。

作为其中的一部分,我执行以下操作:

1) 使用 rsync 计算任何新文件或目录,任何修改或删除的文件

2)find ${source_filesystem} -ls在本地和远程使用以解决权限差异

现在作为其中的一部分,我排除了某些文件或目录,即日志、跟踪文件等。

因此,为了实现这一点,我使用了 2 种方法:

1) RSYNC - 我有一个使用--exclude-from标志添加的排除列表

2) find -ls- 我使用一个egrep -v语句来排除与 rsync 排除列表相同的内容:

例如find -L ${source_filesystem} -ls | egrep -v "$SEXCLUDE_supt"

所以我的问题是我必须维护 2 个单独的列表,这有点像管理员的噩梦。

我正在寻找有关是否可以动态构建可用于 rsync 或find -ls?

以下是排除列表的格式:

同步:

*.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

寻找:

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_"
4

2 回答 2

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。

你怎么看?

于 2013-01-31T11:50:56.443 回答
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

这也适用于包含换行符和空格的文件名。请让我知道情况如何。

于 2013-01-26T05:51:37.747 回答