'-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代码来执行此操作,但这似乎......过度了?我必须忽略一种方法来找到这个。
答案 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,而这些项目file1
,file2
和dir
的顺序保持不变。
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
也许你真的希望最后两行的顺序相反。那将更难!