仅在顶级目录中使用“find”命令查找特定文件

仅在顶级目录中使用“find”命令查找特定文件

我有一个可能很愚蠢的问题:

我在 Solaris 下使用远程服务器工作ssh,我的任务是查找特定文件与 shell 模式匹配的目录不要进一步深入递归

假设我有以下目录层次结构:

dir-a/
    file-a
    file-b
    dir-c/
        file-a
dir-b/
    file-a
    file-b

我想要查找file-a目录dir-a&中命名的所有文件,dir-b但不在目录中dir-c。好的,到目前为止一切顺利 - 只需一个find命令即可,非常简单:

 find dir-{a,b} -mindepth 1 -maxdepth 1 -name 'file-a'

但问题是在这台机器上安装的版本非常旧,find所以它没有-mindepth选项-maxdepth。我尝试使用-prune

find dir-{a,b} \( -type d -prune \) -o -name file-a -print 

但是它什么都没打印出来,因为搜索树中的第一个目录是dir-adir-b本身,所以find只需跳过它们的内容,这实际上是应该的。如果我可以使用,-mindepth我会跳过这个“根”目录-mindepth 1并获得另一个可行的解决方案,但正如我所说,我不能。depth也没有帮助,因为如果它使用dir-adir-b在查找搜索树中是最后一个,并且 dir-a/dir-c/file-a 现在再次出现在输出中。哦,这个旧的find也没有-regex-wholepath选项,所以我不能使用复杂的名称模式从结果中排除更深的文件。你有什么假设吗?

答案1

无需使用 find 即可完成此操作

ls dir-[ab]/file-a

我注意到太阳免费软件有适用于 Solaris 的 GNU findutils 包。

答案2

这似乎可以实现你想要的效果:

find dir-a dir-b -type d ! -name dir-a ! -name dir-b -prune -o -name file-a -print

具体如下:

-type d ! -name dir-a ! -name dir-b -prune

任何不是该名称的目录dir-adir-b都被修剪。

-name file-a -print

然后打印任何其他名为“file-a”的对象,但这应该是显而易见的。

我猜测您使用的 Solaris 版本没有该-not运算符,因此请改用较旧的!运算符。

缺点是您需要! -name为命令行中输入的每个目录添加子句。但您可以生成一个命令来更通用地进行设置。

答案3

您可以使用grep(1)克服缺乏-mindepth-maxdepth查找(1)Solaris 使用的实现。

虽然不是很漂亮,但是如果您在安装的软件选择上受到限制(例如坐在客户的机器前),这是一个简单而快速的解决方案:

$ find . -name test
./test
./test/test
./test/test/test
./test/test/test2/test

$ find . -name test | grep -v '/.*/.*/' | grep '/.*/' 
./test/test

您可以使用以下方式节省一个流程的成本awk(1)

$ find . -name test | awk -F/ 'NF == 3'
./test/test

相关内容