如何告诉 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
有任何想法吗?
如何告诉 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
有任何想法吗?
find
的算法如下:
对于-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
(即主要排序标准首先出现)规定的约束内按字典顺序排序。
对于在 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
这证实了结果是按目录顺序排列的。
-depth
find 选项仅控制 eg是在./1/.note
之前还是之后处理./1/
,而不是./.note
或 . /1/
是第一,所以结果的顺序完全基于目录顺序(主要是创建顺序)。
查看如何递归列出某个位置的所有目录,广度优先?了解如何解决此问题。
解决方法是find . -iname '.note' | sort -r
:
$ find . -iname '.note' | sort -r
folder/.note
folder/3/.note
folder/2/.note
folder/1/.note
但是在这里,输出只是以相反的顺序排序,这不会改变 find 的行为。
find -s . -iname ".note"
没有帮助吗?还是find . -iname '.note'|sort
?
在当前文件夹中查找
find ./in_save/ -type f -maxdepth 1| more
==>73!