3

如何告诉 find 先在当前文件夹中查找,然后在子文件夹中继续搜索?我有以下内容:

$ find . -iname '.note'
folder/1/.note
folder/2/.note
folder/3/.note
folder/.note

我想要的是这样的:

$ find . -iname '.note'
folder/.note
folder/1/.note
folder/2/.note
folder/3/.note

有任何想法吗?

4

5 回答 5

3

find的算法如下:

  • 对于命令行上给出的每个路径,让当前条目为该路径,然后:
    1. 将当前条目与表达式匹配。
    2. 如果当前条目是一个目录,则以未指定的顺序对该目录中的每个条目执行步骤 1 和 2。

对于-depth初级,步骤 1 和 2 以相反的顺序执行。

您要求find做的是在步骤 2 中考虑目录之前的文件。但find没有选择这样做。

在您的示例中,匹配文件的所有名称都位于同一目录中的子目录名称之前,因此find . -iname '.note' | sort可以使用。但这显然不能很好地概括。

在目录之前处理非目录的一种方法是运行一个find命令来迭代目录,并运行一个单独的命令(可能find再次)来打印该目录中的匹配文件。

find -type d -exec print-matching-files-in {} \;

如果您想使用find表达式来匹配文件,这里是第二个find命令的一般结构,它仅以非递归方式迭代指定目录中的非目录(需要 GNU 查找):

find -type d -exec find {} -maxdepth 1 \! -type d … \;

例如:

find -type d -exec find {} -maxdepth 1 \! -type d -iname '.note' \;

在zsh中,你可以写

print -l **/(#i).note(Od)

**/递归到子目录;(#i)(a globbing flag ) 将后面的内容解释为不区分大小写的模式,并且(Od)(a glob qualifier ) 对递归遍历的结果进行排序,以便在子目录之前考虑目录中的文件。使用(Odon)时,输出在由Od(即主要排序标准首先出现)规定的约束内按字典顺序排序。

于 2010-11-18T21:12:35.517 回答
1

对于在 Linux 上使用 GNU find 的我来说,我得到了具有不同测试运行的两个订单。

测试用例:

rm -rf /tmp/depthtest ; mkdir -p /tmp/depthtest ; cd /tmp/depthtest ; for dir in 1 2 3 . ; do mkdir -p $dir ; touch $dir/.note ; done ; find . -iname '.note'

通过这个测试,我得到了海报的第一个结果。注意 的顺序1 2 3 .。如果我将此顺序更改为. 1 2 3

rm -rf /tmp/depthtest ; mkdir -p /tmp/depthtest ; cd /tmp/depthtest ; for dir in . 1 2 3 ; do mkdir -p $dir ; touch $dir/.note ; done ; find . -iname '.note'

我得到了海报的第二个结果。

在任何一种情况下,将 -depth 添加到 find 均无济于事。

编辑:

我写了一个 perl oneliner 来进一步研究这个:

perl -e 'opendir(DH,".") ; print join("\n", readdir(DH)),"\n" ; closedir(DH)'

在运行测试用例 1 后,我针对 /tmp/depthtest 运行了这个,结果如下:

.
..
1
2
3
.note

我在测试用例 2 之后再次运行它,结果如下:

.
..
.note
1
2
3

这证实了结果是按目录顺序排列的。

-depthfind 选项仅控制 eg是在./1/.note之前还是之后处理./1/,而不是./.note或 . /1/是第一,所以结果的顺序完全基于目录顺序(主要是创建顺序)。

查看如何递归列出某个位置的所有目录,广度优先?了解如何解决此问题。

于 2010-11-18T18:39:28.447 回答
1

解决方法是find . -iname '.note' | sort -r

$ find . -iname '.note' | sort -r
folder/.note
folder/3/.note
folder/2/.note
folder/1/.note

但是在这里,输出只是以相反的顺序排序,这不会改变 find 的行为。

于 2010-11-18T13:55:53.500 回答
0

find -s . -iname ".note"没有帮助吗?还是find . -iname '.note'|sort

于 2010-11-18T13:14:29.793 回答
0

在当前文件夹中查找

 find ./in_save/ -type f -maxdepth 1| more

==>73!

于 2015-02-07T22:03:39.500 回答