Bash
查找排除文件中列出的路徑的命令
find
我需要從命令中排除一堆路徑。例如:find "$(pwd)" -not \( \ -path "*/.git"\ -o -path "*/.git/*"\ -o -path "*/.vscode"\ -o -path "*/.vscode/*"\ -o -path "*/node_modules"\ -o -path "*/node_modules/*"\ -o -path "*/Image"\ -o -path "*/Image/*"\ -o -path "*/Rendered"\ -o -path "*/Rendered/*"\ -o -path "*/iNotebook"\ -o -path "*/iNotebook/*"\ -o -path "*/GeneratedTest"\ -o -path "*/GeneratedTest/*"\ -o -path "*/GeneratedOutput"\ -o -path "*/GeneratedOutput/*"\ -o -path "*/*_files" \) -type d
但是,我想從文本文件中讀取這些路徑,而不是在命令行中將它們全部列出。我怎樣才能做到這一點?
構造一個數組,稍後在呼叫
find
. 以下腳本從其標準輸入讀取換行符分隔的路徑模式並呼叫find
:#!/bin/sh set -- while IFS= read -r path; do set -- "$@" -o -path "$path" done shift # remove initial "-o" from $@ find . -type d ! '(' "$@" ')'
你會執行這個
./script.sh <paths.txt
paths.txt
可能看起來像哪裡*/.git */.git/* */.vscode */.vscode/* */node_modules */node_modules/* */Image */Image/* */Rendered */Rendered/* */iNotebook */iNotebook/* */GeneratedTest */GeneratedTest/* */GeneratedOutput */GeneratedOutput/* */*_files
或者,由於您的路徑模式基本上都是目錄名稱:
#!/bin/sh set -- while IFS= read -r dirname; do set -- "$@" -o '(' -name "$dirname" -prune ')' done shift # remove initial "-o" from $@ find . -type d ! '(' "$@" ')'
模式文件包含
.git .vscode node_modules Image Rendered iNotebook GeneratedTest GeneratedOutput *_files
程式碼的這種變體
find
甚至不會下降到與文件中的模式匹配的目錄中,而第一個腳本(以及您的程式碼)將-path
針對排除目錄中的所有內容測試模式,而不管您不是對這些路徑下的任何東西感興趣。