我需要识别在命令行上作为参数提供的字符串(模式)。我需要仅在当前目录和档案中搜索,并将其附加到两个不同的文件夹(.txt)中,一个包含文件夹,一个包含档案。
我的命令是 grep -s -R -E $1 >> text.txt
,我正在使用 UBUNTU 16.04 LTS。是否有其他命令可以在所有类型的档案中搜索我的字符串,或者可能只是 tar 和 zip(如果可能的话)?我的目标是有一个文件夹,其中包含当前目录中包含我的字符串(模式)的所有文件,还有一个文件夹,其中包含当前目录中包含我的字符串(模式)的所有档案。我认为我的命令已经执行了此操作,但仅适用于当前目录中的文件夹。有什么想法如何对档案执行此操作?
编辑:尝试了此代码,它可以工作,但是正如你在我的屏幕截图中看到的那样,text.txt 的输出包含所有档案,而不仅仅是带有字符串的档案。尝试使用另一个字符串,仍然输出所有 gzip 和 zip 档案,即使不包含字符串“$1”。例如,在提供的屏幕截图中,输出应该只有 first.zip,因为它包含字符串“sample”
for f in *.zip
do
if [ -f "$f" ]; then
found=$(zgrep -q "$1" "$f")
if [ ! $found ]; then
echo "$f" >> text.txt
fi
fi
done
答案1
如果您想要搜索目录中所有档案的模式(您可以根据需要添加更多类型):
for f in *.tar.gz
do
if [ -f "$f" ]; then
tar -xvzf "$f" -O | grep -sE "Pattern" >> text.txt
fi
done
for f in *.zip
do
if [ -f "$f" ]; then
zgrep "pattern" "$f" >> test.txt
fi
done
基本上它的工作原理如下:
- For 循环在当前目录中查找档案。
- 在提取之前,我们检查是否有任何文件需要提取。
tar -xvfz
用-O
标志提取$f
文件.tar.gz
到标准输出,并通过管道将输出提供给 grep。zgrep
与 grep 类似,但它适用于 zip 和gzip
文件。与 grep 不同,它不支持-R
标志(递归)。
编辑:如果只希望 grep/zgrep 返回 true 或 false,而不是匹配的文本:
for f in *.tar.gz
do
if [ -f "$f" ]; then
found=$(tar -xvzf "$f" -O | grep -sE "Enabled")
if [ ! -z "$found" ]; then
echo "$f" >> text.txt
fi
fi
done
for f in *.zip
do
if [ -f "$f" ]; then
found=$(zgrep "pattern" "$f")
if [ ! -z "$found" ]; then
echo "$f" >> text.txt
fi
fi
done