Bash

查找排除文件中列出的路徑的命令

  • September 14, 2018

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針對排除目錄中的所有內容測試模式,而不管您不是對這些路徑下的任何東西感興趣。

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