Unix GNU查找:首先在当前目录中搜索

Unix GNU查找:首先在当前目录中搜索,unix,directory,find,depth,directory-traversal,Unix,Directory,Find,Depth,Directory Traversal,如何让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-s-注意“没有帮助吗?或find-注意“|排序?解决

如何让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-s-注意“
没有帮助吗?或
find-注意“|排序

解决方法是查找-在名称中。注意“|排序-r:

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

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

对于我在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来查找都没有任何作用

编辑:

我编写了一个perl oneliner来进一步了解这一点:

perl -e 'opendir(DH,".") ; print join("\n", readdir(DH)),"\n" ; closedir(DH)'
在运行测试用例1之后,我对/tmp/depthtest运行了这个测试,结果如下:

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

.
..
1
2
3
.note
.
..
.note
1
2
3
从而确认结果是按目录顺序排列的

查找的
-depth
选项仅控制例如
/1/.note
是在
/1/
之前还是之后处理,而不是
/.note
/1/
是第一位,因此结果的顺序完全基于目录顺序(主要是创建顺序)


查看以了解如何解决此问题可能会有所帮助。

find
的算法如下:

  • 对于命令行中给定的每个路径,将当前条目设为该路径,然后:
  • 将当前条目与表达式匹配
  • 如果当前条目是目录,则按未指定的顺序对该目录中的每个条目执行步骤1和2
对于
-depth
primary,步骤1和2按相反的顺序执行

<>你要问<代码>查找要做的是在步骤2之前在目录中考虑文件。但是
find
没有这样做的选项

在您的示例中,匹配文件的所有名称都位于同一目录中子目录的名称之前,因此
find-请注意,“|排序
将起作用。但这显然不能很好地概括

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

find -type d -exec print-matching-files-in {} \;
如果要使用
find
表达式来匹配文件,下面是第二个
find
命令的一般结构,该命令仅以非递归方式在指定目录中的非目录上迭代(需要GNU find):

例如:

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

在zsh中,您可以编写

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

**/
递归到子目录中
(#i)
(a)将以下内容解释为不区分大小写的模式,
(Od)
(a)对递归遍历的结果进行排序,以便在子目录之前考虑目录中的文件。使用
(Odon)
,输出在
Od
设置的约束范围内按字典顺序排序(即,主要排序标准排在第一位)。

在当前文件夹中查找

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

==>73

好笑。Linux上的GNU find给了我第一个输出,Cygwin上的GNU find给了我第二个输出。不知道如何影响这一点<代码>-深度应该可以工作,但不能。此处的行为相同
-depth
似乎没有效果。@DevSolar,@larsmans:通过这个输入,
-depth
恰好产生了完全相同的结果<代码>-深度对文件是在目录之前还是之后处理没有影响,它决定目录是在其内容之前还是之后处理。在ASCII排序中,
位于
1
之前,因此您的输出取决于具有特定的排序区域设置(
$LC\u COLLATE
)。事实上,大多数排序语言环境都有这样的顺序,但基本语言环境(
C
或同义词
POSIX
)没有。脚本中经常使用此区域设置,以避免某些应用程序无法处理与ASCII不兼容的排序。