如何 grep 并附加与文件夹不同的档案

如何 grep 并附加与文件夹不同的档案

我需要识别在命令行上作为参数提供的字符串(模式)。我需要仅在当前目录和档案中搜索,并将其附加到两个不同的文件夹(.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

相关内容