2016-11-04 3 views
0

Findでディレクトリ除外リストを繰り返し作成しようとしています。 テキストファイルを反復して除外パスを作成します。これはすべて動作していますが、スペースが空いているパスについては、つまずいています。スペースでパスを渡すと、Findはそれらを認識しません。コマンドパス変数を検索すると、空白が認識されません。

find_opts=(-not "(" -path "$HOME/$line" -prune ")") 
find "$HOME" "${find_opts[@]}" -name ... 

あなたは:あなたは、シェルの配列を使用しなければならない場所です

find: User": unknown primary or operator 

答えて

2

#### 
line="Documents/Microsoft User Data" 
excludehead="-not (-path " 
excludetail=" -prune)" 
excludefolder="$HOME/$line" 

### 
base_list=$(printf %s "$excludehead" "\"$excludefolder\"" "$excludetail") 
find $HOME $base_list -name "*[<>:/|?#%\\\\*]*" 

これは、その結果:スピーチの中にあることが

これが示すマークのパスにもかかわらず、配列に含まれる内容を確認できます。

$ declare -p find_opts 
declare -a find_opts='([0]="-not" [1]="(" [2]="-path" [3]="/home/jackman/Documents/Microsoft User Data" [4]="-prune" [5]=")")' 

要素#3には空白文字列が含まれています。

+0

ありがとうございます、これは私のシナリオではうまくいきます – rndy

1

コマンドラインを動的に構築するのではなく、関数を定義します。

find_with_exclude() { 
    find "$HOME" -not \(-path "$HOME/$1" -prune \) -name "*[<>:/|?#%\\\\*]*" 
} 

find_with_exclude "Documents/Microsoft User Data" 
関連する問題