Command-Line
在不包括某些子路徑的全域目錄中查找文件
考慮這個目錄(和文件)結構:
mkdir testone mkdir testtwo mkdir testone/.svn mkdir testtwo/.git touch testone/fileA touch testone/fileB touch testone/fileC touch testone/.svn/fileA1 touch testone/.svn/fileB1 touch testone/.svn/fileC1 touch testtwo/fileD touch testtwo/fileE touch testtwo/fileF touch testtwo/.git/fileD1 touch testtwo/.git/fileE1 touch testtwo/.git/fileF1
我想列印/查找這兩個目錄中的所有文件,但不包括子目錄
.git
和/或.svn
. 如果我這樣做:find test*
…然後不管怎樣,所有文件都會被轉儲。
如果我這樣做(例如,如何在萬用字元嵌入的“查找”搜尋中排除/忽略隱藏文件和目錄?):
$ find test* -path '.svn' -o -prune testone testtwo $ find test* -path '*/.svn/*' -o -prune testone testtwo
…然後我只轉儲了頂級目錄,沒有文件名。
是否可以
find
單獨使用來執行這樣的搜尋/列表,而無需管道進入grep
(即find
對所有文件執行 a,然後:find test* | grep -v '\.svn' | grep -v '\.git'
;這也會輸出我不需要的頂級目錄名稱)?
find
如果給定路徑不匹配,您的命令不會說明該怎麼做。如果要排除以點開頭的所有內容,並列印其餘部分,請嘗試:find test* -path '*/.*' -prune -o -print
所以它會修剪任何與該路徑匹配的東西,並列印任何不匹配的東西。
範例輸出:
testone testone/fileC testone/fileB testone/fileA testtwo testtwo/fileE testtwo/fileF testtwo/fileD
如果您想明確排除只是
.svn
而.git
不是其他以點開頭的事物,您可以執行以下操作:find test* \( -path '*/.svn' -o -path '*/.git' \) -prune -o -print
對於此範例,它會產生相同的輸出
如果要排除頂級目錄,可以
-mindepth 1
添加find test* -mindepth 1 -path '*/.*' -prune -o -print
這使
testone/fileC testone/fileB testone/fileA testtwo/fileE testtwo/fileF testtwo/fileD