Shell-Script
find:排除 n 個不同的目錄和 m 個不同的文件存在於任何級別,但包括一些排除目錄中的少數文件
我想遞歸地查找路徑中的所有目錄和文件,但想排除與給定模式匹配的其他一些目錄和文件。然後我想對搜尋結果執行進一步的命令,可能是
cp
,或.mv``rsync``rm``find
假設我想修剪整個
node_modules
,.git
andbuild
目錄和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
,那麼您就做不到prune
。prune
意味著find
根本不下降,所以它不可能在那裡找到文件。在這裡,您不希望修剪這些文件,但排除它們下面的任何文件,但xyz.js
那些文件除外。所以:
find . \( \ -path ./node_modules -o \ -path './.git*' -o \ -path ./build \ \) -prune -o \( \ ! -path '*/enhancers' ! -path '*/enhancers/*' -o \ -name xyz.js \ \) -print
為了便於閱讀,這裡有幾行。
如果您想對這些文件執行某些操作,請替換
-exec sh -c 'for file do something with "$file"; done' sh {} +
或者,如果您想對輸出進行後處理,請使用
-print0
和使用 / / / 的/ /選項-z
(--null
假設-0
GNU實現或兼容),以便它們處理 NUL 分隔的輸入。grep``xargs``cut``sort