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