[英]Exclude range of directories in find command
我有名為test
目錄,它在日期范圍內具有子文件夾,例如01
, 02
,... 31
。 這所有子文件夾中都包含 .bz2 文件。 我需要使用 find 命令搜索所有擴展名為 .bz2 的文件,但不包括特定范圍的目錄。 我知道find . -name ".bz2" -not -path "./01/*"
find . -name ".bz2" -not -path "./01/*"
,但如果我想跳過 10 個目錄,寫-not -path "./01/*"
會很可悲。 那么我如何在我的find
命令中跳過01..19
子目錄?
您可以在模式中為選項-not -path
使用通配符:
find ./ -type f -name "*.bz2" -not -path "./0*/*" -not -path "./1*/*
這將排除所有以 0 或 1 開頭的目錄。或者甚至更好:
find ./ -type f -name "*.bz2" -not -path "./[01]*/*"
首先,您可以使用-prune
而不是-not -path
來幫助find
- 這甚至可以避免查看相關目錄。
對於您的主要觀點 - 您可以為您的示例構建一個通配符(數字 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[*]}
來看看它是如何工作的)
對我來說,我發現find命令作為一個獨立的工具有點麻煩。 因此,我總是最終使用僅用於遞歸文件搜索的find和grep 的組合來制作實際的排除/包含內容。 最后,我將結果交給第三個命令,該命令將執行操作,例如rm刪除文件。
我的通用命令看起來像這樣:
find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool]
例如,您要刪除當前目錄中不符合某些條件的所有文件:
find . -not -name "\." | grep -v -E "cond1|cond2|cond3|...|condN" | xargs rm -rf
如您所見,我們在點號指示的當前目錄中搜索作為根路徑:然后我們想反轉匹配結果,因為我們希望所有文件不符合我們的條件:最后我們將找到的所有文件傳遞給rm為了刪除它們:我添加 -rf 來遞歸/強制刪除所有文件。 我使用了帶有-not -name "."的 find 命令。 排除通常由點指示的當前目錄。
對於實際問題:假設我們有一個使用 .git 和 .metadata 目錄的目錄,我們想在搜索中排除它們:
find . -not -name "\." | grep -v -E ".git|.metadata" | [action-performing-tool]
希望有幫助!
如果您想排除父目錄下的子目錄,那么這可能很有用:
例如-您有父目錄“ParentDir”,它有兩個子目錄“Child1, Child2”。 您只想從“Chiled2”讀取文件並跳過“Child1”。 那么這會有所幫助。
find ./ParentDir ! -path "./ParentDir/Child1*" -name *.<extention>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.