Command-Line

在不包括某些子路徑的全域目錄中查找文件

  • September 11, 2020

考慮這個目錄(和文件)結構:

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

引用自:https://unix.stackexchange.com/questions/325423