不久前,我编写了一些代码,并将其存储在中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.c
find
find
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
。这样您就不会找到别人的文件。注意:
test
GNU Coreutils 确实支持-O
。test
直接运行find -exec
是独立可执行文件(可能是 GNUtest
),但test
运行sh
可能是 shell 内置的,这是不同的。要运行可执行文件,请指定其完整路径(例如/usr/bin/test
)。