2016-12-17 28 views
0

「深度」全局開關記錄爲強制執行深度優先搜索,但即使沒有該開關,我似乎也會得到深度優先搜索,這不是我想要的。特別是,我希望它在之前在目錄中輸出匹配文件,並將其遞歸到子目錄中。如何讓GNU'find'在目錄樹中找到* first *實例的文件名?

注意在這個例子中它發現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

Stack Overflow是編程和開發問題的網站。這個問題似乎與題目無關,因爲它不涉及編程或開發。請參閱幫助中心的[我可以詢問哪些主題](http://stackoverflow.com/help/on-topic)。也許[超級用戶](http://superuser.com/)或[Unix&Linux堆棧交換](http://unix.stackexchange.com/)會是一個更好的地方。另請參閱[我在哪裏發佈有關Dev Ops的問題?](http://meta.stackexchange.com/q/134306) – jww

回答

0

-depth選項會查找在目錄本身之前評估目錄的內容。該目錄的內容是,該目錄中的所有內容都是,無論是文件還是目錄。這之間的區別:

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

和:

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

foo之前VS在foo項目後,來了,而這些項目,file1file2dir的順序,是不變的。

找不到排序,所以無法使用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 

這看起來像你想要的順序。用「剪切」或「awk」去除深度數字,並且你有你的列表。如果你想對這些文件運行一個命令而不是僅僅列出它們,將它管理到xargs。

在三個層次上,您可能找不到排序順序,儘管它滿足您的要求。

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

也許你真的想要最後兩行是在相反的順序。這會更困難!

相關問題