2015-04-15 31 views
2

我有一個是尋找一些文件的一個shell腳本,它工作正常:排除未知數量從查找搜索多個目錄(UNIX)

find . -name "*.sh" 

但在這裏,我們去:我要排除一些(讓我們來說說3 - dir1,dir2和dir3)目錄。所以我尋找方法來做到這一點,但我只找到「靜態」的解決方案。這意味着我找到了很多解決方案來解釋如何從查找搜索中排除3個目錄。但不能確定要排除的目錄數量 - 也許我需要排除3,也許5或甚至20.我想從輸入文件中讀取目錄作爲字符串(到目前爲止我已經有了讀取邏輯)和想要使用find動態地排除這些文件。

爲了澄清這一點:我有這樣一個字符串:'/home/dir1,/dir2,./dir3,./sub/dir4',我不知道這個字符串將包含多少個目錄,但是我想排除所有這些。

是否有使用REGEX參數或其他方法的解決方案?我目前正在研究SUN solaris,並使用sh-Shell。

每個幫助/提示將不勝感激,謝謝!

回答

2

您可以使用-prune來排除路徑,直到剩下只有您想要的路徑。

find . -iregex '.*/.git/.*' -prune -o -type d -name 'CVS' -prune -o ... whatever -print 

我使用不同的謂詞來證明你有充分的支持,通過支持find謂詞。如果這些,-iregex應用一個正則表達式對整個路徑名不區分大小寫; -type d -name CVS匹配其名稱正好是CVS等的目錄。顯然,更多地參見the manual。添加儘可能多的你喜歡或需要爲了解決你的問題。

我不確定你是什麼意思的「動態」,但如果我猜測你的意思是什麼,它沒有得到更多的動態比擁有一個命令行選擇根據一組規則排除哪些目錄。如果要排除第四個字符爲W的目錄,請添加-o -name '???W*' -prune。如果您有更多條件,請添加更多條件。

在光譜的另一端,您可以通過枚舉要排除的目錄來創建完全靜態的命令。你也許可以創建一個腳本,爲您創建的最終find命令行,像

printf '%\n' one/directory path/to/another hey/yes/one/more etc/and/so/forth | 
sed "s%.*%-type d -path '&' -prune -o %" | 
xargs -i find . {} print 
+0

嗨,謝謝你的快速回答!我讀了關於-prune選項,但是如果我不知道需要排除多少個目錄,我該如何使用它?這將是一個很好的解決方案,但我認爲我無法動態構建此命令,具體取決於我需要排除多少個目錄。 – Pat

+0

@Pat我回答瞭如何使用'!動態忽略dirs! -path'選項,如果這對你不起作用,但'-prune'確實可以,那麼將兩個答案結合起來。我在哪裏插入'! -path'你應該簡單地插入'-prune -o -type d -name'。 – ShellFish

+0

更新了答案,希望能覆蓋更多的基地。 – tripleee

0

排除從文件迪爾斯

單從文件創建find命令:

exclude=' ! -path "./'$(paste -s -d'#' dirstoexclude | sed 's/#/\/\*" ! -path "\.\//g')'/*"' 
find . -type f ${exclude} 

將您的dirs存儲在dirsttoexclude中,無需領先./並尾隨/*,它們將被添加。用法示例:

$ mkdir test && cd test 
$ mkdir test1 test2 test3 
$ touch test1/a test2/b test3/c 
$ find -type f 
./test2/b 
./test1/a 
./test3/c 
$ cat exclude\ dirs 
test1 
test2 
$ exclude=' ! -path "./'$(paste -s -d'#' "exclude dirs" | sed 's/#/\/\*" ! -path "\.\//g')'/*"' 
$ find . -type f $exclude 
./test3/c 

您可以將它封裝在shell腳本中,當文件中只有一個目錄時它也應該可以工作。

注意:爲此工作,文件名中不能有#,如果發生這種情況,請使用另一個分隔字符。=

編輯:由於您的逗號分隔字符串中的dirs,解決方案更加簡單。只需使用bash代替這個:

exclude=' ! -path "./'${string//,/\/*\" ! -path \"./}'/*"' 

使用正則表達式

你一個也使用正則表達式中find,因此,所有你需要做的是檢查是否存在一個正則表達式可以匹配你的需求(這很可能)。你這樣使用它:

find -regextype sed -regex '.*some *regex.*'