簡體   English   中英

在 find 命令中排除目錄范圍

[英]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命令作為一個獨立的工具有點麻煩。 因此,我總是最終使用僅用於遞歸文件搜索的findgrep 的組合來制作實際的排除/包含內容。 最后,我將結果交給第三個命令,該命令將執行操作,例如rm刪除文件。

我的通用命令看起來像這樣:

find [root-path] | grep (-v)? -E "cond1|cond2|...|condN" | [action-performing-tool] 
  • root-path 是遞歸開始搜索的地方
  • add -v選項用於反轉匹配結果。
  • cond1 - condN,匹配條件。 當涉及 -v 時,這是匹配的條件。
  • 行動執行工具執行實際工作

例如,您要刪除當前目錄中符合某些條件的所有文件:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM