假设我在目录 A 中,在 A 下有许多文件夹(B、C、D 等),每个文件夹中都有一个文件“*.out”和子文件夹。我想从 A 运行一个脚本,它将在 *.out 文件中查找文本“index123”并打印出所有相应的文件夹名称。
这是我的脚本:
#!/bin/sh
FILES=home/A
grep --include=\*.out -rnw $FILES -e "index123" | while read file; do
str1="FILES/$(basename $file)"
echo $str1
done
这显示错误。
NB 这可以通过在一行代码中“查找”来完成,但为什么显示的 while 循环显示错误?
假设目录结构如下:
您的代码的问题是您
grep
将产生看起来像那是的输出
与
A
作为当前目录。然后,您将尝试
basename
在这些单独的行上运行,但由于basename
最多需要两个参数(路径名和从该路径名中删除的后缀)而失败。GNUbasename
会抱怨“额外的操作数”,而 BSDbasename
会抱怨不正确的使用。grep
-l
当您将其与标志一起使用时,将向您显示文件的名称(仅,即不是匹配的完整行) 。这意味着您的脚本可能会被单个命令替换
这将在表单上给出输出
我添加
-w
了您在grep
命令行中使用的内容。-n
(用于编号行,您也在使用)不能与 . 一起使用-l
。从你的代码来看,这就是你想要的。
如果您只需要文件夹名称,请执行
所有这些都假定这
A
是当前的工作目录,但是您说问题中就是这种情况,所以这应该不是问题。根据帖子通过特定搜索在while循环中查找文件,其中一种解决方案可以使用
while
循环如下:#!/bin/bash
while IFS= read -r d;
grep -q "index123" "$d" && dirname "$d"|awk -F'/' '{print $2}'
done < <(find . -maxdepth 2 -type f -name "*.out")