2016-01-29 61 views
0

我有一個名爲test的目錄,它在日期範圍中具有子文件夾,如01,02,31。這個所有子文件夾都包含.bz2文件。我需要使用find命令搜索所有帶.bz2擴展名的文件,但不包括特定範圍的目錄。我知道find . -name ".bz2" -not -path "./01/*",但編寫-not -path "./01/*"會太可悲了,如果我想跳過10個目錄。那麼如何跳過我的find命令中的01..19子目錄?排除查找命令中的目錄範圍

回答

4

您可以使用通配符在模式的選擇-not -path

find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/* 

這將排除所有目錄開始的0或1甚至更好:

find ./ -type f -name "*.bz2" -not -path "./[01]*/*" 
+0

非常感謝。像魅力一樣工作。 +1。 – Rahul

3

首先,你可以幫助find通過使用-prune而不是-not -path - 這將避免甚至在相關目錄內查看。

要你的主要觀點 - 你可以建立你的榜樣(數字01到19)通配符:

find . -path './0[1-9]' -prune -o -path './1[0-9]' -prune -o -print 

如果你的範圍是不太方便(如05到25),你可能想建立的範圍內成一個bash變量,然後插即入find命令:

a=("-path ./"{05..25}" -prune -o") 
find . ${a[*]} -print -prune 

(你可能要echo "${a[*]}"printf '%s\n' ${a[*]},看看它是如何工作的)

2

對我來說,我發現找到命令作爲一個獨立的工具莫名其妙麻煩。因此,我總是最終使用查找的組合,僅用於遞歸文件搜索和grep以製作實際的排除/包含內容。最後,我將結果交給第三個執行操作的命令,例如rm刪除文件。

我的通用命令會是這樣的:

find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool] 
  • 根路徑是從哪裏開始搜索遞歸
  • 添加-v選項用於反轉匹配的結果。
  • cond1 - condN,匹配條件。當-v是involed時,則這是不匹配的條件。
  • 動作表現的工具,做實際工作

例如要刪除所有文件在當前目錄中匹配一些條件:

find . -not -name "\." | grep -v -E "cond1|cond2|cond3|...|condN" | xargs rm -rf 

正如你所看到的,我們在dot指定的當前目錄中搜索根路徑:然後我們要反轉匹配結果,因爲我們希望所有文件不是符合我們的條件:最後我們將所有找到的文件都傳遞給rm爲了刪除它們:我加-rf遞歸/強制刪除所有文件。我用-not -name「。」來使用find命令。排除通常由點指示的當前目錄。

對於實際工作中的問題:假設我們有git的使用和.metadata目錄的目錄,我們要排除他們在我們的搜索:

find . -not -name "\." | grep -v -E ".git|.metadata" | [action-performing-tool] 

希望幫助!