Shell-Script

find:排除 n 個不同的目錄和 m 個不同的文件存在於任何級別,但包括一些排除目錄中的少數文件

  • December 13, 2018

我想遞歸地查找路徑中的所有目錄和文件,但想排除與給定模式匹配的其他一些目錄和文件。然後我想對搜尋結果執行進一步的命令,可能是cp,或.mv``rsync``rm``find

假設我想修剪整個node_modules, .gitandbuild目錄和enhancers目錄,但想在搜尋結果中包含一個帶有 -name 的文件,該文件在目錄xyz.js內的未知深度存在。enhancers

xyz.js使用下面的命令,除了搜尋結果中的包含文件之外,我能夠獲得所需的結果。命令很長。

find . -path "./node_modules" -prune -o -path "./.git*" -prune -o -path "./build" -prune -o -path "*/enhancers" -prune -o -print | grep 'xyz.js'

--root
 |--node_modules
 |--public
 |--build
 |--.git
 |--.gitignore
 |--.env
 |--package.json
 |--src
   |--history
   |--store
     |--middleware
       |..
       |..
         |--enhancers
           |..
             |--xyz.js

在上面的示意目錄結構中,|..代表目錄內的未知深度(級別)。

在顯示的目錄結構中,我想在搜尋結果中包含所有文件,除了,

  • 整個node_modules目錄
  • 整個.git目錄
  • .gitignore文件
  • 整個enhancers目錄,但xyz.js在搜尋結果中包含文件

有更短的方法嗎?正則表達式和全域模式之間的主要混淆。

如果我用 替換./.git*./\.git*那麼它也可以工作。

*如果我在 中使用多個*/enhancers,那麼它也可以工作。

搜尋文件和目錄的模式規則適用於find命令?

如果您希望能夠在其中找到任何文件enhancers,那麼您就做不到pruneprune意味著find根本不下降,所以它不可能在那裡找到文件。在這裡,您不希望修剪這些文件,但排除它們下面的任何文件,但xyz.js那些文件除外。

所以:

find . \( \
         -path ./node_modules -o \
         -path './.git*' -o \
         -path ./build \
      \) -prune -o \( \
         ! -path '*/enhancers' ! -path '*/enhancers/*' -o \
         -name xyz.js \
      \) -print

為了便於閱讀,這裡有幾行。

如果您想對這些文件執行某些操作,請替換-print為。-exec sh -c 'for file do something with "$file"; done' sh {} +

或者,如果您想對輸出進行後處理,請使用-print0和使用 / / / 的/ /選項-z--null假設-0GNU實現或兼容),以便它們處理 NUL 分隔的輸入。grep``xargs``cut``sort

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