提取包含具有匹配字符串的文件的目录路径

提取包含具有匹配字符串的文件的目录路径

我有多个级别的多个子目录,其中包含文件 results.out

./dir1/results.out
./dir2/dir21/results.out
./dir3/dir31/dir311/results.out

现在我需要搜索string1并提取包含 的results.out目录路径,因为我需要将这些子目录移动到另一个位置。例如,我可以使用以下代码获取文件路径results.outstring1

for i in $(find . -type f -name "results.out);
do
grep -l "string1" $i
done

如何修改上面的代码以仅获取目录路径?

答案1

如果您有 GNU ,您可以使用格式说明符find打印路径%h

    %h     Leading directories of file's name (all but the last ele‐
           ment).  If the file name contains no slashes (since it is
           in  the  current  directory)  the %h specifier expands to
           ".".

例如你可以这样做

find . -name 'results.out' -exec grep -q 'string1' {} \; -printf '%h\n'

答案2

zsh

print -rl ./**/results.out(.e_'grep -q string $REPLY'_:h)

这会递归地搜索.名为 的常规文件 ( ) ,在每个文件上results.out运行 ,如果评估grep -q ...e真的它仅打印h路径的开头(没有最后一个元素的路径)。


find另一种使用and 的方法sh,使用${parameter%/*}扩展来提取头部:

find . -type f -name results.out -exec grep -q string {} \; \
-exec sh -c 'printf %s\\n "${1%/*}"' bang {} \;

答案3

for i in $(find . -type f -name "results.out);
do
grep -l "string1" $i ; exitcode=${?}
if [ ${exitcode} -eq 0 ]  # string1 is found in file $i
then
   path=${i%/*}
   echo ${path}
fi
done

答案4

假设我理解正确,你想这样做:

find . -type f -name "results.out" -exec grep -l "string1" {} \; | xargs dirname

第一部分获取匹配的文件名,然后 xargs 将这些文件名作为参数传递给 dirname 程序,该程序从路径中“剥离”文件名

相关内容