如何让GNU'find'在目录树中找到文件名的* first *实例?

时间:2016-12-17 06:27:47

标签: linux find gnu

'-depth'全局开关被记录为强制进行深度优先搜索,但即使没有那个开关,我似乎也得到深度优先搜索,这不是我想要的。特别是,我希望它在目录中输出一个匹配的文件,然后再将输出到子目录中。

注意在这个例子中它找到12 / KeyboardTest / Main.jack 之前它找到12 / Keyboard.jack。

$ find . -name "*.jack"
./12/KeyboardTest/Main.jack
./12/Keyboard.jack
./12/Math.jack
./12/Screen.jack
./12/String.jack
./12/Output.jack
./12/Memory.jack
./12/MemoryTest/Main.jack
./12/Sys.jack
./12/ArrayTest/Main.jack
./12/SysTest/Main.jack
./12/ScreenTest/Main.jack
./12/OutputTest/Main.jack
./12/StringTest/Main.jack
./12/MathTest/Main.jack
./12/Array.jack

(我碰巧在Cygwin下这样做;我不认为这是相关的,但我提到它以防万一。)

我当然可以编写自己的bash或perl代码来执行此操作,但这似乎......过度了?我必须忽略一种方法来找到这个。

1 个答案:

答案 0 :(得分:1)

-depth选项查找在目录本身之前评估目录的内容。目录的内容是目录中的 everything ,无论是文件还是目录。这是区别:

foo
foo/file1
foo/dir
foo/dir/file
foo/file2

foo/file1
foo/dir/file
foo/dir
foo/file2
foo

foo来自foo中的项目之后的vs,而这些项目file1file2dir的顺序保持不变。

find不排序,因此无法使用find来做你想做的事情。装饰,排序,非装饰模式之后的某些东西可能适合您。考虑通过-printf "%d %p\n"为每个项目添加深度前缀,然后将输出管道排序到sort -n。从我上面的列表中,我们得到:

$ find foo -name "file*" -printf "%d %p\n" | sort -n
1 foo/file1
1 foo/file2
2 foo/dir/file

这看起来像你想要的顺序。用“cut”或“awk”去除深度编号,你就有了清单。如果您想对这些文件运行命令而不是仅列出它们,请将其传递给xargs。

在三个级别深处,您可能找不到排序顺序,但它确实满足您的要求。

1 foo/file1
2 foo/dir1/file
2 foo/dir2/file
3 foo/dir1/subdir/file

也许你真的希望最后两行的顺序相反。那将更难!