查找包含两个已知名称的文件的目录

查找包含两个已知名称的文件的目录

不久前,我编写了一些代码,并将其存储在中main.c。然后我将它编译为test,并将其放置一个月左右,等待用例运行我的测试。

这是一台共享服务器,所以东西会移动。父目录有很多其他main.c文件test,所以我要找的是包含main.c和的目录test。如果有几个结果,我可以从那里过滤

mlocate使用/是否可行find?我可以用 编写一些代码来sed截断 返回的目录find,然后通过 的另一次迭代运行它find,但如果有一个我可以信赖的内置解决方案,我会更喜欢。

答案1

mlocate

这在我的 Kubuntu 中有效:

mlocate -b --regex '^(main.c|test)$' | sed 's|/[^/]*$||' | sort | uniq -d

(已用 测试mlocate 0.26)。

注意:这不具可扩展性。如果您想要查找包含三个(或更多)已知文件的目录,则需要用uniq -d更复杂的方法替换(uniq -dc这是一个好的开始)。


find

这种解决方案相对较慢但是不依赖于mlocate不可移植。

测试目录是否存在两个具有已知名称的常规文件的基本解决方案:

find / -type d -exec test -f {}/main.c \; -exec test -f {}/test \; -print

注意:这个扩展性很好。为更多名称添加更多测试很简单。

需要澄清的是:test -f {}/test第一个test是标准实用程序名称test(又名[),它与您的无关test。如果您命名了文件,test1那么代码片段将是test -f {}/test1

的 POSIX 规范find要求其-exec主参数替换为作为单独参数出现的参数。允许{}替换多个参数{}{}仅替换参数的一部分(如),但这不是必需的。因此,上述命令可能适用于您的系统,也可能不适用于您的系统(它肯定适用于 GNU )。以下是完全可移植(但速度较慢)的替代方案:{}/main.cfindfind

find / -type d -exec sh -c 'test -f "$1/main.c" && test -f "$1/test"' find-sh {} \; -print

find-sh此处解释:中的第二个 sh 是什么sh -c 'some shell code' sh)。

当从 开始时,/您可能想要排除/proc/sys/dev

find / -type d \( -path /proc -o -path /sys -o -path /dev \) -prune -o \
       -exec test -f {}/main.c \; -exec test -f {}/test \; -print

如果您想实施更高级的排除/包含,请参阅递归搜索具有排除和包含的文件我的答案在那里

如果您test支持-O(测试文件是否确实归您所有),那么请考虑test -O而不是test -f。这样您就不会找到别人的文件。注意:

  • testGNU Coreutils 确实支持-O
  • test直接运行find -exec是独立可执行文件(可能是 GNU test),但test运行sh可能是 shell 内置的,这是不同的。要运行可执行文件,请指定其完整路径(例如/usr/bin/test)。

相关内容