我有多个级别的多个子目录,其中包含文件 results.out
./dir1/results.out
./dir2/dir21/results.out
./dir3/dir31/dir311/results.out
现在我需要搜索string1
并提取包含 的results.out
目录路径,因为我需要将这些子目录移动到另一个位置。例如,我可以使用以下代码获取文件路径results.out
string1
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 程序,该程序从路径中“剥离”文件名