我如何查找目录结构中包含此文本的文件
addDesignControlChangeNotification
但缺少此文本
removeDesignControlChangeNotification
谢谢!
笔记:我指的是脚本启动的目录和所有子目录。
答案1
以下是根据 Rich Homolka 的回答,但适用于目录树:
find . -type f -exec grep -l addDesignControlChangeNotification {} \; |
while IFS= read -r file; do
grep -q removeDesignControlChangeNotification "$file" > /dev/null ;
[ $? -ne 0 ] && echo $file;
done
返回的任何文件都将包含addDesignControlChangeNotification
但不包含removeDesignControlChangeNotification
。
解释:
find . -type f -exec grep -l foo {} \;
:这将打印当前目录下包含字符串的任何子目录中的所有文件foo
。该-l
标志使 grep 仅打印匹配文件的名称。while read file
:这将遍历上面找到的每个文件,并将其名称保存在变量中$file
。grep -q bar "$file" > /dev/null
bar
:此命令在每个包含的文件中查找字符串foo
。[ $? -ne 0 ] && echo $file;
$?
:如果命令的返回值( )grep
为 0(即,如果字符串不在文件中),则打印文件的名称。
答案2
这应该有效:
FIRST=addDesignControlChangeNotification
SECOND=removeDesignControlChangeNotification
grep -l $FIRST * | while IFS= read -r FILE
do
grep $SECOND "$FILE" &> /dev/null
if [ $? -ne 0 ]
then
echo "File $FILE has $FIRST but not $SECOND"
fi
done
答案3
一句话:
comm -2 -3 <(grep -rl addDesignControlChangeNotification . | sort ) \
<(grep -rl removeDesignControlChangeNotification . | sort )
grep -r
是递归 grep,<()
是流程替代,并comm
显示一对(已排序)文件有/没有共同点的行。在本例中,我们只想要第 1 列的输出:第一个文件中的行(其中“文件”实际上是 grep 输出),而第二个文件中没有。