在 bash 中,我尝试查找包含特定文件的目录;但是,这些目录位于不同的级别,例如,如果我正在寻找 dir03/myfile.txt:
dir01/dir02/dir03/myfile.txt
dir01/dir03/ ##no target file in it
dir01/dir04/dir05/dir03/myfile.txt
dir01/dir04/dir05/dir06/myfile.txt ##I do not want this
我可以这样做:
find ./dir01 -type -d -iname "dir03"
但随后我会得到所有目录,甚至没有目标文件的目录
如果我这样做:
find ./dir01/*/dir03 -iname "myfile.txt"
我不会看到“dir01/dir04/dir05/dir03/myfile.txt”
这不起作用:
find ./dir01 -iname "dir03/myfile.txt"
##find: warning: Unix filenames usually don't contain slashes (though pathnames do).
That means that '-iname ‘dir03/myfile.txt’' will probably evaluate to false all the time on this system. You might find the '-wholename' test more useful, or perhaps '-samefile'. Alternatively, if you are using GNU grep, you could use 'find ... -print0 | grep -FzZ ‘dir03/myfile.txt’'
我可以这样做:
find ./dir01 -iname "myfile.txt" -print0 | grep -FzZ 'dir03' | sed "s/myfile\.txt/\n/g"
它找到 myfile.txt 所在的所有匹配项,并仅获取目标目录中包含的匹配项;之后,我用新行拆分结果(上面的行给出了连接的结果,例如./dir01/dir02/dir03/myfile.txt./dir01/dir04/dir05/dir03/myfile.txt
但如果我有一个复杂的子目录结构,它可能会使搜索更通用、更长。我想知道是否有更简单的解决方案来告诉 find 在任何级别找到“dir03/myfile.txt”
请注意,目录名称仅供参考,它们不共享相同的前缀。
编辑:我想我可以做到
find ./dir01 -iname "myfile.txt" > myres0.txt
grep 'dir03' myres0.txt > myres1.txt
考虑到我正在寻找多个父目录而不仅仅是 dir03,它只会进行一次搜索,然后我可以使用包含目标目录的 txt 文件并执行以下操作:
grep -f mytargetDirs.txt myres0.txt > myres1.txt
仍然想知道是否有更好的方法。